From 22428eeec0302b3e10b6b382bef9dd76a2cb5317 Mon Sep 17 00:00:00 2001 From: Holger Brunn Date: Tue, 4 Aug 2015 17:50:21 +0200 Subject: [PATCH 01/13] [ADD] account_reconcile_payment_order --- account_reconcile_payment_order/README.rst | 51 ++++++++++++ account_reconcile_payment_order/__init__.py | 20 +++++ .../__openerp__.py | 33 ++++++++ .../models/__init__.py | 20 +++++ .../models/account_bank_statement_line.py | 73 ++++++++++++++++++ .../static/description/icon.png | Bin 0 -> 9455 bytes 6 files changed, 197 insertions(+) create mode 100644 account_reconcile_payment_order/README.rst create mode 100644 account_reconcile_payment_order/__init__.py create mode 100644 account_reconcile_payment_order/__openerp__.py create mode 100644 account_reconcile_payment_order/models/__init__.py create mode 100644 account_reconcile_payment_order/models/account_bank_statement_line.py create mode 100644 account_reconcile_payment_order/static/description/icon.png diff --git a/account_reconcile_payment_order/README.rst b/account_reconcile_payment_order/README.rst new file mode 100644 index 00000000..9ce5ae5f --- /dev/null +++ b/account_reconcile_payment_order/README.rst @@ -0,0 +1,51 @@ +.. image:: https://img.shields.io/badge/licence-AGPL--3-blue.svg + :alt: License: AGPL-3 +Reconcile payment orders +======================== + +Payment orders that show up as as one big transaction can be difficult for the accounting to handle if a transfer acount is used. In this case, we need to reconcile this transaction with possibly hunderds of move lines, which can be a bit tiresome. This module tries to recognize transactions deriving from payment orders and propose the unreconciled move lines from this payment order. + +Usage +===== + +It should just work. What the module does is to search for a payment order in state 'sent' that has the same amount as the statement line, and the same bank account than the statement. + +For further information, please visit: + +* https://www.odoo.com/forum/help-1 + +Known issues / Roadmap +====================== + +* it would be good to check references too, but at least the bank in use here changes some characters, so this doesn't seem to be a general solution. + +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 +`here `_. + +Credits +======= + +Contributors +------------ + +* Holger Brunn + +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 http://odoo-community.org. diff --git a/account_reconcile_payment_order/__init__.py b/account_reconcile_payment_order/__init__.py new file mode 100644 index 00000000..cdb7d736 --- /dev/null +++ b/account_reconcile_payment_order/__init__.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# This module copyright (C) 2015 Therp BV . +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## +from . import models diff --git a/account_reconcile_payment_order/__openerp__.py b/account_reconcile_payment_order/__openerp__.py new file mode 100644 index 00000000..3b45c14e --- /dev/null +++ b/account_reconcile_payment_order/__openerp__.py @@ -0,0 +1,33 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# This module copyright (C) 2015 Therp BV . +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## +{ + "name": "Reconcile payment orders", + "version": "1.0", + "author": "Therp BV,Odoo Community Association (OCA)", + "license": "AGPL-3", + "category": "Accounting & Finance", + "summary": "Automatically reconcile all lines from sent payment orders", + "depends": [ + 'account_banking_payment_transfer', + ], + "auto_install": False, + "installable": True, + "application": False, +} diff --git a/account_reconcile_payment_order/models/__init__.py b/account_reconcile_payment_order/models/__init__.py new file mode 100644 index 00000000..33afdc17 --- /dev/null +++ b/account_reconcile_payment_order/models/__init__.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# This module copyright (C) 2015 Therp BV . +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## +from . import account_bank_statement_line diff --git a/account_reconcile_payment_order/models/account_bank_statement_line.py b/account_reconcile_payment_order/models/account_bank_statement_line.py new file mode 100644 index 00000000..759f3aee --- /dev/null +++ b/account_reconcile_payment_order/models/account_bank_statement_line.py @@ -0,0 +1,73 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# This module copyright (C) 2015 Therp BV (). +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## +from decimal import Decimal +from openerp import models, api +from openerp.tools.float_utils import float_repr + + +class AccountBankStatementLine(models.Model): + _inherit = 'account.bank.statement.line' + + @api.model + def get_possible_payment_orders_for_statement_line(self, this): + """find orders that might be candidates for matching a statement + line""" + digits = self.env['decimal.precision'].precision_get('Account') + self.env.cr.execute( + '''with order_sums as ( + select order_id, sum(amount_currency) as amount + from payment_line + join payment_order o on o.id=order_id + where o.state = 'sent' + group by order_id) + select order_id from order_sums where amount = %s''', + (Decimal(float_repr(abs(this.amount), digits)),)) + order_ids = [i for i, in self.env.cr.fetchall()] + # verify that this ids are accessible to the user and from the + # right bank account if applicable + domain = [ + ('id', 'in', order_ids), + ] + if this.bank_account_id.acc_number: + domain.append( + ('mode.bank_id.acc_number', '=', + this.bank_account_id.acc_number)) + return self.env['payment.order'].search(domain) + + @api.model + def get_reconcile_lines_from_order(self, this, orders, excluded_ids=None): + """return lines to reconcile our statement line with""" + order = orders[0] + return self.env['account.move.line']\ + .prepare_move_lines_for_reconciliation_widget( + list(set(order._get_transfer_move_lines()))) + + @api.model + def get_reconciliation_proposition(self, this, excluded_ids=None): + """See if we find a set payment order that matches our line. If yes, + return all unreconciled lines from there""" + orders = self.get_possible_payment_orders_for_statement_line(this) + if orders: + reconcile_lines = self.get_reconcile_lines_from_order( + this, orders, excluded_ids=None) + if reconcile_lines: + return reconcile_lines + return super(AccountBankStatementLine, self)\ + .get_reconciliation_proposition(this, excluded_ids=excluded_ids) diff --git a/account_reconcile_payment_order/static/description/icon.png b/account_reconcile_payment_order/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3a0328b516c4980e8e44cdb63fd945757ddd132d GIT binary patch literal 9455 zcmW++2RxMjAAjx~&dlBk9S+%}OXg)AGE&Cb*&}d0jUxM@u(PQx^-s)697TX`ehR4?GS^qbkof1cslKgkU)h65qZ9Oc=ml_0temigYLJfnz{IDzUf>bGs4N!v3=Z3jMq&A#7%rM5eQ#dc?k~! zVpnB`o+K7|Al`Q_U;eD$B zfJtP*jH`siUq~{KE)`jP2|#TUEFGRryE2`i0**z#*^6~AI|YzIWy$Cu#CSLW3q=GA z6`?GZymC;dCPk~rBS%eCb`5OLr;RUZ;D`}um=H)BfVIq%7VhiMr)_#G0N#zrNH|__ zc+blN2UAB0=617@>_u;MPHN;P;N#YoE=)R#i$k_`UAA>WWCcEVMh~L_ zj--gtp&|K1#58Yz*AHCTMziU1Jzt_jG0I@qAOHsk$2}yTmVkBp_eHuY$A9)>P6o~I z%aQ?!(GqeQ-Y+b0I(m9pwgi(IIZZzsbMv+9w{PFtd_<_(LA~0H(xz{=FhLB@(1&qHA5EJw1>>=%q2f&^X>IQ{!GJ4e9U z&KlB)z(84HmNgm2hg2C0>WM{E(DdPr+EeU_N@57;PC2&DmGFW_9kP&%?X4}+xWi)( z;)z%wI5>D4a*5XwD)P--sPkoY(a~WBw;E~AW`Yue4kFa^LM3X`8x|}ZUeMnqr}>kH zG%WWW>3ml$Yez?i%)2pbKPI7?5o?hydokgQyZsNEr{a|mLdt;X2TX(#B1j35xPnPW z*bMSSOauW>o;*=kO8ojw91VX!qoOQb)zHJ!odWB}d+*K?#sY_jqPdg{Sm2HdYzdEx zOGVPhVRTGPtv0o}RfVP;Nd(|CB)I;*t&QO8h zFfekr30S!-LHmV_Su-W+rEwYXJ^;6&3|L$mMC8*bQptyOo9;>Qb9Q9`ySe3%V$A*9 zeKEe+b0{#KWGp$F+tga)0RtI)nhMa-K@JS}2krK~n8vJ=Ngm?R!9G<~RyuU0d?nz# z-5EK$o(!F?hmX*2Yt6+coY`6jGbb7tF#6nHA zuKk=GGJ;ZwON1iAfG$E#Y7MnZVmrY|j0eVI(DN_MNFJmyZ|;w4tf@=CCDZ#5N_0K= z$;R~bbk?}TpfDjfB&aiQ$VA}s?P}xPERJG{kxk5~R`iRS(SK5d+Xs9swCozZISbnS zk!)I0>t=A<-^z(cmSFz3=jZ23u13X><0b)P)^1T_))Kr`e!-pb#q&J*Q`p+B6la%C zuVl&0duN<;uOsB3%T9Fp8t{ED108<+W(nOZd?gDnfNBC3>M8WE61$So|P zVvqH0SNtDTcsUdzaMDpT=Ty0pDHHNL@Z0w$Y`XO z2M-_r1S+GaH%pz#Uy0*w$Vdl=X=rQXEzO}d6J^R6zjM1u&c9vYLvLp?W7w(?np9x1 zE_0JSAJCPB%i7p*Wvg)pn5T`8k3-uR?*NT|J`eS#_#54p>!p(mLDvmc-3o0mX*mp_ zN*AeS<>#^-{S%W<*mz^!X$w_2dHWpcJ6^j64qFBft-o}o_Vx80o0>}Du;>kLts;$8 zC`7q$QI(dKYG`Wa8#wl@V4jVWBRGQ@1dr-hstpQL)Tl+aqVpGpbSfN>5i&QMXfiZ> zaA?T1VGe?rpQ@;+pkrVdd{klI&jVS@I5_iz!=UMpTsa~mBga?1r}aRBm1WS;TT*s0f0lY=JBl66Upy)-k4J}lh=P^8(SXk~0xW=T9v*B|gzIhN z>qsO7dFd~mgxAy4V?&)=5ieYq?zi?ZEoj)&2o)RLy=@hbCRcfT5jigwtQGE{L*8<@Yd{zg;CsL5mvzfDY}P-wos_6PfprFVaeqNE%h zKZhLtcQld;ZD+>=nqN~>GvROfueSzJD&BE*}XfU|H&(FssBqY=hPCt`d zH?@s2>I(|;fcW&YM6#V#!kUIP8$Nkdh0A(bEVj``-AAyYgwY~jB zT|I7Bf@%;7aL7Wf4dZ%VqF$eiaC38OV6oy3Z#TER2G+fOCd9Iaoy6aLYbPTN{XRPz z;U!V|vBf%H!}52L2gH_+j;`bTcQRXB+y9onc^wLm5wi3-Be}U>k_u>2Eg$=k!(l@I zcCg+flakT2Nej3i0yn+g+}%NYb?ta;R?(g5SnwsQ49U8Wng8d|{B+lyRcEDvR3+`O{zfmrmvFrL6acVP%yG98X zo&+VBg@px@i)%o?dG(`T;n*$S5*rnyiR#=wW}}GsAcfyQpE|>a{=$Hjg=-*_K;UtD z#z-)AXwSRY?OPefw^iI+ z)AXz#PfEjlwTes|_{sB?4(O@fg0AJ^g8gP}ex9Ucf*@_^J(s_5jJV}c)s$`Myn|Kd z$6>}#q^n{4vN@+Os$m7KV+`}c%4)4pv@06af4-x5#wj!KKb%caK{A&Y#Rfs z-po?Dcb1({W=6FKIUirH&(yg=*6aLCekcKwyfK^JN5{wcA3nhO(o}SK#!CINhI`-I z1)6&n7O&ZmyFMuNwvEic#IiOAwNkR=u5it{B9n2sAJV5pNhar=j5`*N!Na;c7g!l$ z3aYBqUkqqTJ=Re-;)s!EOeij=7SQZ3Hq}ZRds%IM*PtM$wV z@;rlc*NRK7i3y5BETSKuumEN`Xu_8GP1Ri=OKQ$@I^ko8>H6)4rjiG5{VBM>B|%`&&s^)jS|-_95&yc=GqjNo{zFkw%%HHhS~e=s zD#sfS+-?*t|J!+ozP6KvtOl!R)@@-z24}`9{QaVLD^9VCSR2b`b!KC#o;Ki<+wXB6 zx3&O0LOWcg4&rv4QG0)4yb}7BFSEg~=IR5#ZRj8kg}dS7_V&^%#Do==#`u zpy6{ox?jWuR(;pg+f@mT>#HGWHAJRRDDDv~@(IDw&R>9643kK#HN`!1vBJHnC+RM&yIh8{gG2q zA%e*U3|N0XSRa~oX-3EAneep)@{h2vvd3Xvy$7og(sayr@95+e6~Xvi1tUqnIxoIH zVWo*OwYElb#uyW{Imam6f2rGbjR!Y3`#gPqkv57dB6K^wRGxc9B(t|aYDGS=m$&S!NmCtrMMaUg(c zc2qC=2Z`EEFMW-me5B)24AqF*bV5Dr-M5ig(l-WPS%CgaPzs6p_gnCIvTJ=Y<6!gT zVt@AfYCzjjsMEGi=rDQHo0yc;HqoRNnNFeWZgcm?f;cp(6CNylj36DoL(?TS7eU#+ z7&mfr#y))+CJOXQKUMZ7QIdS9@#-}7y2K1{8)cCt0~-X0O!O?Qx#E4Og+;A2SjalQ zs7r?qn0H044=sDN$SRG$arw~n=+T_DNdSrarmu)V6@|?1-ZB#hRn`uilTGPJ@fqEy zGt(f0B+^JDP&f=r{#Y_wi#AVDf-y!RIXU^0jXsFpf>=Ji*TeqSY!H~AMbJdCGLhC) zn7Rx+sXw6uYj;WRYrLd^5IZq@6JI1C^YkgnedZEYy<&4(z%Q$5yv#Boo{AH8n$a zhb4Y3PWdr269&?V%uI$xMcUrMzl=;w<_nm*qr=c3Rl@i5wWB;e-`t7D&c-mcQl7x! zZWB`UGcw=Y2=}~wzrfLx=uet<;m3~=8I~ZRuzvMQUQdr+yTV|ATf1Uuomr__nDf=X zZ3WYJtHp_ri(}SQAPjv+Y+0=fH4krOP@S&=zZ-t1jW1o@}z;xk8 z(Nz1co&El^HK^NrhVHa-_;&88vTU>_J33=%{if;BEY*J#1n59=07jrGQ#IP>@u#3A z;!q+E1Rj3ZJ+!4bq9F8PXJ@yMgZL;>&gYA0%_Kbi8?S=XGM~dnQZQ!yBSgcZhY96H zrWnU;k)qy`rX&&xlDyA%(a1Hhi5CWkmg(`Gb%m(HKi-7Z!LKGRP_B8@`7&hdDy5n= z`OIxqxiVfX@OX1p(mQu>0Ai*v_cTMiw4qRt3~NBvr9oBy0)r>w3p~V0SCm=An6@3n)>@z!|o-$HvDK z|3D2ZMJkLE5loMKl6R^ez@Zz%S$&mbeoqH5`Bb){Ei21q&VP)hWS2tjShfFtGE+$z zzCR$P#uktu+#!w)cX!lWN1XU%K-r=s{|j?)Akf@q#3b#{6cZCuJ~gCxuMXRmI$nGtnH+-h z+GEi!*X=AP<|fG`1>MBdTb?28JYc=fGvAi2I<$B(rs$;eoJCyR6_bc~p!XR@O-+sD z=eH`-ye})I5ic1eL~TDmtfJ|8`0VJ*Yr=hNCd)G1p2MMz4C3^Mj?7;!w|Ly%JqmuW zlIEW^Ft%z?*|fpXda>Jr^1noFZEwFgVV%|*XhH@acv8rdGxeEX{M$(vG{Zw+x(ei@ zmfXb22}8-?Fi`vo-YVrTH*C?a8%M=Hv9MqVH7H^J$KsD?>!SFZ;ZsvnHr_gn=7acz z#W?0eCdVhVMWN12VV^$>WlQ?f;P^{(&pYTops|btm6aj>_Uz+hqpGwB)vWp0Cf5y< zft8-je~nn?W11plq}N)4A{l8I7$!ks_x$PXW-2XaRFswX_BnF{R#6YIwMhAgd5F9X zGmwdadS6(a^fjHtXg8=l?Rc0Sm%hk6E9!5cLVloEy4eh(=FwgP`)~I^5~pBEWo+F6 zSf2ncyMurJN91#cJTy_u8Y}@%!bq1RkGC~-bV@SXRd4F{R-*V`bS+6;W5vZ(&+I<9$;-V|eNfLa5n-6% z2(}&uGRF;p92eS*sE*oR$@pexaqr*meB)VhmIg@h{uzkk$9~qh#cHhw#>O%)b@+(| z^IQgqzuj~Sk(J;swEM-3TrJAPCq9k^^^`q{IItKBRXYe}e0Tdr=Huf7da3$l4PdpwWDop%^}n;dD#K4s#DYA8SHZ z&1!riV4W4R7R#C))JH1~axJ)RYnM$$lIR%6fIVA@zV{XVyx}C+a-Dt8Y9M)^KU0+H zR4IUb2CJ{Hg>CuaXtD50jB(_Tcx=Z$^WYu2u5kubqmwp%drJ6 z?Fo40g!Qd<-l=TQxqHEOuPX0;^z7iX?Ke^a%XT<13TA^5`4Xcw6D@Ur&VT&CUe0d} z1GjOVF1^L@>O)l@?bD~$wzgf(nxX1OGD8fEV?TdJcZc2KoUe|oP1#=$$7ee|xbY)A zDZq+cuTpc(fFdj^=!;{k03C69lMQ(|>uhRfRu%+!k&YOi-3|1QKB z z?n?eq1XP>p-IM$Z^C;2L3itnbJZAip*Zo0aw2bs8@(s^~*8T9go!%dHcAz2lM;`yp zD=7&xjFV$S&5uDaiScyD?B-i1ze`+CoRtz`Wn+Zl&#s4&}MO{@N!ufrzjG$B79)Y2d3tBk&)TxUTw@QS0TEL_?njX|@vq?Uz(nBFK5Pq7*xj#u*R&i|?7+6# z+|r_n#SW&LXhtheZdah{ZVoqwyT{D>MC3nkFF#N)xLi{p7J1jXlmVeb;cP5?e(=f# zuT7fvjSbjS781v?7{)-X3*?>tq?)Yd)~|1{BDS(pqC zC}~H#WXlkUW*H5CDOo<)#x7%RY)A;ShGhI5s*#cRDA8YgqG(HeKDx+#(ZQ?386dv! zlXCO)w91~Vw4AmOcATuV653fa9R$fyK8ul%rG z-wfS zihugoZyr38Im?Zuh6@RcF~t1anQu7>#lPpb#}4cOA!EM11`%f*07RqOVkmX{p~KJ9 z^zP;K#|)$`^Rb{rnHGH{~>1(fawV0*Z#)}M`m8-?ZJV<+e}s9wE# z)l&az?w^5{)`S(%MRzxdNqrs1n*-=jS^_jqE*5XDrA0+VE`5^*p3CuM<&dZEeCjoz zR;uu_H9ZPZV|fQq`Cyw4nscrVwi!fE6ciMmX$!_hN7uF;jjKG)d2@aC4ropY)8etW=xJvni)8eHi`H$%#zn^WJ5NLc-rqk|u&&4Z6fD_m&JfSI1Bvb?b<*n&sfl0^t z=HnmRl`XrFvMKB%9}>PaA`m-fK6a0(8=qPkWS5bb4=v?XcWi&hRY?O5HdulRi4?fN zlsJ*N-0Qw+Yic@s0(2uy%F@ib;GjXt01Fmx5XbRo6+n|pP(&nodMoap^z{~q ziEeaUT@Mxe3vJSfI6?uLND(CNr=#^W<1b}jzW58bIfyWTDle$mmS(|x-0|2UlX+9k zQ^EX7Nw}?EzVoBfT(-LT|=9N@^hcn-_p&sqG z&*oVs2JSU+N4ZD`FhCAWaS;>|wH2G*Id|?pa#@>tyxX`+4HyIArWDvVrX)2WAOQff z0qyHu&-S@i^MS-+j--!pr4fPBj~_8({~e1bfcl0wI1kaoN>mJL6KUPQm5N7lB(ui1 zE-o%kq)&djzWJ}ob<-GfDlkB;F31j-VHKvQUGQ3sp`CwyGJk_i!y^sD0fqC@$9|jO zOqN!r!8-p==F@ZVP=U$qSpY(gQ0)59P1&t@y?5rvg<}E+GB}26NYPp4f2YFQrQtot5mn3wu_qprZ=>Ig-$ zbW26Ws~IgY>}^5w`vTB(G`PTZaDiGBo5o(tp)qli|NeV( z@H_=R8V39rt5J5YB2Ky?4eJJ#b`_iBe2ot~6%7mLt5t8Vwi^Jy7|jWXqa3amOIoRb zOr}WVFP--DsS`1WpN%~)t3R!arKF^Q$e12KEqU36AWwnCBICpH4XCsfnyrHr>$I$4 z!DpKX$OKLWarN7nv@!uIA+~RNO)l$$w}p(;b>mx8pwYvu;dD_unryX_NhT8*Tj>BTrTTL&!?O+%Rv;b?B??gSzdp?6Uug9{ zd@V08Z$BdI?fpoCS$)t4mg4rT8Q_I}h`0d-vYZ^|dOB*Q^S|xqTV*vIg?@fVFSmMpaw0qtTRbx} z({Pg?#{2`sc9)M5N$*N|4;^t$+QP?#mov zGVC@I*lBVrOU-%2y!7%)fAKjpEFsgQc4{amtiHb95KQEwvf<(3T<9-Zm$xIew#P22 zc2Ix|App^>v6(3L_MCU0d3W##AB0M~3D00EWoKZqsJYT(#@w$Y_H7G22M~ApVFTRHMI_3be)Lkn#0F*V8Pq zc}`Cjy$bE;FJ6H7p=0y#R>`}-m4(0F>%@P|?7fx{=R^uFdISRnZ2W_xQhD{YuR3t< z{6yxu=4~JkeA;|(J6_nv#>Nvs&FuLA&PW^he@t(UwFFE8)|a!R{`E`K`i^ZnyE4$k z;(749Ix|oi$c3QbEJ3b~D_kQsPz~fIUKym($a_7dJ?o+40*OLl^{=&oq$<#Q(yyrp z{J-FAniyAw9tPbe&IhQ|a`DqFTVQGQ&Gq3!C2==4x{6EJwiPZ8zub-iXoUtkJiG{} zPaR&}_fn8_z~(=;5lD-aPWD3z8PZS@AaUiomF!G8I}Mf>e~0g#BelA-5#`cj;O5>N Xviia!U7SGha1wx#SCgwmn*{w2TRX*I literal 0 HcmV?d00001 From 673d8b0de613d9905706fb13f8fcfe7ff68b2817 Mon Sep 17 00:00:00 2001 From: "Pedro M. Baeza" Date: Wed, 19 Aug 2015 02:26:12 +0200 Subject: [PATCH 02/13] [FIX+IMP] account_reconcile_payment_order: Take into account payment orders "non transferred" + Improvements in README+manifest --- account_reconcile_payment_order/README.rst | 33 +++++++++++++++---- .../__openerp__.py | 8 +++-- .../i18n/account_reconcile_payment_order.pot | 20 +++++++++++ account_reconcile_payment_order/i18n/de.po | 24 ++++++++++++++ account_reconcile_payment_order/i18n/fr.po | 24 ++++++++++++++ account_reconcile_payment_order/i18n/it.po | 24 ++++++++++++++ account_reconcile_payment_order/i18n/nl_NL.po | 24 ++++++++++++++ account_reconcile_payment_order/i18n/sl.po | 25 ++++++++++++++ .../models/account_bank_statement_line.py | 11 +++++-- 9 files changed, 180 insertions(+), 13 deletions(-) create mode 100644 account_reconcile_payment_order/i18n/account_reconcile_payment_order.pot create mode 100644 account_reconcile_payment_order/i18n/de.po create mode 100644 account_reconcile_payment_order/i18n/fr.po create mode 100644 account_reconcile_payment_order/i18n/it.po create mode 100644 account_reconcile_payment_order/i18n/nl_NL.po create mode 100644 account_reconcile_payment_order/i18n/sl.po diff --git a/account_reconcile_payment_order/README.rst b/account_reconcile_payment_order/README.rst index 9ce5ae5f..d16c8eae 100644 --- a/account_reconcile_payment_order/README.rst +++ b/account_reconcile_payment_order/README.rst @@ -1,23 +1,41 @@ .. image:: https://img.shields.io/badge/licence-AGPL--3-blue.svg - :alt: License: AGPL-3 + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 + +======================== Reconcile payment orders ======================== -Payment orders that show up as as one big transaction can be difficult for the accounting to handle if a transfer acount is used. In this case, we need to reconcile this transaction with possibly hunderds of move lines, which can be a bit tiresome. This module tries to recognize transactions deriving from payment orders and propose the unreconciled move lines from this payment order. +Payment orders that show up as one big transaction can be difficult for the +accounting to handle if a transfer account is used. In this case, we need to +reconcile this transaction with possibly hundreds of move lines, which can be a +bit tiresome. This module tries to recognize transactions deriving from payment +orders and propose the unreconciled move lines from this payment order. + +Installation +============ + +This module requires the module **account_banking_payment_transfer**, available +in https://github.com/OCA/bank-payment. Usage ===== -It should just work. What the module does is to search for a payment order in state 'sent' that has the same amount as the statement line, and the same bank account than the statement. +It should just work. What the module does is to search for a payment order in +state 'sent' (for orders transferred to an intermediate account) or done (for +orders non transferred) that has the same amount as the statement line, and the +same bank account than the statement. If any, all move lines are automatically +proposed for the reconcile. -For further information, please visit: - -* https://www.odoo.com/forum/help-1 +.. image:: https://odoo-community.org/website/image/ir.attachment/5784_f2813bd/datas + :alt: Try me on Runbot + :target: https://runbot.odoo-community.org/runbot/98/8.0 Known issues / Roadmap ====================== -* it would be good to check references too, but at least the bank in use here changes some characters, so this doesn't seem to be a general solution. +* it would be good to check references too, but at least the bank in use here + changes some characters, so this doesn't seem to be a general solution. Bug Tracker =========== @@ -34,6 +52,7 @@ Contributors ------------ * Holger Brunn +* Pedro M. Baeza Maintainer ---------- diff --git a/account_reconcile_payment_order/__openerp__.py b/account_reconcile_payment_order/__openerp__.py index 3b45c14e..84e2a80d 100644 --- a/account_reconcile_payment_order/__openerp__.py +++ b/account_reconcile_payment_order/__openerp__.py @@ -19,11 +19,13 @@ ############################################################################## { "name": "Reconcile payment orders", - "version": "1.0", - "author": "Therp BV,Odoo Community Association (OCA)", + "version": "8.0.1.0.0", + "author": "Therp BV," + "Serv. Tecnol. Avanzados - Pedro M. Baeza," + "Odoo Community Association (OCA)", "license": "AGPL-3", "category": "Accounting & Finance", - "summary": "Automatically reconcile all lines from sent payment orders", + "summary": "Automatically reconcile all lines from payment orders", "depends": [ 'account_banking_payment_transfer', ], diff --git a/account_reconcile_payment_order/i18n/account_reconcile_payment_order.pot b/account_reconcile_payment_order/i18n/account_reconcile_payment_order.pot new file mode 100644 index 00000000..1eb8ac1c --- /dev/null +++ b/account_reconcile_payment_order/i18n/account_reconcile_payment_order.pot @@ -0,0 +1,20 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * account_reconcile_payment_order +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 8.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: <>\n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: account_reconcile_payment_order +#: model:ir.model,name:account_reconcile_payment_order.model_account_bank_statement_line +msgid "Bank Statement Line" +msgstr "" + diff --git a/account_reconcile_payment_order/i18n/de.po b/account_reconcile_payment_order/i18n/de.po new file mode 100644 index 00000000..525c694d --- /dev/null +++ b/account_reconcile_payment_order/i18n/de.po @@ -0,0 +1,24 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * account_reconcile_payment_order +# +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: bank-statement-reconcile (8.0)\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-10-14 09:25+0000\n" +"PO-Revision-Date: 2015-08-19 00:32+0000\n" +"Last-Translator: <>\n" +"Language-Team: German (http://www.transifex.com/oca/OCA-bank-statement-" +"reconcile-8-0/language/de/)\n" +"Language: de\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. module: account_reconcile_payment_order +#: model:ir.model,name:account_reconcile_payment_order.model_account_bank_statement_line +msgid "Bank Statement Line" +msgstr "Kontoauszugzeile" diff --git a/account_reconcile_payment_order/i18n/fr.po b/account_reconcile_payment_order/i18n/fr.po new file mode 100644 index 00000000..a0f73c7c --- /dev/null +++ b/account_reconcile_payment_order/i18n/fr.po @@ -0,0 +1,24 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * account_reconcile_payment_order +# +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: bank-statement-reconcile (8.0)\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-04-20 02:39+0000\n" +"PO-Revision-Date: 2015-08-19 00:32+0000\n" +"Last-Translator: <>\n" +"Language-Team: French (http://www.transifex.com/oca/OCA-bank-statement-" +"reconcile-8-0/language/fr/)\n" +"Language: fr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +#. module: account_reconcile_payment_order +#: model:ir.model,name:account_reconcile_payment_order.model_account_bank_statement_line +msgid "Bank Statement Line" +msgstr "Ligne de relevé bancaire" diff --git a/account_reconcile_payment_order/i18n/it.po b/account_reconcile_payment_order/i18n/it.po new file mode 100644 index 00000000..b34c2286 --- /dev/null +++ b/account_reconcile_payment_order/i18n/it.po @@ -0,0 +1,24 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * account_reconcile_payment_order +# +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: bank-statement-reconcile (8.0)\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-10-14 09:25+0000\n" +"PO-Revision-Date: 2015-08-19 00:32+0000\n" +"Last-Translator: <>\n" +"Language-Team: Italian (http://www.transifex.com/oca/OCA-bank-statement-" +"reconcile-8-0/language/it/)\n" +"Language: it\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. module: account_reconcile_payment_order +#: model:ir.model,name:account_reconcile_payment_order.model_account_bank_statement_line +msgid "Bank Statement Line" +msgstr "Linea estratto conto" diff --git a/account_reconcile_payment_order/i18n/nl_NL.po b/account_reconcile_payment_order/i18n/nl_NL.po new file mode 100644 index 00000000..1485a844 --- /dev/null +++ b/account_reconcile_payment_order/i18n/nl_NL.po @@ -0,0 +1,24 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * account_reconcile_payment_order +# +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: bank-statement-reconcile (8.0)\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-06-24 00:30+0000\n" +"PO-Revision-Date: 2015-08-19 00:32+0000\n" +"Last-Translator: <>\n" +"Language-Team: Dutch (Netherlands) (http://www.transifex.com/oca/OCA-bank-" +"statement-reconcile-8-0/language/nl_NL/)\n" +"Language: nl_NL\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. module: account_reconcile_payment_order +#: model:ir.model,name:account_reconcile_payment_order.model_account_bank_statement_line +msgid "Bank Statement Line" +msgstr "Bankafschriftregel" diff --git a/account_reconcile_payment_order/i18n/sl.po b/account_reconcile_payment_order/i18n/sl.po new file mode 100644 index 00000000..86e86e8b --- /dev/null +++ b/account_reconcile_payment_order/i18n/sl.po @@ -0,0 +1,25 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * account_reconcile_payment_order +# +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: bank-statement-reconcile (8.0)\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-08-19 00:32+0000\n" +"PO-Revision-Date: 2015-08-19 00:32+0000\n" +"Last-Translator: <>\n" +"Language-Team: Slovenian (http://www.transifex.com/oca/OCA-bank-statement-" +"reconcile-8-0/language/sl/)\n" +"Language: sl\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n" +"%100==4 ? 2 : 3);\n" + +#. module: account_reconcile_payment_order +#: model:ir.model,name:account_reconcile_payment_order.model_account_bank_statement_line +msgid "Bank Statement Line" +msgstr "Postavka bančnega izpiska" diff --git a/account_reconcile_payment_order/models/account_bank_statement_line.py b/account_reconcile_payment_order/models/account_bank_statement_line.py index 759f3aee..ece9f634 100644 --- a/account_reconcile_payment_order/models/account_bank_statement_line.py +++ b/account_reconcile_payment_order/models/account_bank_statement_line.py @@ -35,7 +35,7 @@ class AccountBankStatementLine(models.Model): select order_id, sum(amount_currency) as amount from payment_line join payment_order o on o.id=order_id - where o.state = 'sent' + where o.state in ('sent', 'done') group by order_id) select order_id from order_sums where amount = %s''', (Decimal(float_repr(abs(this.amount), digits)),)) @@ -55,9 +55,14 @@ class AccountBankStatementLine(models.Model): def get_reconcile_lines_from_order(self, this, orders, excluded_ids=None): """return lines to reconcile our statement line with""" order = orders[0] + if order.state == 'sent': + move_lines_list = list(set(order._get_transfer_move_lines())) + else: + move_lines = order.line_ids.mapped('move_line_id').filtered( + lambda x: not x.reconcile_id) + move_lines_list = [x for x in move_lines] return self.env['account.move.line']\ - .prepare_move_lines_for_reconciliation_widget( - list(set(order._get_transfer_move_lines()))) + .prepare_move_lines_for_reconciliation_widget(move_lines_list) @api.model def get_reconciliation_proposition(self, this, excluded_ids=None): From 7efa591b7241f9cc5f9617ba03c5b7e10e6ca01d Mon Sep 17 00:00:00 2001 From: Holger Brunn Date: Wed, 3 Feb 2016 18:10:38 +0100 Subject: [PATCH 03/13] [FIX] the line's bank account is the other party's bank account, not ours --- .../models/account_bank_statement_line.py | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/account_reconcile_payment_order/models/account_bank_statement_line.py b/account_reconcile_payment_order/models/account_bank_statement_line.py index ece9f634..5bc3cadc 100644 --- a/account_reconcile_payment_order/models/account_bank_statement_line.py +++ b/account_reconcile_payment_order/models/account_bank_statement_line.py @@ -40,15 +40,10 @@ class AccountBankStatementLine(models.Model): select order_id from order_sums where amount = %s''', (Decimal(float_repr(abs(this.amount), digits)),)) order_ids = [i for i, in self.env.cr.fetchall()] - # verify that this ids are accessible to the user and from the - # right bank account if applicable + # verify that this ids are accessible to the user domain = [ ('id', 'in', order_ids), ] - if this.bank_account_id.acc_number: - domain.append( - ('mode.bank_id.acc_number', '=', - this.bank_account_id.acc_number)) return self.env['payment.order'].search(domain) @api.model From a1ffc009ac38ad21f7008de0911ea7e66d7abf2b Mon Sep 17 00:00:00 2001 From: eLBati Date: Mon, 10 Oct 2016 18:11:11 +0200 Subject: [PATCH 04/13] FIX move lines preparation for bank statement reconciliation Without this, in multi currency environment, the amount shown in reconciliation widget would be incoherent: base currency and foreign currency would be mixed --- account_reconcile_payment_order/__openerp__.py | 2 +- .../models/account_bank_statement_line.py | 7 ++++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/account_reconcile_payment_order/__openerp__.py b/account_reconcile_payment_order/__openerp__.py index 84e2a80d..a9e3046d 100644 --- a/account_reconcile_payment_order/__openerp__.py +++ b/account_reconcile_payment_order/__openerp__.py @@ -19,7 +19,7 @@ ############################################################################## { "name": "Reconcile payment orders", - "version": "8.0.1.0.0", + "version": "8.0.1.0.1", "author": "Therp BV," "Serv. Tecnol. Avanzados - Pedro M. Baeza," "Odoo Community Association (OCA)", diff --git a/account_reconcile_payment_order/models/account_bank_statement_line.py b/account_reconcile_payment_order/models/account_bank_statement_line.py index 5bc3cadc..1b2c7271 100644 --- a/account_reconcile_payment_order/models/account_bank_statement_line.py +++ b/account_reconcile_payment_order/models/account_bank_statement_line.py @@ -50,6 +50,9 @@ class AccountBankStatementLine(models.Model): def get_reconcile_lines_from_order(self, this, orders, excluded_ids=None): """return lines to reconcile our statement line with""" order = orders[0] + target_currency = ( + this.currency_id or this.journal_id.currency or + this.journal_id.company_id.currency_id) if order.state == 'sent': move_lines_list = list(set(order._get_transfer_move_lines())) else: @@ -57,7 +60,9 @@ class AccountBankStatementLine(models.Model): lambda x: not x.reconcile_id) move_lines_list = [x for x in move_lines] return self.env['account.move.line']\ - .prepare_move_lines_for_reconciliation_widget(move_lines_list) + .prepare_move_lines_for_reconciliation_widget( + move_lines_list, target_currency=target_currency, + target_date=this.date) @api.model def get_reconciliation_proposition(self, this, excluded_ids=None): From f493b2723af6ef6f3e4353684b3338fd93100a3f Mon Sep 17 00:00:00 2001 From: "Pedro M. Baeza" Date: Thu, 22 Aug 2019 17:00:47 +0200 Subject: [PATCH 05/13] [MIG] account_reconcile_payment_order: Migration to 12.0 * Standard procedure. * README by fragments. * Adapt logic to new reconciliation widget model. * Add tests. --- account_reconcile_payment_order/README.rst | 108 +++- account_reconcile_payment_order/__init__.py | 21 +- .../__manifest__.py | 20 + .../__openerp__.py | 35 -- .../i18n/account_reconcile_payment_order.pot | 6 +- account_reconcile_payment_order/i18n/de.po | 9 +- account_reconcile_payment_order/i18n/fr.po | 9 +- account_reconcile_payment_order/i18n/it.po | 9 +- account_reconcile_payment_order/i18n/nl_NL.po | 9 +- account_reconcile_payment_order/i18n/sl.po | 9 +- .../models/__init__.py | 23 +- .../models/account_bank_statement_line.py | 78 --- .../models/account_reconciliation_widget.py | 67 +++ .../readme/CONFIGURE.rst | 2 + .../readme/CONTRIBUTORS.rst | 4 + .../readme/DESCRIPTION.rst | 5 + .../readme/INSTALL.rst | 2 + .../readme/ROADMAP.rst | 9 + .../readme/USAGE.rst | 6 + .../static/description/index.html | 471 ++++++++++++++++++ .../tests/__init__.py | 3 + .../test_account_reconcile_payment_order.py | 104 ++++ 22 files changed, 812 insertions(+), 197 deletions(-) create mode 100644 account_reconcile_payment_order/__manifest__.py delete mode 100644 account_reconcile_payment_order/__openerp__.py delete mode 100644 account_reconcile_payment_order/models/account_bank_statement_line.py create mode 100644 account_reconcile_payment_order/models/account_reconciliation_widget.py create mode 100644 account_reconcile_payment_order/readme/CONFIGURE.rst create mode 100644 account_reconcile_payment_order/readme/CONTRIBUTORS.rst create mode 100644 account_reconcile_payment_order/readme/DESCRIPTION.rst create mode 100644 account_reconcile_payment_order/readme/INSTALL.rst create mode 100644 account_reconcile_payment_order/readme/ROADMAP.rst create mode 100644 account_reconcile_payment_order/readme/USAGE.rst create mode 100644 account_reconcile_payment_order/static/description/index.html create mode 100644 account_reconcile_payment_order/tests/__init__.py create mode 100644 account_reconcile_payment_order/tests/test_account_reconcile_payment_order.py diff --git a/account_reconcile_payment_order/README.rst b/account_reconcile_payment_order/README.rst index d16c8eae..b1c621de 100644 --- a/account_reconcile_payment_order/README.rst +++ b/account_reconcile_payment_order/README.rst @@ -1,70 +1,124 @@ -.. 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 - ======================== Reconcile payment orders ======================== +.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Faccount--reconcile-lightgray.png?logo=github + :target: https://github.com/OCA/account-reconcile/tree/12.0/account_reconcile_payment_order + :alt: OCA/account-reconcile +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/account-reconcile-12-0/account-reconcile-12-0-account_reconcile_payment_order + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png + :target: https://runbot.odoo-community.org/runbot/98/12.0 + :alt: Try me on Runbot + +|badge1| |badge2| |badge3| |badge4| |badge5| + Payment orders that show up as one big transaction can be difficult for the accounting to handle if a transfer account is used. In this case, we need to reconcile this transaction with possibly hundreds of move lines, which can be a bit tiresome. This module tries to recognize transactions deriving from payment orders and propose the unreconciled move lines from this payment order. +**Table of contents** + +.. contents:: + :local: + Installation ============ -This module requires the module **account_banking_payment_transfer**, available +This module requires the module **account_payment_order**, available in https://github.com/OCA/bank-payment. +Configuration +============= + +#. Go to *Settings > Users & Companies > Users*. +#. Give to your user the permission "Show Full Accounting Features". + Usage ===== -It should just work. What the module does is to search for a payment order in -state 'sent' (for orders transferred to an intermediate account) or done (for -orders non transferred) that has the same amount as the statement line, and the -same bank account than the statement. If any, all move lines are automatically -proposed for the reconcile. - -.. image:: https://odoo-community.org/website/image/ir.attachment/5784_f2813bd/datas - :alt: Try me on Runbot - :target: https://runbot.odoo-community.org/runbot/98/8.0 +#. Go to *Invoicing > Overview*. +#. Locate the bank kanban card and import or create a new statement on it. +#. When reconciling, it should just work. What the module does is to search for + a finished payment order that has the same amount as the statement line. If + any, generated move lines (bank or AR/AP ones) are automatically proposed + for the reconciliation. Known issues / Roadmap ====================== -* it would be good to check references too, but at least the bank in use here - changes some characters, so this doesn't seem to be a general solution. +* It would be good to check references too, but bank usually change some + characters, so this doesn't seem to be a general solution. +* Take into account different currencies (in payment order or in bank + statement). +* Try to match payment orders resulting entries grouped by due date, instead of + a whole, but this will affect performance for sure. +* When the reconcile models end with more inheritable code, implement this + as a new type of reconciliation in this model. +* Develop real UI tests, instead of mimicking the call to the involved method. Bug Tracker =========== -Bugs are tracked on `GitHub Issues `_. +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 -`here `_. +If you spotted it first, help us smashing it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. Credits ======= +Authors +~~~~~~~ + +* Therp BV +* Tecnativa + Contributors ------------- +~~~~~~~~~~~~ -* Holger Brunn -* Pedro M. Baeza +* Holger Brunn +* `Tecnativa `__: -Maintainer ----------- + * Pedro M. Baeza + +Maintainers +~~~~~~~~~~~ + +This module is maintained by the OCA. .. 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 http://odoo-community.org. +.. |maintainer-pedrobaeza| image:: https://github.com/pedrobaeza.png?size=40px + :target: https://github.com/pedrobaeza + :alt: pedrobaeza + +Current `maintainer `__: + +|maintainer-pedrobaeza| + +This module is part of the `OCA/account-reconcile `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/account_reconcile_payment_order/__init__.py b/account_reconcile_payment_order/__init__.py index cdb7d736..e87e85c4 100644 --- a/account_reconcile_payment_order/__init__.py +++ b/account_reconcile_payment_order/__init__.py @@ -1,20 +1,3 @@ -# -*- coding: utf-8 -*- -############################################################################## -# -# This module copyright (C) 2015 Therp BV . -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as -# published by the Free Software Foundation, either version 3 of the -# License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Affero General Public License for more details. -# -# You should have received a copy of the GNU Affero General Public License -# along with this program. If not, see . -# -############################################################################## +# License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0.html + from . import models diff --git a/account_reconcile_payment_order/__manifest__.py b/account_reconcile_payment_order/__manifest__.py new file mode 100644 index 00000000..a423b783 --- /dev/null +++ b/account_reconcile_payment_order/__manifest__.py @@ -0,0 +1,20 @@ +# Copyright 2015 Therp BV (). +# Copyright 2019 Tecnativa - Pedro M. Baeza +# License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0.html + +{ + "name": "Reconcile payment orders", + "version": "12.0.1.0.0", + "author": "Therp BV," + "Tecnativa," + "Odoo Community Association (OCA)", + "license": "AGPL-3", + "website": "https://github.com/OCA/account-reconcile", + "category": "Invoicing Management", + "summary": "Automatically propose all lines generated from payment orders", + "depends": [ + 'account_payment_order', + ], + "installable": True, + "maintainers": ['pedrobaeza'], +} diff --git a/account_reconcile_payment_order/__openerp__.py b/account_reconcile_payment_order/__openerp__.py deleted file mode 100644 index a9e3046d..00000000 --- a/account_reconcile_payment_order/__openerp__.py +++ /dev/null @@ -1,35 +0,0 @@ -# -*- coding: utf-8 -*- -############################################################################## -# -# This module copyright (C) 2015 Therp BV . -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as -# published by the Free Software Foundation, either version 3 of the -# License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Affero General Public License for more details. -# -# You should have received a copy of the GNU Affero General Public License -# along with this program. If not, see . -# -############################################################################## -{ - "name": "Reconcile payment orders", - "version": "8.0.1.0.1", - "author": "Therp BV," - "Serv. Tecnol. Avanzados - Pedro M. Baeza," - "Odoo Community Association (OCA)", - "license": "AGPL-3", - "category": "Accounting & Finance", - "summary": "Automatically reconcile all lines from payment orders", - "depends": [ - 'account_banking_payment_transfer', - ], - "auto_install": False, - "installable": True, - "application": False, -} diff --git a/account_reconcile_payment_order/i18n/account_reconcile_payment_order.pot b/account_reconcile_payment_order/i18n/account_reconcile_payment_order.pot index 1eb8ac1c..69c2c350 100644 --- a/account_reconcile_payment_order/i18n/account_reconcile_payment_order.pot +++ b/account_reconcile_payment_order/i18n/account_reconcile_payment_order.pot @@ -4,7 +4,7 @@ # msgid "" msgstr "" -"Project-Id-Version: Odoo Server 8.0\n" +"Project-Id-Version: Odoo Server 12.0\n" "Report-Msgid-Bugs-To: \n" "Last-Translator: <>\n" "Language-Team: \n" @@ -14,7 +14,7 @@ msgstr "" "Plural-Forms: \n" #. module: account_reconcile_payment_order -#: model:ir.model,name:account_reconcile_payment_order.model_account_bank_statement_line -msgid "Bank Statement Line" +#: model:ir.model,name:account_reconcile_payment_order.model_account_reconciliation_widget +msgid "Account Reconciliation widget" msgstr "" diff --git a/account_reconcile_payment_order/i18n/de.po b/account_reconcile_payment_order/i18n/de.po index 525c694d..9af0851e 100644 --- a/account_reconcile_payment_order/i18n/de.po +++ b/account_reconcile_payment_order/i18n/de.po @@ -19,6 +19,9 @@ msgstr "" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #. module: account_reconcile_payment_order -#: model:ir.model,name:account_reconcile_payment_order.model_account_bank_statement_line -msgid "Bank Statement Line" -msgstr "Kontoauszugzeile" +#: model:ir.model,name:account_reconcile_payment_order.model_account_reconciliation_widget +msgid "Account Reconciliation widget" +msgstr "" + +#~ msgid "Bank Statement Line" +#~ msgstr "Kontoauszugzeile" diff --git a/account_reconcile_payment_order/i18n/fr.po b/account_reconcile_payment_order/i18n/fr.po index a0f73c7c..62d212ae 100644 --- a/account_reconcile_payment_order/i18n/fr.po +++ b/account_reconcile_payment_order/i18n/fr.po @@ -19,6 +19,9 @@ msgstr "" "Plural-Forms: nplurals=2; plural=(n > 1);\n" #. module: account_reconcile_payment_order -#: model:ir.model,name:account_reconcile_payment_order.model_account_bank_statement_line -msgid "Bank Statement Line" -msgstr "Ligne de relevé bancaire" +#: model:ir.model,name:account_reconcile_payment_order.model_account_reconciliation_widget +msgid "Account Reconciliation widget" +msgstr "" + +#~ msgid "Bank Statement Line" +#~ msgstr "Ligne de relevé bancaire" diff --git a/account_reconcile_payment_order/i18n/it.po b/account_reconcile_payment_order/i18n/it.po index b34c2286..5706243d 100644 --- a/account_reconcile_payment_order/i18n/it.po +++ b/account_reconcile_payment_order/i18n/it.po @@ -19,6 +19,9 @@ msgstr "" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #. module: account_reconcile_payment_order -#: model:ir.model,name:account_reconcile_payment_order.model_account_bank_statement_line -msgid "Bank Statement Line" -msgstr "Linea estratto conto" +#: model:ir.model,name:account_reconcile_payment_order.model_account_reconciliation_widget +msgid "Account Reconciliation widget" +msgstr "" + +#~ msgid "Bank Statement Line" +#~ msgstr "Linea estratto conto" diff --git a/account_reconcile_payment_order/i18n/nl_NL.po b/account_reconcile_payment_order/i18n/nl_NL.po index 1485a844..ed1f3293 100644 --- a/account_reconcile_payment_order/i18n/nl_NL.po +++ b/account_reconcile_payment_order/i18n/nl_NL.po @@ -19,6 +19,9 @@ msgstr "" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #. module: account_reconcile_payment_order -#: model:ir.model,name:account_reconcile_payment_order.model_account_bank_statement_line -msgid "Bank Statement Line" -msgstr "Bankafschriftregel" +#: model:ir.model,name:account_reconcile_payment_order.model_account_reconciliation_widget +msgid "Account Reconciliation widget" +msgstr "" + +#~ msgid "Bank Statement Line" +#~ msgstr "Bankafschriftregel" diff --git a/account_reconcile_payment_order/i18n/sl.po b/account_reconcile_payment_order/i18n/sl.po index 86e86e8b..cfe2776b 100644 --- a/account_reconcile_payment_order/i18n/sl.po +++ b/account_reconcile_payment_order/i18n/sl.po @@ -20,6 +20,9 @@ msgstr "" "%100==4 ? 2 : 3);\n" #. module: account_reconcile_payment_order -#: model:ir.model,name:account_reconcile_payment_order.model_account_bank_statement_line -msgid "Bank Statement Line" -msgstr "Postavka bančnega izpiska" +#: model:ir.model,name:account_reconcile_payment_order.model_account_reconciliation_widget +msgid "Account Reconciliation widget" +msgstr "" + +#~ msgid "Bank Statement Line" +#~ msgstr "Postavka bančnega izpiska" diff --git a/account_reconcile_payment_order/models/__init__.py b/account_reconcile_payment_order/models/__init__.py index 33afdc17..7cf4dea8 100644 --- a/account_reconcile_payment_order/models/__init__.py +++ b/account_reconcile_payment_order/models/__init__.py @@ -1,20 +1,3 @@ -# -*- coding: utf-8 -*- -############################################################################## -# -# This module copyright (C) 2015 Therp BV . -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as -# published by the Free Software Foundation, either version 3 of the -# License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Affero General Public License for more details. -# -# You should have received a copy of the GNU Affero General Public License -# along with this program. If not, see . -# -############################################################################## -from . import account_bank_statement_line +# License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0.html + +from . import account_reconciliation_widget diff --git a/account_reconcile_payment_order/models/account_bank_statement_line.py b/account_reconcile_payment_order/models/account_bank_statement_line.py deleted file mode 100644 index 1b2c7271..00000000 --- a/account_reconcile_payment_order/models/account_bank_statement_line.py +++ /dev/null @@ -1,78 +0,0 @@ -# -*- coding: utf-8 -*- -############################################################################## -# -# This module copyright (C) 2015 Therp BV (). -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as -# published by the Free Software Foundation, either version 3 of the -# License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Affero General Public License for more details. -# -# You should have received a copy of the GNU Affero General Public License -# along with this program. If not, see . -# -############################################################################## -from decimal import Decimal -from openerp import models, api -from openerp.tools.float_utils import float_repr - - -class AccountBankStatementLine(models.Model): - _inherit = 'account.bank.statement.line' - - @api.model - def get_possible_payment_orders_for_statement_line(self, this): - """find orders that might be candidates for matching a statement - line""" - digits = self.env['decimal.precision'].precision_get('Account') - self.env.cr.execute( - '''with order_sums as ( - select order_id, sum(amount_currency) as amount - from payment_line - join payment_order o on o.id=order_id - where o.state in ('sent', 'done') - group by order_id) - select order_id from order_sums where amount = %s''', - (Decimal(float_repr(abs(this.amount), digits)),)) - order_ids = [i for i, in self.env.cr.fetchall()] - # verify that this ids are accessible to the user - domain = [ - ('id', 'in', order_ids), - ] - return self.env['payment.order'].search(domain) - - @api.model - def get_reconcile_lines_from_order(self, this, orders, excluded_ids=None): - """return lines to reconcile our statement line with""" - order = orders[0] - target_currency = ( - this.currency_id or this.journal_id.currency or - this.journal_id.company_id.currency_id) - if order.state == 'sent': - move_lines_list = list(set(order._get_transfer_move_lines())) - else: - move_lines = order.line_ids.mapped('move_line_id').filtered( - lambda x: not x.reconcile_id) - move_lines_list = [x for x in move_lines] - return self.env['account.move.line']\ - .prepare_move_lines_for_reconciliation_widget( - move_lines_list, target_currency=target_currency, - target_date=this.date) - - @api.model - def get_reconciliation_proposition(self, this, excluded_ids=None): - """See if we find a set payment order that matches our line. If yes, - return all unreconciled lines from there""" - orders = self.get_possible_payment_orders_for_statement_line(this) - if orders: - reconcile_lines = self.get_reconcile_lines_from_order( - this, orders, excluded_ids=None) - if reconcile_lines: - return reconcile_lines - return super(AccountBankStatementLine, self)\ - .get_reconciliation_proposition(this, excluded_ids=excluded_ids) diff --git a/account_reconcile_payment_order/models/account_reconciliation_widget.py b/account_reconcile_payment_order/models/account_reconciliation_widget.py new file mode 100644 index 00000000..c3697694 --- /dev/null +++ b/account_reconcile_payment_order/models/account_reconciliation_widget.py @@ -0,0 +1,67 @@ +# Copyright 2019 Tecnativa - Pedro M. Baeza +# License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0.html + +from odoo import models, api + + +class AccountReconciliationWidget(models.AbstractModel): + _inherit = 'account.reconciliation.widget' + + @api.model + def _get_possible_payment_orders_for_statement_line(self, st_line): + """Find orders that might be candidates for matching a statement + line. + """ + return self.env['account.payment.order'].search([ + ('total_company_currency', '=', st_line.amount), + ('state', 'in', ['done', 'uploaded']), + ]) + + @api.model + def _get_reconcile_lines_from_order(self, st_line, order, + excluded_ids=None): + """Return lines to reconcile our statement line with.""" + aml_obj = self.env['account.move.line'] + reconciled_lines = aml_obj.search([ + ('bank_payment_line_id', 'in', order.bank_line_ids.ids) + ]) + return ( + reconciled_lines.mapped('move_id.line_ids') - reconciled_lines - + aml_obj.browse(excluded_ids) + ).filtered(lambda x: not x.reconciled) + + def _prepare_proposition_from_orders(self, st_line, orders, + excluded_ids=None): + """Fill with the expected format the reconciliation proposition + for the given statement line and possible payment orders. + """ + target_currency = ( + st_line.currency_id or st_line.journal_id.currency_id or + st_line.journal_id.company_id.currency_id + ) + for order in orders: + elegible_lines = self._get_reconcile_lines_from_order( + st_line, order, excluded_ids=excluded_ids, + ) + if elegible_lines: + return self._prepare_move_lines( + elegible_lines, target_currency=target_currency, + target_date=st_line.date, + ) + return [] + + def get_bank_statement_line_data(self, st_line_ids, excluded_ids=None): + res = super().get_bank_statement_line_data( + st_line_ids, excluded_ids=excluded_ids, + ) + st_line_obj = self.env['account.bank.statement.line'] + for line_vals in res.get('lines', []): + st_line = st_line_obj.browse(line_vals['st_line']['id']) + orders = self._get_possible_payment_orders_for_statement_line( + st_line) + proposition_vals = self._prepare_proposition_from_orders( + st_line, orders, excluded_ids=excluded_ids, + ) + if proposition_vals: + line_vals['reconciliation_proposition'] = proposition_vals + return res diff --git a/account_reconcile_payment_order/readme/CONFIGURE.rst b/account_reconcile_payment_order/readme/CONFIGURE.rst new file mode 100644 index 00000000..1f9dff4f --- /dev/null +++ b/account_reconcile_payment_order/readme/CONFIGURE.rst @@ -0,0 +1,2 @@ +#. Go to *Settings > Users & Companies > Users*. +#. Give to your user the permission "Show Full Accounting Features". diff --git a/account_reconcile_payment_order/readme/CONTRIBUTORS.rst b/account_reconcile_payment_order/readme/CONTRIBUTORS.rst new file mode 100644 index 00000000..dfa767e3 --- /dev/null +++ b/account_reconcile_payment_order/readme/CONTRIBUTORS.rst @@ -0,0 +1,4 @@ +* Holger Brunn +* `Tecnativa `__: + + * Pedro M. Baeza diff --git a/account_reconcile_payment_order/readme/DESCRIPTION.rst b/account_reconcile_payment_order/readme/DESCRIPTION.rst new file mode 100644 index 00000000..03833623 --- /dev/null +++ b/account_reconcile_payment_order/readme/DESCRIPTION.rst @@ -0,0 +1,5 @@ +Payment orders that show up as one big transaction can be difficult for the +accounting to handle if a transfer account is used. In this case, we need to +reconcile this transaction with possibly hundreds of move lines, which can be a +bit tiresome. This module tries to recognize transactions deriving from payment +orders and propose the unreconciled move lines from this payment order. diff --git a/account_reconcile_payment_order/readme/INSTALL.rst b/account_reconcile_payment_order/readme/INSTALL.rst new file mode 100644 index 00000000..41a9bc34 --- /dev/null +++ b/account_reconcile_payment_order/readme/INSTALL.rst @@ -0,0 +1,2 @@ +This module requires the module **account_payment_order**, available +in https://github.com/OCA/bank-payment. diff --git a/account_reconcile_payment_order/readme/ROADMAP.rst b/account_reconcile_payment_order/readme/ROADMAP.rst new file mode 100644 index 00000000..074f3d7a --- /dev/null +++ b/account_reconcile_payment_order/readme/ROADMAP.rst @@ -0,0 +1,9 @@ +* It would be good to check references too, but bank usually change some + characters, so this doesn't seem to be a general solution. +* Take into account different currencies (in payment order or in bank + statement). +* Try to match payment orders resulting entries grouped by due date, instead of + a whole, but this will affect performance for sure. +* When the reconcile models end with more inheritable code, implement this + as a new type of reconciliation in this model. +* Develop real UI tests, instead of mimicking the call to the involved method. diff --git a/account_reconcile_payment_order/readme/USAGE.rst b/account_reconcile_payment_order/readme/USAGE.rst new file mode 100644 index 00000000..67a1eb95 --- /dev/null +++ b/account_reconcile_payment_order/readme/USAGE.rst @@ -0,0 +1,6 @@ +#. Go to *Invoicing > Overview*. +#. Locate the bank kanban card and import or create a new statement on it. +#. When reconciling, it should just work. What the module does is to search for + a finished payment order that has the same amount as the statement line. If + any, generated move lines (bank or AR/AP ones) are automatically proposed + for the reconciliation. diff --git a/account_reconcile_payment_order/static/description/index.html b/account_reconcile_payment_order/static/description/index.html new file mode 100644 index 00000000..7f514072 --- /dev/null +++ b/account_reconcile_payment_order/static/description/index.html @@ -0,0 +1,471 @@ + + + + + + +Reconcile payment orders + + + +
+

Reconcile payment orders

+ + +

Beta License: AGPL-3 OCA/account-reconcile Translate me on Weblate Try me on Runbot

+

Payment orders that show up as one big transaction can be difficult for the +accounting to handle if a transfer account is used. In this case, we need to +reconcile this transaction with possibly hundreds of move lines, which can be a +bit tiresome. This module tries to recognize transactions deriving from payment +orders and propose the unreconciled move lines from this payment order.

+

Table of contents

+ +
+

Installation

+

This module requires the module account_payment_order, available +in https://github.com/OCA/bank-payment.

+
+
+

Configuration

+
    +
  1. Go to Settings > Users & Companies > Users.
  2. +
  3. Give to your user the permission “Show Full Accounting Features”.
  4. +
+
+
+

Usage

+
    +
  1. Go to Invoicing > Overview.
  2. +
  3. Locate the bank kanban card and import or create a new statement on it.
  4. +
  5. When reconciling, it should just work. What the module does is to search for +a finished payment order that has the same amount as the statement line. If +any, generated move lines (bank or AR/AP ones) are automatically proposed +for the reconciliation.
  6. +
+
+
+

Known issues / Roadmap

+
    +
  • It would be good to check references too, but bank usually change some +characters, so this doesn’t seem to be a general solution.
  • +
  • Take into account different currencies (in payment order or in bank +statement).
  • +
  • Try to match payment orders resulting entries grouped by due date, instead of +a whole, but this will affect performance for sure.
  • +
  • When the reconcile models end with more inheritable code, implement this +as a new type of reconciliation in this model.
  • +
  • Develop real UI tests, instead of mimicking the call to the involved method.
  • +
+
+
+

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.

+

Do not contact contributors directly about support or help with technical issues.

+
+
+

Credits

+
+

Authors

+
    +
  • Therp BV
  • +
  • Tecnativa
  • +
+
+
+

Contributors

+
    +
  • Holger Brunn
  • +
  • Tecnativa:
      +
    • Pedro M. Baeza
    • +
    +
  • +
+
+
+

Maintainers

+

This module is maintained by the OCA.

+Odoo Community Association +

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.

+

Current maintainer:

+

pedrobaeza

+

This module is part of the OCA/account-reconcile project on GitHub.

+

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

+
+
+
+ + diff --git a/account_reconcile_payment_order/tests/__init__.py b/account_reconcile_payment_order/tests/__init__.py new file mode 100644 index 00000000..90ea9363 --- /dev/null +++ b/account_reconcile_payment_order/tests/__init__.py @@ -0,0 +1,3 @@ +# License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0.html + +from . import test_account_reconcile_payment_order diff --git a/account_reconcile_payment_order/tests/test_account_reconcile_payment_order.py b/account_reconcile_payment_order/tests/test_account_reconcile_payment_order.py new file mode 100644 index 00000000..87591585 --- /dev/null +++ b/account_reconcile_payment_order/tests/test_account_reconcile_payment_order.py @@ -0,0 +1,104 @@ +# Copyright 2019 Tecnativa - Pedro M. Baeza +# License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0.html + +from odoo.addons.account_payment_order.tests.test_payment_order_inbound \ + import TestPaymentOrderInboundBase + + +class TestAccountReconcilePaymentOrder(TestPaymentOrderInboundBase): + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.widget_obj = cls.env['account.reconciliation.widget'] + cls.bank_journal = cls.env['account.journal'].search( + [('type', '=', 'bank')], limit=1) + # Create second invoice for being sure it handles the payment order + cls.invoice2 = cls._create_customer_invoice(cls) + cls.partner2 = cls.env['res.partner'].create({ + 'name': 'Test partner 2', + }) + cls.invoice2.partner_id = cls.partner2.id + cls.invoice2.action_invoice_open() + # Add to payment order using the wizard + cls.env['account.invoice.payment.line.multi'].with_context( + active_model='account.invoice', + active_ids=cls.invoice2.ids, + ).create({}).run() + # Prepare statement + cls.statement = cls.env['account.bank.statement'].create({ + 'name': 'Test statement', + 'date': '2019-01-01', + 'journal_id': cls.bank_journal.id, + 'line_ids': [ + (0, 0, { + 'date': '2019-01-01', + 'name': 'Test line', + 'amount': 200, + }), + ], + }) + + def test_reconcile_payment_order_bank(self): + self.assertEqual(len(self.inbound_order.payment_line_ids), 2) + self.inbound_mode.write({ + 'offsetting_account': 'bank_account', + 'move_option': 'line', + }) + # Prepare payment order + self.inbound_order.draft2open() + self.inbound_order.open2generated() + self.inbound_order.generated2uploaded() + # Check widget result + res = self.widget_obj.get_bank_statement_line_data( + self.statement.line_ids.ids, + ) + self.assertEqual(len(res['lines'][0]['reconciliation_proposition']), 2) + + def test_reconcile_payment_order_transfer_account(self): + self.assertEqual(len(self.inbound_order.payment_line_ids), 2) + receivable_account = self.env['account.account'].create({ + 'name': 'Extra receivable account', + 'code': 'TEST_ERA', + 'reconcile': True, + 'user_type_id': ( + self.env.ref('account.data_account_type_receivable').id), + }) + self.inbound_mode.write({ + 'offsetting_account': 'transfer_account', + 'transfer_account_id': receivable_account.id, + 'transfer_journal_id': self.bank_journal.id, + 'move_option': 'line', + }) + self.assertEqual(len(self.inbound_order.payment_line_ids), 2) + # Prepare payment order + self.inbound_order.draft2open() + self.inbound_order.open2generated() + self.inbound_order.generated2uploaded() + # Check widget result + res = self.widget_obj.get_bank_statement_line_data( + self.statement.line_ids.ids, + ) + proposition = res['lines'][0]['reconciliation_proposition'] + self.assertEqual(len(proposition), 2) + # Reconcile that entries and check again + st_line_vals = res['lines'][0]['st_line'] + self.widget_obj.process_move_lines( + data=[{ + 'type': '', + 'mv_line_ids': [ + proposition[0]['id'], + proposition[1]['id'], + ], + 'new_mv_line_dicts': [{ + 'name': st_line_vals['name'], + 'credit': st_line_vals['amount'], + 'debit': 0, + 'account_id': st_line_vals['account_id'][0], + 'journal_id': st_line_vals['journal_id'], + }], + }], + ) + res2 = self.widget_obj.get_bank_statement_line_data( + self.statement.line_ids.ids, + ) + self.assertNotEqual(res, res2) From 0011cde0315f09c97d63581b40dc9c9b42bdb9f3 Mon Sep 17 00:00:00 2001 From: Bole Date: Thu, 5 Mar 2020 14:45:35 +0000 Subject: [PATCH 06/13] Added translation using Weblate (Croatian) --- account_reconcile_payment_order/i18n/hr.po | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 account_reconcile_payment_order/i18n/hr.po diff --git a/account_reconcile_payment_order/i18n/hr.po b/account_reconcile_payment_order/i18n/hr.po new file mode 100644 index 00000000..33910409 --- /dev/null +++ b/account_reconcile_payment_order/i18n/hr.po @@ -0,0 +1,21 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * account_reconcile_payment_order +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 12.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: Automatically generated\n" +"Language-Team: none\n" +"Language: hr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=" +"4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" + +#. module: account_reconcile_payment_order +#: model:ir.model,name:account_reconcile_payment_order.model_account_reconciliation_widget +msgid "Account Reconciliation widget" +msgstr "" From 847ca11aa039e91c7d47c10c8df8b7fe9ea91065 Mon Sep 17 00:00:00 2001 From: Bole Date: Thu, 5 Mar 2020 14:45:51 +0000 Subject: [PATCH 07/13] Translated using Weblate (Croatian) Currently translated at 100.0% (1 of 1 strings) Translation: account-reconcile-12.0/account-reconcile-12.0-account_reconcile_payment_order Translate-URL: https://translation.odoo-community.org/projects/account-reconcile-12-0/account-reconcile-12-0-account_reconcile_payment_order/hr/ --- account_reconcile_payment_order/i18n/hr.po | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/account_reconcile_payment_order/i18n/hr.po b/account_reconcile_payment_order/i18n/hr.po index 33910409..80df72c1 100644 --- a/account_reconcile_payment_order/i18n/hr.po +++ b/account_reconcile_payment_order/i18n/hr.po @@ -6,7 +6,8 @@ msgid "" msgstr "" "Project-Id-Version: Odoo Server 12.0\n" "Report-Msgid-Bugs-To: \n" -"Last-Translator: Automatically generated\n" +"PO-Revision-Date: 2020-03-05 17:13+0000\n" +"Last-Translator: Bole \n" "Language-Team: none\n" "Language: hr\n" "MIME-Version: 1.0\n" @@ -14,8 +15,9 @@ msgstr "" "Content-Transfer-Encoding: \n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=" "4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" +"X-Generator: Weblate 3.10\n" #. module: account_reconcile_payment_order #: model:ir.model,name:account_reconcile_payment_order.model_account_reconciliation_widget msgid "Account Reconciliation widget" -msgstr "" +msgstr "Widget zatvaranja" From 0773635b5b3ebea4d5ebfdb6d55c4cf9e1de0907 Mon Sep 17 00:00:00 2001 From: "Pedro M. Baeza" Date: Thu, 23 Apr 2020 18:44:45 +0200 Subject: [PATCH 08/13] [FIX] account_reconcile_payment_order: Adapt tests to upstream changes Due to OCA/bank-payment@7ffe049ad3095f61835e30fb369c975c24341413 --- .../tests/test_account_reconcile_payment_order.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/account_reconcile_payment_order/tests/test_account_reconcile_payment_order.py b/account_reconcile_payment_order/tests/test_account_reconcile_payment_order.py index 87591585..220190ff 100644 --- a/account_reconcile_payment_order/tests/test_account_reconcile_payment_order.py +++ b/account_reconcile_payment_order/tests/test_account_reconcile_payment_order.py @@ -11,9 +11,11 @@ class TestAccountReconcilePaymentOrder(TestPaymentOrderInboundBase): super().setUpClass() cls.widget_obj = cls.env['account.reconciliation.widget'] cls.bank_journal = cls.env['account.journal'].search( - [('type', '=', 'bank')], limit=1) + [('type', '=', 'bank'), + '|', ('company_id', '=', cls.env.user.company_id.id), + ('company_id', '=', False)], limit=1) # Create second invoice for being sure it handles the payment order - cls.invoice2 = cls._create_customer_invoice(cls) + cls.invoice2 = cls._create_customer_invoice() cls.partner2 = cls.env['res.partner'].create({ 'name': 'Test partner 2', }) From 4022ef5734f5f8771c0e153592eacc976ea82238 Mon Sep 17 00:00:00 2001 From: Abraham Anes Date: Wed, 11 Nov 2020 16:17:46 +0100 Subject: [PATCH 09/13] [IMP] account_reconcile_payment_order: black, isort, prettier --- .../__manifest__.py | 10 +- .../models/account_reconciliation_widget.py | 52 +++---- .../test_account_reconcile_payment_order.py | 132 +++++++++--------- 3 files changed, 97 insertions(+), 97 deletions(-) diff --git a/account_reconcile_payment_order/__manifest__.py b/account_reconcile_payment_order/__manifest__.py index a423b783..b7f539a8 100644 --- a/account_reconcile_payment_order/__manifest__.py +++ b/account_reconcile_payment_order/__manifest__.py @@ -5,16 +5,12 @@ { "name": "Reconcile payment orders", "version": "12.0.1.0.0", - "author": "Therp BV," - "Tecnativa," - "Odoo Community Association (OCA)", + "author": "Therp BV," "Tecnativa," "Odoo Community Association (OCA)", "license": "AGPL-3", "website": "https://github.com/OCA/account-reconcile", "category": "Invoicing Management", "summary": "Automatically propose all lines generated from payment orders", - "depends": [ - 'account_payment_order', - ], + "depends": ["account_payment_order",], "installable": True, - "maintainers": ['pedrobaeza'], + "maintainers": ["pedrobaeza"], } diff --git a/account_reconcile_payment_order/models/account_reconciliation_widget.py b/account_reconcile_payment_order/models/account_reconciliation_widget.py index c3697694..87ffb0cd 100644 --- a/account_reconcile_payment_order/models/account_reconciliation_widget.py +++ b/account_reconcile_payment_order/models/account_reconciliation_widget.py @@ -1,43 +1,45 @@ # Copyright 2019 Tecnativa - Pedro M. Baeza # License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0.html -from odoo import models, api +from odoo import api, models class AccountReconciliationWidget(models.AbstractModel): - _inherit = 'account.reconciliation.widget' + _inherit = "account.reconciliation.widget" @api.model def _get_possible_payment_orders_for_statement_line(self, st_line): """Find orders that might be candidates for matching a statement line. """ - return self.env['account.payment.order'].search([ - ('total_company_currency', '=', st_line.amount), - ('state', 'in', ['done', 'uploaded']), - ]) + return self.env["account.payment.order"].search( + [ + ("total_company_currency", "=", st_line.amount), + ("state", "in", ["done", "uploaded"]), + ] + ) @api.model - def _get_reconcile_lines_from_order(self, st_line, order, - excluded_ids=None): + def _get_reconcile_lines_from_order(self, st_line, order, excluded_ids=None): """Return lines to reconcile our statement line with.""" - aml_obj = self.env['account.move.line'] - reconciled_lines = aml_obj.search([ - ('bank_payment_line_id', 'in', order.bank_line_ids.ids) - ]) + aml_obj = self.env["account.move.line"] + reconciled_lines = aml_obj.search( + [("bank_payment_line_id", "in", order.bank_line_ids.ids)] + ) return ( - reconciled_lines.mapped('move_id.line_ids') - reconciled_lines - - aml_obj.browse(excluded_ids) + reconciled_lines.mapped("move_id.line_ids") + - reconciled_lines + - aml_obj.browse(excluded_ids) ).filtered(lambda x: not x.reconciled) - def _prepare_proposition_from_orders(self, st_line, orders, - excluded_ids=None): + def _prepare_proposition_from_orders(self, st_line, orders, excluded_ids=None): """Fill with the expected format the reconciliation proposition for the given statement line and possible payment orders. """ target_currency = ( - st_line.currency_id or st_line.journal_id.currency_id or - st_line.journal_id.company_id.currency_id + st_line.currency_id + or st_line.journal_id.currency_id + or st_line.journal_id.company_id.currency_id ) for order in orders: elegible_lines = self._get_reconcile_lines_from_order( @@ -45,7 +47,8 @@ class AccountReconciliationWidget(models.AbstractModel): ) if elegible_lines: return self._prepare_move_lines( - elegible_lines, target_currency=target_currency, + elegible_lines, + target_currency=target_currency, target_date=st_line.date, ) return [] @@ -54,14 +57,13 @@ class AccountReconciliationWidget(models.AbstractModel): res = super().get_bank_statement_line_data( st_line_ids, excluded_ids=excluded_ids, ) - st_line_obj = self.env['account.bank.statement.line'] - for line_vals in res.get('lines', []): - st_line = st_line_obj.browse(line_vals['st_line']['id']) - orders = self._get_possible_payment_orders_for_statement_line( - st_line) + st_line_obj = self.env["account.bank.statement.line"] + for line_vals in res.get("lines", []): + st_line = st_line_obj.browse(line_vals["st_line"]["id"]) + orders = self._get_possible_payment_orders_for_statement_line(st_line) proposition_vals = self._prepare_proposition_from_orders( st_line, orders, excluded_ids=excluded_ids, ) if proposition_vals: - line_vals['reconciliation_proposition'] = proposition_vals + line_vals["reconciliation_proposition"] = proposition_vals return res diff --git a/account_reconcile_payment_order/tests/test_account_reconcile_payment_order.py b/account_reconcile_payment_order/tests/test_account_reconcile_payment_order.py index 220190ff..6bf9a30b 100644 --- a/account_reconcile_payment_order/tests/test_account_reconcile_payment_order.py +++ b/account_reconcile_payment_order/tests/test_account_reconcile_payment_order.py @@ -1,104 +1,106 @@ # Copyright 2019 Tecnativa - Pedro M. Baeza # License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0.html -from odoo.addons.account_payment_order.tests.test_payment_order_inbound \ - import TestPaymentOrderInboundBase +from odoo.addons.account_payment_order.tests.test_payment_order_inbound import ( + TestPaymentOrderInboundBase, +) class TestAccountReconcilePaymentOrder(TestPaymentOrderInboundBase): @classmethod def setUpClass(cls): super().setUpClass() - cls.widget_obj = cls.env['account.reconciliation.widget'] - cls.bank_journal = cls.env['account.journal'].search( - [('type', '=', 'bank'), - '|', ('company_id', '=', cls.env.user.company_id.id), - ('company_id', '=', False)], limit=1) + cls.widget_obj = cls.env["account.reconciliation.widget"] + cls.bank_journal = cls.env["account.journal"].search( + [ + ("type", "=", "bank"), + "|", + ("company_id", "=", cls.env.user.company_id.id), + ("company_id", "=", False), + ], + limit=1, + ) # Create second invoice for being sure it handles the payment order cls.invoice2 = cls._create_customer_invoice() - cls.partner2 = cls.env['res.partner'].create({ - 'name': 'Test partner 2', - }) + cls.partner2 = cls.env["res.partner"].create({"name": "Test partner 2",}) cls.invoice2.partner_id = cls.partner2.id cls.invoice2.action_invoice_open() # Add to payment order using the wizard - cls.env['account.invoice.payment.line.multi'].with_context( - active_model='account.invoice', - active_ids=cls.invoice2.ids, + cls.env["account.invoice.payment.line.multi"].with_context( + active_model="account.invoice", active_ids=cls.invoice2.ids, ).create({}).run() # Prepare statement - cls.statement = cls.env['account.bank.statement'].create({ - 'name': 'Test statement', - 'date': '2019-01-01', - 'journal_id': cls.bank_journal.id, - 'line_ids': [ - (0, 0, { - 'date': '2019-01-01', - 'name': 'Test line', - 'amount': 200, - }), - ], - }) + cls.statement = cls.env["account.bank.statement"].create( + { + "name": "Test statement", + "date": "2019-01-01", + "journal_id": cls.bank_journal.id, + "line_ids": [ + (0, 0, {"date": "2019-01-01", "name": "Test line", "amount": 200,}), + ], + } + ) def test_reconcile_payment_order_bank(self): self.assertEqual(len(self.inbound_order.payment_line_ids), 2) - self.inbound_mode.write({ - 'offsetting_account': 'bank_account', - 'move_option': 'line', - }) + self.inbound_mode.write( + {"offsetting_account": "bank_account", "move_option": "line",} + ) # Prepare payment order self.inbound_order.draft2open() self.inbound_order.open2generated() self.inbound_order.generated2uploaded() # Check widget result - res = self.widget_obj.get_bank_statement_line_data( - self.statement.line_ids.ids, - ) - self.assertEqual(len(res['lines'][0]['reconciliation_proposition']), 2) + res = self.widget_obj.get_bank_statement_line_data(self.statement.line_ids.ids,) + self.assertEqual(len(res["lines"][0]["reconciliation_proposition"]), 2) def test_reconcile_payment_order_transfer_account(self): self.assertEqual(len(self.inbound_order.payment_line_ids), 2) - receivable_account = self.env['account.account'].create({ - 'name': 'Extra receivable account', - 'code': 'TEST_ERA', - 'reconcile': True, - 'user_type_id': ( - self.env.ref('account.data_account_type_receivable').id), - }) - self.inbound_mode.write({ - 'offsetting_account': 'transfer_account', - 'transfer_account_id': receivable_account.id, - 'transfer_journal_id': self.bank_journal.id, - 'move_option': 'line', - }) + receivable_account = self.env["account.account"].create( + { + "name": "Extra receivable account", + "code": "TEST_ERA", + "reconcile": True, + "user_type_id": ( + self.env.ref("account.data_account_type_receivable").id + ), + } + ) + self.inbound_mode.write( + { + "offsetting_account": "transfer_account", + "transfer_account_id": receivable_account.id, + "transfer_journal_id": self.bank_journal.id, + "move_option": "line", + } + ) self.assertEqual(len(self.inbound_order.payment_line_ids), 2) # Prepare payment order self.inbound_order.draft2open() self.inbound_order.open2generated() self.inbound_order.generated2uploaded() # Check widget result - res = self.widget_obj.get_bank_statement_line_data( - self.statement.line_ids.ids, - ) - proposition = res['lines'][0]['reconciliation_proposition'] + res = self.widget_obj.get_bank_statement_line_data(self.statement.line_ids.ids,) + proposition = res["lines"][0]["reconciliation_proposition"] self.assertEqual(len(proposition), 2) # Reconcile that entries and check again - st_line_vals = res['lines'][0]['st_line'] + st_line_vals = res["lines"][0]["st_line"] self.widget_obj.process_move_lines( - data=[{ - 'type': '', - 'mv_line_ids': [ - proposition[0]['id'], - proposition[1]['id'], - ], - 'new_mv_line_dicts': [{ - 'name': st_line_vals['name'], - 'credit': st_line_vals['amount'], - 'debit': 0, - 'account_id': st_line_vals['account_id'][0], - 'journal_id': st_line_vals['journal_id'], - }], - }], + data=[ + { + "type": "", + "mv_line_ids": [proposition[0]["id"], proposition[1]["id"],], + "new_mv_line_dicts": [ + { + "name": st_line_vals["name"], + "credit": st_line_vals["amount"], + "debit": 0, + "account_id": st_line_vals["account_id"][0], + "journal_id": st_line_vals["journal_id"], + } + ], + } + ], ) res2 = self.widget_obj.get_bank_statement_line_data( self.statement.line_ids.ids, From 5077757a486f187949699f1caaffdf7bcd2806cb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Marques?= Date: Tue, 16 Feb 2021 07:26:08 +0000 Subject: [PATCH 10/13] [MIG] account_reconcile_payment_order: Migration to 13.0 Co-Authored-By: Abraham Anes --- account_reconcile_payment_order/README.rst | 11 +++++---- .../__manifest__.py | 4 ++-- .../i18n/account_reconcile_payment_order.pot | 7 +++--- account_reconcile_payment_order/i18n/de.po | 8 +++---- account_reconcile_payment_order/i18n/fr.po | 8 +++---- account_reconcile_payment_order/i18n/hr.po | 6 ++--- account_reconcile_payment_order/i18n/it.po | 8 +++---- account_reconcile_payment_order/i18n/nl_NL.po | 8 +++---- account_reconcile_payment_order/i18n/sl.po | 8 +++---- .../readme/CONTRIBUTORS.rst | 1 + .../static/description/index.html | 7 +++--- .../test_account_reconcile_payment_order.py | 23 +++++++++++-------- 12 files changed, 48 insertions(+), 51 deletions(-) diff --git a/account_reconcile_payment_order/README.rst b/account_reconcile_payment_order/README.rst index b1c621de..efedfe50 100644 --- a/account_reconcile_payment_order/README.rst +++ b/account_reconcile_payment_order/README.rst @@ -14,13 +14,13 @@ Reconcile payment orders :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html :alt: License: AGPL-3 .. |badge3| image:: https://img.shields.io/badge/github-OCA%2Faccount--reconcile-lightgray.png?logo=github - :target: https://github.com/OCA/account-reconcile/tree/12.0/account_reconcile_payment_order + :target: https://github.com/OCA/account-reconcile/tree/13.0/account_reconcile_payment_order :alt: OCA/account-reconcile .. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png - :target: https://translation.odoo-community.org/projects/account-reconcile-12-0/account-reconcile-12-0-account_reconcile_payment_order + :target: https://translation.odoo-community.org/projects/account-reconcile-13-0/account-reconcile-13-0-account_reconcile_payment_order :alt: Translate me on Weblate .. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png - :target: https://runbot.odoo-community.org/runbot/98/12.0 + :target: https://runbot.odoo-community.org/runbot/98/13.0 :alt: Try me on Runbot |badge1| |badge2| |badge3| |badge4| |badge5| @@ -77,7 +77,7 @@ 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 `_. +`feedback `_. Do not contact contributors directly about support or help with technical issues. @@ -97,6 +97,7 @@ Contributors * `Tecnativa `__: * Pedro M. Baeza + * João Marques Maintainers ~~~~~~~~~~~ @@ -119,6 +120,6 @@ Current `maintainer `__: |maintainer-pedrobaeza| -This module is part of the `OCA/account-reconcile `_ project on GitHub. +This module is part of the `OCA/account-reconcile `_ project on GitHub. You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/account_reconcile_payment_order/__manifest__.py b/account_reconcile_payment_order/__manifest__.py index b7f539a8..5ac2d647 100644 --- a/account_reconcile_payment_order/__manifest__.py +++ b/account_reconcile_payment_order/__manifest__.py @@ -4,13 +4,13 @@ { "name": "Reconcile payment orders", - "version": "12.0.1.0.0", + "version": "13.0.1.0.0", "author": "Therp BV," "Tecnativa," "Odoo Community Association (OCA)", "license": "AGPL-3", "website": "https://github.com/OCA/account-reconcile", "category": "Invoicing Management", "summary": "Automatically propose all lines generated from payment orders", - "depends": ["account_payment_order",], + "depends": ["account_payment_order"], "installable": True, "maintainers": ["pedrobaeza"], } diff --git a/account_reconcile_payment_order/i18n/account_reconcile_payment_order.pot b/account_reconcile_payment_order/i18n/account_reconcile_payment_order.pot index 69c2c350..7ed0bfaa 100644 --- a/account_reconcile_payment_order/i18n/account_reconcile_payment_order.pot +++ b/account_reconcile_payment_order/i18n/account_reconcile_payment_order.pot @@ -1,12 +1,12 @@ # Translation of Odoo Server. # This file contains the translation of the following modules: -# * account_reconcile_payment_order +# * account_reconcile_payment_order # msgid "" msgstr "" -"Project-Id-Version: Odoo Server 12.0\n" +"Project-Id-Version: Odoo Server 13.0\n" "Report-Msgid-Bugs-To: \n" -"Last-Translator: <>\n" +"Last-Translator: \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -17,4 +17,3 @@ msgstr "" #: model:ir.model,name:account_reconcile_payment_order.model_account_reconciliation_widget msgid "Account Reconciliation widget" msgstr "" - diff --git a/account_reconcile_payment_order/i18n/de.po b/account_reconcile_payment_order/i18n/de.po index 9af0851e..5af52a94 100644 --- a/account_reconcile_payment_order/i18n/de.po +++ b/account_reconcile_payment_order/i18n/de.po @@ -8,20 +8,18 @@ msgstr "" "Project-Id-Version: bank-statement-reconcile (8.0)\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-10-14 09:25+0000\n" -"PO-Revision-Date: 2015-08-19 00:32+0000\n" +"PO-Revision-Date: 2021-02-16 07:24+0000\n" "Last-Translator: <>\n" "Language-Team: German (http://www.transifex.com/oca/OCA-bank-statement-" "reconcile-8-0/language/de/)\n" "Language: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" +"Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Poedit 2.4.2\n" #. module: account_reconcile_payment_order #: model:ir.model,name:account_reconcile_payment_order.model_account_reconciliation_widget msgid "Account Reconciliation widget" msgstr "" - -#~ msgid "Bank Statement Line" -#~ msgstr "Kontoauszugzeile" diff --git a/account_reconcile_payment_order/i18n/fr.po b/account_reconcile_payment_order/i18n/fr.po index 62d212ae..02f642b1 100644 --- a/account_reconcile_payment_order/i18n/fr.po +++ b/account_reconcile_payment_order/i18n/fr.po @@ -8,20 +8,18 @@ msgstr "" "Project-Id-Version: bank-statement-reconcile (8.0)\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2016-04-20 02:39+0000\n" -"PO-Revision-Date: 2015-08-19 00:32+0000\n" +"PO-Revision-Date: 2021-02-16 07:24+0000\n" "Last-Translator: <>\n" "Language-Team: French (http://www.transifex.com/oca/OCA-bank-statement-" "reconcile-8-0/language/fr/)\n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" +"Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" +"X-Generator: Poedit 2.4.2\n" #. module: account_reconcile_payment_order #: model:ir.model,name:account_reconcile_payment_order.model_account_reconciliation_widget msgid "Account Reconciliation widget" msgstr "" - -#~ msgid "Bank Statement Line" -#~ msgstr "Ligne de relevé bancaire" diff --git a/account_reconcile_payment_order/i18n/hr.po b/account_reconcile_payment_order/i18n/hr.po index 80df72c1..6ffea32f 100644 --- a/account_reconcile_payment_order/i18n/hr.po +++ b/account_reconcile_payment_order/i18n/hr.po @@ -1,6 +1,6 @@ # Translation of Odoo Server. # This file contains the translation of the following modules: -# * account_reconcile_payment_order +# * account_reconcile_payment_order # msgid "" msgstr "" @@ -13,8 +13,8 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: \n" -"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=" -"4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" +"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" +"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" "X-Generator: Weblate 3.10\n" #. module: account_reconcile_payment_order diff --git a/account_reconcile_payment_order/i18n/it.po b/account_reconcile_payment_order/i18n/it.po index 5706243d..4fd73011 100644 --- a/account_reconcile_payment_order/i18n/it.po +++ b/account_reconcile_payment_order/i18n/it.po @@ -8,20 +8,18 @@ msgstr "" "Project-Id-Version: bank-statement-reconcile (8.0)\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-10-14 09:25+0000\n" -"PO-Revision-Date: 2015-08-19 00:32+0000\n" +"PO-Revision-Date: 2021-02-16 07:24+0000\n" "Last-Translator: <>\n" "Language-Team: Italian (http://www.transifex.com/oca/OCA-bank-statement-" "reconcile-8-0/language/it/)\n" "Language: it\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" +"Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Poedit 2.4.2\n" #. module: account_reconcile_payment_order #: model:ir.model,name:account_reconcile_payment_order.model_account_reconciliation_widget msgid "Account Reconciliation widget" msgstr "" - -#~ msgid "Bank Statement Line" -#~ msgstr "Linea estratto conto" diff --git a/account_reconcile_payment_order/i18n/nl_NL.po b/account_reconcile_payment_order/i18n/nl_NL.po index ed1f3293..c58d0437 100644 --- a/account_reconcile_payment_order/i18n/nl_NL.po +++ b/account_reconcile_payment_order/i18n/nl_NL.po @@ -8,20 +8,18 @@ msgstr "" "Project-Id-Version: bank-statement-reconcile (8.0)\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-06-24 00:30+0000\n" -"PO-Revision-Date: 2015-08-19 00:32+0000\n" +"PO-Revision-Date: 2021-02-16 07:25+0000\n" "Last-Translator: <>\n" "Language-Team: Dutch (Netherlands) (http://www.transifex.com/oca/OCA-bank-" "statement-reconcile-8-0/language/nl_NL/)\n" "Language: nl_NL\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" +"Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Poedit 2.4.2\n" #. module: account_reconcile_payment_order #: model:ir.model,name:account_reconcile_payment_order.model_account_reconciliation_widget msgid "Account Reconciliation widget" msgstr "" - -#~ msgid "Bank Statement Line" -#~ msgstr "Bankafschriftregel" diff --git a/account_reconcile_payment_order/i18n/sl.po b/account_reconcile_payment_order/i18n/sl.po index cfe2776b..3cef9c7e 100644 --- a/account_reconcile_payment_order/i18n/sl.po +++ b/account_reconcile_payment_order/i18n/sl.po @@ -8,21 +8,19 @@ msgstr "" "Project-Id-Version: bank-statement-reconcile (8.0)\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-08-19 00:32+0000\n" -"PO-Revision-Date: 2015-08-19 00:32+0000\n" +"PO-Revision-Date: 2021-02-16 07:25+0000\n" "Last-Translator: <>\n" "Language-Team: Slovenian (http://www.transifex.com/oca/OCA-bank-statement-" "reconcile-8-0/language/sl/)\n" "Language: sl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" +"Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n" "%100==4 ? 2 : 3);\n" +"X-Generator: Poedit 2.4.2\n" #. module: account_reconcile_payment_order #: model:ir.model,name:account_reconcile_payment_order.model_account_reconciliation_widget msgid "Account Reconciliation widget" msgstr "" - -#~ msgid "Bank Statement Line" -#~ msgstr "Postavka bančnega izpiska" diff --git a/account_reconcile_payment_order/readme/CONTRIBUTORS.rst b/account_reconcile_payment_order/readme/CONTRIBUTORS.rst index dfa767e3..dab82860 100644 --- a/account_reconcile_payment_order/readme/CONTRIBUTORS.rst +++ b/account_reconcile_payment_order/readme/CONTRIBUTORS.rst @@ -2,3 +2,4 @@ * `Tecnativa `__: * Pedro M. Baeza + * João Marques diff --git a/account_reconcile_payment_order/static/description/index.html b/account_reconcile_payment_order/static/description/index.html index 7f514072..4bb87d52 100644 --- a/account_reconcile_payment_order/static/description/index.html +++ b/account_reconcile_payment_order/static/description/index.html @@ -367,7 +367,7 @@ ul.auto-toc { !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! --> -

Beta License: AGPL-3 OCA/account-reconcile Translate me on Weblate Try me on Runbot

+

Beta License: AGPL-3 OCA/account-reconcile Translate me on Weblate Try me on Runbot

Payment orders that show up as one big transaction can be difficult for the accounting to handle if a transfer account is used. In this case, we need to reconcile this transaction with possibly hundreds of move lines, which can be a @@ -431,7 +431,7 @@ as a new type of reconciliation in this model.

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.

+feedback.

Do not contact contributors directly about support or help with technical issues.

@@ -449,6 +449,7 @@ If you spotted it first, help us smashing it by providing a detailed and welcome
  • Holger Brunn
  • Tecnativa:
    • Pedro M. Baeza
    • +
    • João Marques
  • @@ -462,7 +463,7 @@ mission is to support the collaborative development of Odoo features and promote its widespread use.

    Current maintainer:

    pedrobaeza

    -

    This module is part of the OCA/account-reconcile project on GitHub.

    +

    This module is part of the OCA/account-reconcile project on GitHub.

    You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

    diff --git a/account_reconcile_payment_order/tests/test_account_reconcile_payment_order.py b/account_reconcile_payment_order/tests/test_account_reconcile_payment_order.py index 6bf9a30b..a4a8e4bc 100644 --- a/account_reconcile_payment_order/tests/test_account_reconcile_payment_order.py +++ b/account_reconcile_payment_order/tests/test_account_reconcile_payment_order.py @@ -1,4 +1,5 @@ # Copyright 2019 Tecnativa - Pedro M. Baeza +# Copyright 2021 Tecnativa - João Marques # License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0.html from odoo.addons.account_payment_order.tests.test_payment_order_inbound import ( @@ -15,19 +16,23 @@ class TestAccountReconcilePaymentOrder(TestPaymentOrderInboundBase): [ ("type", "=", "bank"), "|", - ("company_id", "=", cls.env.user.company_id.id), + ("company_id", "=", cls.env.company.id), ("company_id", "=", False), ], limit=1, ) # Create second invoice for being sure it handles the payment order - cls.invoice2 = cls._create_customer_invoice() - cls.partner2 = cls.env["res.partner"].create({"name": "Test partner 2",}) + cls.invoice2 = cls._create_customer_invoice(cls) + cls.partner2 = cls.env["res.partner"].create({"name": "Test partner 2"}) + # Set correct partner in invoice cls.invoice2.partner_id = cls.partner2.id - cls.invoice2.action_invoice_open() + for line in cls.invoice2.line_ids: + line.partner_id = cls.partner2.id + cls.invoice2.payment_mode_id = cls.inbound_mode + cls.invoice2.action_post() # Add to payment order using the wizard cls.env["account.invoice.payment.line.multi"].with_context( - active_model="account.invoice", active_ids=cls.invoice2.ids, + active_model="account.move", active_ids=cls.invoice2.ids, ).create({}).run() # Prepare statement cls.statement = cls.env["account.bank.statement"].create( @@ -36,7 +41,7 @@ class TestAccountReconcilePaymentOrder(TestPaymentOrderInboundBase): "date": "2019-01-01", "journal_id": cls.bank_journal.id, "line_ids": [ - (0, 0, {"date": "2019-01-01", "name": "Test line", "amount": 200,}), + (0, 0, {"date": "2019-01-01", "name": "Test line", "amount": 230}), ], } ) @@ -44,7 +49,7 @@ class TestAccountReconcilePaymentOrder(TestPaymentOrderInboundBase): def test_reconcile_payment_order_bank(self): self.assertEqual(len(self.inbound_order.payment_line_ids), 2) self.inbound_mode.write( - {"offsetting_account": "bank_account", "move_option": "line",} + {"offsetting_account": "bank_account", "move_option": "line"} ) # Prepare payment order self.inbound_order.draft2open() @@ -80,7 +85,7 @@ class TestAccountReconcilePaymentOrder(TestPaymentOrderInboundBase): self.inbound_order.open2generated() self.inbound_order.generated2uploaded() # Check widget result - res = self.widget_obj.get_bank_statement_line_data(self.statement.line_ids.ids,) + res = self.widget_obj.get_bank_statement_line_data(self.statement.line_ids.ids) proposition = res["lines"][0]["reconciliation_proposition"] self.assertEqual(len(proposition), 2) # Reconcile that entries and check again @@ -89,7 +94,7 @@ class TestAccountReconcilePaymentOrder(TestPaymentOrderInboundBase): data=[ { "type": "", - "mv_line_ids": [proposition[0]["id"], proposition[1]["id"],], + "mv_line_ids": [proposition[0]["id"], proposition[1]["id"]], "new_mv_line_dicts": [ { "name": st_line_vals["name"], From ed53232d213c6a67efc0266c7def180d586dd841 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Marques?= Date: Tue, 30 Mar 2021 11:25:33 +0100 Subject: [PATCH 11/13] [FIX] account_reconcile_payment_order: Fix tests Create journal instead of searching Change hardcoded value for amount of payment statements, after we cleared the taxes of the invoice lines in https://github.com/OCA/bank-payment/pull/798 TT28962 --- .../__manifest__.py | 2 +- .../test_account_reconcile_payment_order.py | 24 ++++++++++--------- 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/account_reconcile_payment_order/__manifest__.py b/account_reconcile_payment_order/__manifest__.py index 5ac2d647..274f3e63 100644 --- a/account_reconcile_payment_order/__manifest__.py +++ b/account_reconcile_payment_order/__manifest__.py @@ -4,7 +4,7 @@ { "name": "Reconcile payment orders", - "version": "13.0.1.0.0", + "version": "13.0.1.0.1", "author": "Therp BV," "Tecnativa," "Odoo Community Association (OCA)", "license": "AGPL-3", "website": "https://github.com/OCA/account-reconcile", diff --git a/account_reconcile_payment_order/tests/test_account_reconcile_payment_order.py b/account_reconcile_payment_order/tests/test_account_reconcile_payment_order.py index a4a8e4bc..e335c3e7 100644 --- a/account_reconcile_payment_order/tests/test_account_reconcile_payment_order.py +++ b/account_reconcile_payment_order/tests/test_account_reconcile_payment_order.py @@ -12,14 +12,8 @@ class TestAccountReconcilePaymentOrder(TestPaymentOrderInboundBase): def setUpClass(cls): super().setUpClass() cls.widget_obj = cls.env["account.reconciliation.widget"] - cls.bank_journal = cls.env["account.journal"].search( - [ - ("type", "=", "bank"), - "|", - ("company_id", "=", cls.env.company.id), - ("company_id", "=", False), - ], - limit=1, + cls.bank_journal = cls.env["account.journal"].create( + {"name": "Test bank journal", "type": "bank"} ) # Create second invoice for being sure it handles the payment order cls.invoice2 = cls._create_customer_invoice(cls) @@ -32,7 +26,7 @@ class TestAccountReconcilePaymentOrder(TestPaymentOrderInboundBase): cls.invoice2.action_post() # Add to payment order using the wizard cls.env["account.invoice.payment.line.multi"].with_context( - active_model="account.move", active_ids=cls.invoice2.ids, + active_model="account.move", active_ids=cls.invoice2.ids ).create({}).run() # Prepare statement cls.statement = cls.env["account.bank.statement"].create( @@ -41,7 +35,15 @@ class TestAccountReconcilePaymentOrder(TestPaymentOrderInboundBase): "date": "2019-01-01", "journal_id": cls.bank_journal.id, "line_ids": [ - (0, 0, {"date": "2019-01-01", "name": "Test line", "amount": 230}), + ( + 0, + 0, + { + "date": "2019-01-01", + "name": "Test line", + "amount": 200, # 100 * 2 + }, + ), ], } ) @@ -56,7 +58,7 @@ class TestAccountReconcilePaymentOrder(TestPaymentOrderInboundBase): self.inbound_order.open2generated() self.inbound_order.generated2uploaded() # Check widget result - res = self.widget_obj.get_bank_statement_line_data(self.statement.line_ids.ids,) + res = self.widget_obj.get_bank_statement_line_data(self.statement.line_ids.ids) self.assertEqual(len(res["lines"][0]["reconciliation_proposition"]), 2) def test_reconcile_payment_order_transfer_account(self): From 2b77e6078785a08890205fa94dd7682eec102466 Mon Sep 17 00:00:00 2001 From: CarlosRoca13 Date: Tue, 29 Mar 2022 10:47:26 +0200 Subject: [PATCH 12/13] [IMP] account_reconcile_payment_order: black, isort, prettier --- .../models/account_reconciliation_widget.py | 11 ++++++++--- .../odoo/addons/account_reconcile_payment_order | 1 + setup/account_reconcile_payment_order/setup.py | 6 ++++++ 3 files changed, 15 insertions(+), 3 deletions(-) create mode 120000 setup/account_reconcile_payment_order/odoo/addons/account_reconcile_payment_order create mode 100644 setup/account_reconcile_payment_order/setup.py diff --git a/account_reconcile_payment_order/models/account_reconciliation_widget.py b/account_reconcile_payment_order/models/account_reconciliation_widget.py index 87ffb0cd..57539d0e 100644 --- a/account_reconcile_payment_order/models/account_reconciliation_widget.py +++ b/account_reconcile_payment_order/models/account_reconciliation_widget.py @@ -43,7 +43,9 @@ class AccountReconciliationWidget(models.AbstractModel): ) for order in orders: elegible_lines = self._get_reconcile_lines_from_order( - st_line, order, excluded_ids=excluded_ids, + st_line, + order, + excluded_ids=excluded_ids, ) if elegible_lines: return self._prepare_move_lines( @@ -55,14 +57,17 @@ class AccountReconciliationWidget(models.AbstractModel): def get_bank_statement_line_data(self, st_line_ids, excluded_ids=None): res = super().get_bank_statement_line_data( - st_line_ids, excluded_ids=excluded_ids, + st_line_ids, + excluded_ids=excluded_ids, ) st_line_obj = self.env["account.bank.statement.line"] for line_vals in res.get("lines", []): st_line = st_line_obj.browse(line_vals["st_line"]["id"]) orders = self._get_possible_payment_orders_for_statement_line(st_line) proposition_vals = self._prepare_proposition_from_orders( - st_line, orders, excluded_ids=excluded_ids, + st_line, + orders, + excluded_ids=excluded_ids, ) if proposition_vals: line_vals["reconciliation_proposition"] = proposition_vals diff --git a/setup/account_reconcile_payment_order/odoo/addons/account_reconcile_payment_order b/setup/account_reconcile_payment_order/odoo/addons/account_reconcile_payment_order new file mode 120000 index 00000000..f6734f33 --- /dev/null +++ b/setup/account_reconcile_payment_order/odoo/addons/account_reconcile_payment_order @@ -0,0 +1 @@ +../../../../account_reconcile_payment_order \ No newline at end of file diff --git a/setup/account_reconcile_payment_order/setup.py b/setup/account_reconcile_payment_order/setup.py new file mode 100644 index 00000000..28c57bb6 --- /dev/null +++ b/setup/account_reconcile_payment_order/setup.py @@ -0,0 +1,6 @@ +import setuptools + +setuptools.setup( + setup_requires=['setuptools-odoo'], + odoo_addon=True, +) From 076e954a31a4f7e69ae2e8a6de01b1aa15d9bf1e Mon Sep 17 00:00:00 2001 From: CarlosRoca13 Date: Wed, 30 Mar 2022 14:36:16 +0200 Subject: [PATCH 13/13] [MIG] account_reconcile_payment_order: Migration to 14.0 --- account_reconcile_payment_order/README.rst | 1 + .../__manifest__.py | 6 +++--- .../readme/CONTRIBUTORS.rst | 1 + .../static/description/index.html | 3 ++- .../test_account_reconcile_payment_order.py | 19 +++---------------- 5 files changed, 10 insertions(+), 20 deletions(-) diff --git a/account_reconcile_payment_order/README.rst b/account_reconcile_payment_order/README.rst index efedfe50..0f71943d 100644 --- a/account_reconcile_payment_order/README.rst +++ b/account_reconcile_payment_order/README.rst @@ -98,6 +98,7 @@ Contributors * Pedro M. Baeza * João Marques + * Carlos Roca Maintainers ~~~~~~~~~~~ diff --git a/account_reconcile_payment_order/__manifest__.py b/account_reconcile_payment_order/__manifest__.py index 274f3e63..6aa4bbd3 100644 --- a/account_reconcile_payment_order/__manifest__.py +++ b/account_reconcile_payment_order/__manifest__.py @@ -4,13 +4,13 @@ { "name": "Reconcile payment orders", - "version": "13.0.1.0.1", - "author": "Therp BV," "Tecnativa," "Odoo Community Association (OCA)", + "version": "14.0.1.0.0", + "author": "Therp BV, Tecnativa, Odoo Community Association (OCA)", "license": "AGPL-3", "website": "https://github.com/OCA/account-reconcile", "category": "Invoicing Management", "summary": "Automatically propose all lines generated from payment orders", - "depends": ["account_payment_order"], + "depends": ["account_payment_order", "account_reconciliation_widget"], "installable": True, "maintainers": ["pedrobaeza"], } diff --git a/account_reconcile_payment_order/readme/CONTRIBUTORS.rst b/account_reconcile_payment_order/readme/CONTRIBUTORS.rst index dab82860..fd504b80 100644 --- a/account_reconcile_payment_order/readme/CONTRIBUTORS.rst +++ b/account_reconcile_payment_order/readme/CONTRIBUTORS.rst @@ -3,3 +3,4 @@ * Pedro M. Baeza * João Marques + * Carlos Roca diff --git a/account_reconcile_payment_order/static/description/index.html b/account_reconcile_payment_order/static/description/index.html index 4bb87d52..c51635aa 100644 --- a/account_reconcile_payment_order/static/description/index.html +++ b/account_reconcile_payment_order/static/description/index.html @@ -3,7 +3,7 @@ - + Reconcile payment orders