Merge lp:~laetitia-gangloff/account-invoicing/account_invoice_merge into lp:~account-core-editors/account-invoicing/7.0

Proposed by Laetitia Gangloff (Acsone)
Status: Merged
Approved by: Guewen Baconnier @ Camptocamp
Approved revision: 33
Merged at revision: 19
Proposed branch: lp:~laetitia-gangloff/account-invoicing/account_invoice_merge
Merge into: lp:~account-core-editors/account-invoicing/7.0
Diff against target: 841 lines (+794/-0)
9 files modified
account_invoice_merge/__init__.py (+25/-0)
account_invoice_merge/__openerp__.py (+47/-0)
account_invoice_merge/i18n/account_invoice_merge.pot (+136/-0)
account_invoice_merge/i18n/fr.po (+144/-0)
account_invoice_merge/i18n/zh_CN.po (+85/-0)
account_invoice_merge/invoice.py (+187/-0)
account_invoice_merge/wizard/__init__.py (+25/-0)
account_invoice_merge/wizard/invoice_merge.py (+105/-0)
account_invoice_merge/wizard/invoice_merge_view.xml (+40/-0)
To merge this branch: bzr merge lp:~laetitia-gangloff/account-invoicing/account_invoice_merge
Reviewer Review Type Date Requested Status
xrg (community) Disapprove
Guewen Baconnier @ Camptocamp Approve
Yannick Vaucher @ Camptocamp code, no test Approve
Stéphane Bidoul (Acsone) (community) Approve
Review via email: mp+171247@code.launchpad.net

Description of the change

Add (and migrate in v7.0) module account_invoice_merge from lp:~openerp-community/openobject-addons/elico-6.0.

"This module adds an action in the invoices lists to merge of invoices. Here are the condition to allow merge:
- Type should be the same (customer Invoice, supplier invoice, Customer or Supplier Refund)
- Partner should be the same
- Currency should be the same
- Account receivable account should be the same"

To post a comment you must log in.
Revision history for this message
Eric Caudal - www.elico-corp.com (elicoidal) wrote :

On my side: the copyright should be Elico Corp and not Erico-Corp
Eric CAUDAL

Eric Caudal
/CEO/
--
*Elico Corporation, Shanghai branch
/OpenERP Premium Certified Training Partner/ *
Cell: + 86 186 2136 1670
Office: + 86 21 6211 8017/27/37
Skype: elico.corp
<email address hidden> <mailto:<email address hidden>>
http://www.elico-corp.com

Elico Corp
On 06/25/2013 05:25 PM, Laetitia Gangloff (Acsone) wrote:
> Laetitia Gangloff (Acsone) has proposed merging lp:~laetitia-gangloff/account-invoicing/account_invoice_merge into lp:account-invoicing.
>
> Requested reviews:
> Acsone OpenErp Team (acsone-openerp)
>
> For more details, see:
> https://code.launchpad.net/~laetitia-gangloff/account-invoicing/account_invoice_merge/+merge/171247
>
> Add (and migrate in v7.0) module account_invoice_merge from lp:~openerp-community/openobject-addons/elico-6.0.
>
> "This module adds an action in the invoices lists to merge of invoices. Here are the condition to allow merge:
> - Type should be the same (customer Invoice, supplier invoice, Customer or Supplier Refund)
> - Partner should be the same
> - Currency should be the same
> - Account receivable account should be the same"

22. By Laetitia Gangloff (Acsone)

account_invoice_merge: in copyright replace Erico-Corp by Elico Corp.

Revision history for this message
Laetitia Gangloff (Acsone) (laetitia-gangloff) wrote :

I replaced "Copyright (C) 2011-2012 Erico-Corp (<http://www.openerp.net.cn>)." by "Copyright (c) 2010-2011 Elico Corp. All Rights Reserved."

Note that the file zh_CN.po need revision.

Revision history for this message
Eric Caudal - www.elico-corp.com (elicoidal) wrote :

Hi Laetitia,
I am not so familiar with the lp contribution process. For the zh_CN
file what shall I do:
1. Branch the lp
2. Change the po file
3. propose for merge with bzr merge

Thanks for helping...
Eric CAUDAL

Eric Caudal
/CEO/
--
*Elico Corporation, Shanghai branch
/OpenERP Premium Certified Training Partner/ *
Cell: + 86 186 2136 1670
Office: + 86 21 6211 8017/27/37
Skype: elico.corp
<email address hidden> <mailto:<email address hidden>>
http://www.elico-corp.com

Elico Corp
On 06/25/2013 06:11 PM, Laetitia Gangloff (Acsone) wrote:
> I replaced "Copyright (C) 2011-2012 Erico-Corp (<http://www.openerp.net.cn>)." by "Copyright (c) 2010-2011 Elico Corp. All Rights Reserved."
>
> Note that the file zh_CN.po need revision.

Revision history for this message
Stéphane Bidoul (Acsone) (sbi) wrote :

Hi Eric,

I think the easiest would go as follow:
- you bzr branch lp:~laetitia-gangloff/account-invoicing/account_invoice_merge
- you commit and bzr push lp:~elicoidal/account-invoicing/account_invoice_merge_zh_CN_fix
- Laetitia merges lp:~elicoidal/account-invoicing/account_invoice_merge_zh_CN_fix in her branch
- we continue the review process on this MP

-sbi

23. By Laetitia Gangloff (Acsone)

Merge from account_invoice_merge_zh_CN_fix

Revision history for this message
Laetitia Gangloff (Acsone) (laetitia-gangloff) wrote :

I merged the branch https://code.launchpad.net/~lin-yu/account-invoicing/account_invoice_merge_zh_CN_fix into this one.

I think this proposal can be review.

Thank you.

Revision history for this message
Stéphane Bidoul (Acsone) (sbi) wrote :

A few comments (code reading only, no test at this stage):
- osv.osv deprecated, use orm.Model instead
- initially I was a bit confused because the code in invoice.py uses "order" variables where it actually treats invoices, I would to rename these variables for readability

review: Needs Fixing
Revision history for this message
Niels Huylebroeck (red15) wrote :

Got some remarks on the view:
'account_invoice_merge/wizard/invoice_merge_view.xml'

You use form version 7 but still use a label with a big ugly string which contains '&#10;' characters to break lines.
I would think that using clean and simple html would be a better fit here ? Perhaps a few clean <p> tags to bundle the text.

A question about the merge key, would it not be better to use the commercial_entity instead of the regular partner_id ?
This could obviously lead to somewhat unexpected behaviour which will merge invoices that were meant for different departments within a company maybe but this itself could also be considered a desireable feature.
Perhaps the merge wizard should ask the user if it has to merge invoices for the same entity or only per "address"?

Revision history for this message
Stéphane Bidoul (Acsone) (sbi) wrote :

Bug fix: in wizard/invoice_merge.py, replace "todo_ids +=" by "todo_ids =". Otherwise the browse on po tries to browse so ids.

Also, I would move this part which reconnects the so/po to the invoices from wizard/invoice_merge.py to invoice.py/do_merge() so do_merge implements the whole algorithm and can be called from elsewhere without surprise.

review: Needs Fixing (testing)
24. By Laetitia Gangloff (Acsone)

account_invoice_merge : replace osv by orm

25. By Laetitia Gangloff (Acsone)

account_invoice_merge : replace label from invoice_merge_view.xml with html

26. By Laetitia Gangloff (Acsone)

account_invoice_merge : replace "todo_ids +=" by "todo_ids" and move it in invoice.py

Revision history for this message
Laetitia Gangloff (Acsone) (laetitia-gangloff) wrote :

Hello,

I use orm instead of osv.
I rewrite the label of the view 'account_invoice_merge/wizard/invoice_merge_view.xml'.
I replace "todo_ids +=" by "todo_ids =" and move this part in invoice.py.

27. By Laetitia Gangloff (Acsone)

account_invoice_merge : rename order to invoice

28. By Laetitia Gangloff (Acsone)

account_invoice_merge: update dependance management

29. By Laetitia Gangloff (Acsone)

account_invoice_merge: use commercial_partner_id instead of partner_id

Revision history for this message
Laetitia Gangloff (Acsone) (laetitia-gangloff) wrote :

I rename 'order' in 'invoice'.
I replace dependance on sale and purchase by checking if modules are loaded.

As you suggest, I use commercial_partner_id instead of partner_id for the merge key.

Thank you.

Revision history for this message
Stéphane Bidoul (Acsone) (sbi) wrote :

@Niels,

Now that I think of it, the merge of invoices to different partner_id would result in silently using the contact of the first invoice and dropping the others.

To solve this the wizard would need to be made more sophisticated, so we'll leave that improvement to future contributors.

-sbi

30. By Laetitia Gangloff (Acsone)

account_invoice_merge: revert last commit (use of commercial_partner_id)

Revision history for this message
Stéphane Bidoul (Acsone) (sbi) wrote :

Looks good. Approved!

review: Approve
Revision history for this message
Guewen Baconnier @ Camptocamp (gbaconnier-c2c) wrote :
review: Needs Information
Revision history for this message
Stéphane Bidoul (Acsone) (sbi) wrote :

Hello Guewen and community,

Y <email address hidden>es they the MP have the same goal and stem
from the same Elico module. Apparently both teams did the same work in the
exact same timeframe. Romain's branch came one day before Laetitia's.

There is a process question here: how can we (not being part of the
Community Reviewers group - yet :) receive notifications of changes and MP
to community branches? The question is even broader: how can someone
interested in doing some code review receive notifications of community
activities. Thanks in advance for hints in this area.

Now these two MP need to be merged. At first glance there is good
improvements in both. It seems Laetitia's branch got a bit more scrutiny so
far? Another way to decide which of the two goes forward could be to decide
the best project to receive it. Is it account-invoicing, or
account-financial-tools. My intuition would go to account-invoicing as this
module is exclusively about invoices.

-sbi

On Mon, Jul 22, 2013 at 10:20 AM, Guewen Baconnier @ Camptocamp <
<email address hidden>> wrote:

> Review: Needs Information
>
> Is it the same module than?
>
> https://code.launchpad.net/~camptocamp/account-financial-tools/7.0-add-account_invoice_merge/+merge/171119
>
> Can both MPs converge in an unique MP?
> --
>
> https://code.launchpad.net/~laetitia-gangloff/account-invoicing/account_invoice_merge/+merge/171247
> You are reviewing the proposed merge of
> lp:~laetitia-gangloff/account-invoicing/account_invoice_merge into
> lp:account-invoicing.
>

Revision history for this message
Yannick Vaucher @ Camptocamp (yvaucher-c2c) wrote :

About which MP should be the base to converge both in one, it seams Leatitia's MP is more advanced in the porting with details such as in views specifics to v7.0 and few more cleaning.

Furthermore, I agree with Stéphane, account-invoicing is certainly better than account-financial-tools branch

So let's keep this branch and bring what is needed from Romain's one?

Revision history for this message
Yannick Vaucher @ Camptocamp (yvaucher-c2c) wrote :

l490, fields imported but unused
l492 _ imported but unused
l538 bad indentation for comment

l500 - l629 do_merge method is too long - can be refactored using Romain's changes

l689 fields imported but unused

l760 doesn't po and so need to be rewritten with invoice ids ? (Romain's changes)

review: Needs Fixing
31. By Laetitia Gangloff (Acsone)

account_invoice_merge: refactor do_merge method and some cleanup.

Revision history for this message
Laetitia Gangloff (Acsone) (laetitia-gangloff) wrote :

Hello,

I refactor do_merge method using Romain's changes.
I remove unused import and correct the comment indentation.

doesn't po and so need to be rewritten with invoice ids ?
As suggested by Stéphane, the part which reconnects the so/po to the invoice move from wizard/invoice_merge.py to invoice.py/do_merge() so do_merge implements the whole algorithm and can be called from elsewhere without surprise.

Thank you

Revision history for this message
Stéphane Bidoul (Acsone) (sbi) wrote :

nitpicking for readability:
- L161 new_invoice should be new_invoice_id
- org_invoice is org_so/org_po in L174/L182
- pep8 whitespace in L177 & L179

A question: where is the link from so line to invoice visible for the user?

review: Needs Fixing
33. By Laetitia Gangloff (Acsone)

account_invoice_merge: update some labels

Revision history for this message
Stéphane Bidoul (Acsone) (sbi) :
review: Approve
Revision history for this message
Yannick Vaucher @ Camptocamp (yvaucher-c2c) :
review: Approve (code, no test)
Revision history for this message
Stéphane Bidoul (Acsone) (sbi) wrote :

Is this one good for merging?

Revision history for this message
Guewen Baconnier @ Camptocamp (gbaconnier-c2c) :
review: Approve
Revision history for this message
Guewen Baconnier @ Camptocamp (gbaconnier-c2c) wrote :

I just merged the MP. Thanks all.

Revision history for this message
xrg (xrg) wrote :

This module has clearly copied code from "account_invoice_merge" from extra-addons 6.0. Hence the copyright of Elico is false!

review: Disapprove
Revision history for this message
Eric Caudal - www.elico-corp.com (elicoidal) wrote :

I think the copyright is correct ;)

xrg <email address hidden> wrote:

>Review: Disapprove
>
>This module has clearly copied code from "account_invoice_merge" from extra-addons 6.0. Hence the copyright of Elico is false!
>
>
>--
>https://code.launchpad.net/~laetitia-gangloff/account-invoicing/account_invoice_merge/+merge/171247
>Your team Account Core Editors is subscribed to branch lp:account-invoicing.

Revision history for this message
xrg (xrg) wrote :

so, you think you can replace copyright holders?

Then s/Elico Corp/whatever/g !

Revision history for this message
Stéphane Bidoul (Acsone) (sbi) wrote :

There is still a copyright Tiny SPRL in invoice.py. This one goes back to
the original commit from Elico and is probably a mistake (Eric?).

Other than that I don't see any copyright issue. Credits are properly
attributed and commit history is prorperly preserved.

-sbi

On Fri, Aug 30, 2013 at 1:21 PM, xrg <email address hidden> wrote:

> so, you think you can replace copyright holders?
>
>
> Then s/Elico Corp/whatever/g !
>
> --
>
> https://code.launchpad.net/~laetitia-gangloff/account-invoicing/account_invoice_merge/+merge/171247
> You are reviewing the proposed merge of
> lp:~laetitia-gangloff/account-invoicing/account_invoice_merge into
> lp:account-invoicing.
>

Revision history for this message
Eric Caudal - www.elico-corp.com (elicoidal) wrote :

We probably kept the original copyright because most of the code was
copied directly from invoice.py for inheritance.
I dont know what would be the common practice in this case: add a line
with Elico Copyright + other contributors?

Eric CAUDAL

Eric Caudal
/CEO/
--
*Elico Corporation, Shanghai branch
/OpenERP Premium Certified Training Partner/ *
Cell: + 86 186 2136 1670
Office: + 86 21 6211 8017/27/37
Skype: elico.corp
<email address hidden> <mailto:<email address hidden>>
http://www.elico-corp.com

Elico Corp
On 30/08/2013 19:36, Stéphane Bidoul (Acsone) wrote:
> There is still a copyright Tiny SPRL in invoice.py. This one goes back to
> the original commit from Elico and is probably a mistake (Eric?).
>
> Other than that I don't see any copyright issue. Credits are properly
> attributed and commit history is prorperly preserved.
>
> -sbi
>
>
> On Fri, Aug 30, 2013 at 1:21 PM, xrg <email address hidden> wrote:
>
>> so, you think you can replace copyright holders?
>>
>>
>> Then s/Elico Corp/whatever/g !
>>
>> --
>>
>> https://code.launchpad.net/~laetitia-gangloff/account-invoicing/account_invoice_merge/+merge/171247
>> You are reviewing the proposed merge of
>> lp:~laetitia-gangloff/account-invoicing/account_invoice_merge into
>> lp:account-invoicing.
>>

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== added directory 'account_invoice_merge'
=== added file 'account_invoice_merge/__init__.py'
--- account_invoice_merge/__init__.py 1970-01-01 00:00:00 +0000
+++ account_invoice_merge/__init__.py 2013-08-06 10:17:31 +0000
@@ -0,0 +1,25 @@
1# -*- coding: utf-8 -*-
2##############################################################################
3#
4# OpenERP, Open Source Management Solution
5# Copyright (c) 2010-2011 Elico Corp. All Rights Reserved.
6#
7# This program is free software: you can redistribute it and/or modify
8# it under the terms of the GNU Affero General Public License as
9# published by the Free Software Foundation, either version 3 of the
10# License, or (at your option) any later version.
11#
12# This program is distributed in the hope that it will be useful,
13# but WITHOUT ANY WARRANTY; without even the implied warranty of
14# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15# GNU Affero General Public License for more details.
16#
17# You should have received a copy of the GNU Affero General Public License
18# along with this program. If not, see <http://www.gnu.org/licenses/>.
19#
20##############################################################################
21import invoice
22import wizard
23
24# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
25
026
=== added file 'account_invoice_merge/__openerp__.py'
--- account_invoice_merge/__openerp__.py 1970-01-01 00:00:00 +0000
+++ account_invoice_merge/__openerp__.py 2013-08-06 10:17:31 +0000
@@ -0,0 +1,47 @@
1# -*- coding: utf-8 -*-
2##############################################################################
3#
4# OpenERP, Open Source Management Solution
5# Copyright (c) 2010-2011 Elico Corp. All Rights Reserved.
6# Author: Ian Li <ian.li@elico-corp.com>
7#
8# This program is free software: you can redistribute it and/or modify
9# it under the terms of the GNU Affero General Public License as
10# published by the Free Software Foundation, either version 3 of the
11# License, or (at your option) any later version.
12#
13# This program is distributed in the hope that it will be useful,
14# but WITHOUT ANY WARRANTY; without even the implied warranty of
15# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16# GNU Affero General Public License for more details.
17#
18# You should have received a copy of the GNU Affero General Public License
19# along with this program. If not, see <http://www.gnu.org/licenses/>.
20#
21##############################################################################
22
23{
24 'name': 'Account Invoice Merge Wizard',
25 'version': '1.1',
26 'category': 'Finance',
27 'description': """
28This module adds an action in the invoices lists to merge of invoices. Here are the condition to allow merge:
29- Type should be the same (customer Invoice, supplier invoice, Customer or Supplier Refund)
30- Partner should be the same
31- Currency should be the same
32- Account receivable account should be the same
33 """,
34 'author': 'Elico Corp',
35 'website': 'http://www.openerp.net.cn',
36 'depends': ['account'],
37 'data': [
38 'wizard/invoice_merge_view.xml',
39 ],
40 'test': [
41 ],
42 'demo': [],
43 'installable': True,
44 'active': False,
45 'certificate': False,
46}
47# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
048
=== added directory 'account_invoice_merge/i18n'
=== added file 'account_invoice_merge/i18n/account_invoice_merge.pot'
--- account_invoice_merge/i18n/account_invoice_merge.pot 1970-01-01 00:00:00 +0000
+++ account_invoice_merge/i18n/account_invoice_merge.pot 2013-08-06 10:17:31 +0000
@@ -0,0 +1,136 @@
1# Translation of OpenERP Server.
2# This file contains the translation of the following modules:
3# * account_invoice_merge
4#
5msgid ""
6msgstr ""
7"Project-Id-Version: OpenERP Server 7.0\n"
8"Report-Msgid-Bugs-To: \n"
9"POT-Creation-Date: 2013-06-25 08:40+0000\n"
10"PO-Revision-Date: 2013-06-25 08:40+0000\n"
11"Last-Translator: <>\n"
12"Language-Team: \n"
13"MIME-Version: 1.0\n"
14"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Transfer-Encoding: \n"
16"Plural-Forms: \n"
17
18#. module: account_invoice_merge
19#: code:addons/account_invoice_merge/wizard/invoice_merge.py:34
20#, python-format
21msgid "Please select multiple invoice to merge in the list view."
22msgstr ""
23
24#. module: account_invoice_merge
25#: code:addons/account_invoice_merge/wizard/invoice_merge.py:44
26#, python-format
27msgid "Not all invoices are at the same company!"
28msgstr ""
29
30#. module: account_invoice_merge
31#: code:addons/account_invoice_merge/wizard/invoice_merge.py:40
32#, python-format
33msgid "At least one of the selected invoices is %s!"
34msgstr ""
35
36#. module: account_invoice_merge
37#: view:invoice.merge:0
38#: model:ir.actions.act_window,name:account_invoice_merge.action_view_invoice_merge
39#: model:ir.model,name:account_invoice_merge.model_invoice_merge
40msgid "Merge Partner Invoice"
41msgstr ""
42
43#. module: account_invoice_merge
44#: code:addons/account_invoice_merge/wizard/invoice_merge.py:48
45#, python-format
46msgid "Not all invoices are of the same type!"
47msgstr ""
48
49#. module: account_invoice_merge
50#: code:addons/account_invoice_merge/wizard/invoice_merge.py:107
51#, python-format
52msgid "Partner Invoice"
53msgstr ""
54
55#. module: account_invoice_merge
56#: view:invoice.merge:0
57msgid " Please note that: \n"
58" \n"
59" Invoices will only be merged if: \n"
60" * Invoices are in draft \n"
61" * Invoices belong to the same partner \n"
62" * Invoices are have same company, partner, address, currency, journal, salesman, account, type \n"
63" \n"
64" Lines will only be merged if: \n"
65" * Invoice lines are exactly the same except for the product,quantity and unit \n"
66" "
67msgstr ""
68
69#. module: account_invoice_merge
70#: view:invoice.merge:0
71msgid "or"
72msgstr ""
73
74#. module: account_invoice_merge
75#: code:addons/account_invoice_merge/wizard/invoice_merge.py:42
76#, python-format
77msgid "Not all invoices use the same account!"
78msgstr ""
79
80#. module: account_invoice_merge
81#: view:invoice.merge:0
82msgid "Merge Invoices"
83msgstr ""
84
85#. module: account_invoice_merge
86#: code:addons/account_invoice_merge/wizard/invoice_merge.py:40
87#: code:addons/account_invoice_merge/wizard/invoice_merge.py:42
88#: code:addons/account_invoice_merge/wizard/invoice_merge.py:44
89#: code:addons/account_invoice_merge/wizard/invoice_merge.py:46
90#: code:addons/account_invoice_merge/wizard/invoice_merge.py:48
91#: code:addons/account_invoice_merge/wizard/invoice_merge.py:50
92#: code:addons/account_invoice_merge/wizard/invoice_merge.py:52
93#, python-format
94msgid "Warning"
95msgstr ""
96
97#. module: account_invoice_merge
98#: code:addons/account_invoice_merge/wizard/invoice_merge.py:34
99#, python-format
100msgid "Warning!"
101msgstr ""
102
103#. module: account_invoice_merge
104#: model:ir.model,name:account_invoice_merge.model_account_invoice
105msgid "Invoice"
106msgstr ""
107
108#. module: account_invoice_merge
109#: view:invoice.merge:0
110msgid "Cancel"
111msgstr ""
112
113#. module: account_invoice_merge
114#: code:addons/account_invoice_merge/wizard/invoice_merge.py:52
115#, python-format
116msgid "Not all invoices are at the same journal!"
117msgstr ""
118
119#. module: account_invoice_merge
120#: code:addons/account_invoice_merge/wizard/invoice_merge.py:50
121#, python-format
122msgid "Not all invoices are at the same currency!"
123msgstr ""
124
125#. module: account_invoice_merge
126#: view:invoice.merge:0
127msgid "Are you sure you want to merge these invoices ?"
128msgstr ""
129
130#. module: account_invoice_merge
131#: code:addons/account_invoice_merge/wizard/invoice_merge.py:46
132#, python-format
133msgid "Not all invoices are for the same partner!"
134msgstr ""
135
136
0137
=== added file 'account_invoice_merge/i18n/fr.po'
--- account_invoice_merge/i18n/fr.po 1970-01-01 00:00:00 +0000
+++ account_invoice_merge/i18n/fr.po 2013-08-06 10:17:31 +0000
@@ -0,0 +1,144 @@
1# Translation of OpenERP Server.
2# This file contains the translation of the following modules:
3# * account_invoice_merge
4#
5msgid ""
6msgstr ""
7"Project-Id-Version: OpenERP Server 7.0\n"
8"Report-Msgid-Bugs-To: \n"
9"POT-Creation-Date: 2013-06-25 08:40+0000\n"
10"PO-Revision-Date: 2013-06-25 08:40+0000\n"
11"Last-Translator: <>\n"
12"Language-Team: \n"
13"MIME-Version: 1.0\n"
14"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Transfer-Encoding: \n"
16"Plural-Forms: \n"
17
18#. module: account_invoice_merge
19#: code:addons/account_invoice_merge/wizard/invoice_merge.py:34
20#, python-format
21msgid "Please select multiple invoice to merge in the list view."
22msgstr "Veuillez selectionner dans la liste plusieurs factures à fusionner"
23
24#. module: account_invoice_merge
25#: code:addons/account_invoice_merge/wizard/invoice_merge.py:44
26#, python-format
27msgid "Not all invoices are at the same company!"
28msgstr "Toutes les factures n'appartiennent pas à la même société !"
29
30#. module: account_invoice_merge
31#: code:addons/account_invoice_merge/wizard/invoice_merge.py:40
32#, python-format
33msgid "At least one of the selected invoices is %s!"
34msgstr "Au moins une des factures sélectionnées est %s !"
35
36#. module: account_invoice_merge
37#: view:invoice.merge:0
38#: model:ir.actions.act_window,name:account_invoice_merge.action_view_invoice_merge
39#: model:ir.model,name:account_invoice_merge.model_invoice_merge
40msgid "Merge Partner Invoice"
41msgstr "Fusion de facture de patenaire"
42
43#. module: account_invoice_merge
44#: code:addons/account_invoice_merge/wizard/invoice_merge.py:48
45#, python-format
46msgid "Not all invoices are of the same type!"
47msgstr "Toutes les factures ne sont pas du même type !"
48
49#. module: account_invoice_merge
50#: code:addons/account_invoice_merge/wizard/invoice_merge.py:107
51#, python-format
52msgid "Partner Invoice"
53msgstr "Facture de patenaire"
54
55#. module: account_invoice_merge
56#: view:invoice.merge:0
57msgid " Please note that: \n"
58" \n"
59" Invoices will only be merged if: \n"
60" * Invoices are in draft \n"
61" * Invoices belong to the same partner \n"
62" * Invoices are have same company, partner, address, currency, journal, salesman, account, type \n"
63" \n"
64" Lines will only be merged if: \n"
65" * Invoice lines are exactly the same except for the product,quantity and unit \n"
66" "
67msgstr " Veuillez noter que :\n"
68"\n"
69" Les factures seront fusionnées seulement si :\n"
70" * Les factures sont dans l'état brouillon\n"
71" * Les factures appartiennent au même patenaire\n"
72" * Les facture possédent les même société, partenaire, adresse, devise, journal, vendeur, compte, type\n"
73"\n"
74" Les lignes seront fusionnées seulement si :\n"
75" * Les lignes de facture sont identique à l'exception de la quantité et de l'unité\n"
76
77#. module: account_invoice_merge
78#: view:invoice.merge:0
79msgid "or"
80msgstr "ou"
81
82#. module: account_invoice_merge
83#: code:addons/account_invoice_merge/wizard/invoice_merge.py:42
84#, python-format
85msgid "Not all invoices use the same account!"
86msgstr "Toutes les factures n'utilisent pas le même compte !"
87
88#. module: account_invoice_merge
89#: view:invoice.merge:0
90msgid "Merge Invoices"
91msgstr "Fusion de factures"
92
93#. module: account_invoice_merge
94#: code:addons/account_invoice_merge/wizard/invoice_merge.py:40
95#: code:addons/account_invoice_merge/wizard/invoice_merge.py:42
96#: code:addons/account_invoice_merge/wizard/invoice_merge.py:44
97#: code:addons/account_invoice_merge/wizard/invoice_merge.py:46
98#: code:addons/account_invoice_merge/wizard/invoice_merge.py:48
99#: code:addons/account_invoice_merge/wizard/invoice_merge.py:50
100#: code:addons/account_invoice_merge/wizard/invoice_merge.py:52
101#, python-format
102msgid "Warning"
103msgstr "Attention"
104
105#. module: account_invoice_merge
106#: code:addons/account_invoice_merge/wizard/invoice_merge.py:34
107#, python-format
108msgid "Warning!"
109msgstr "Attention !"
110
111#. module: account_invoice_merge
112#: model:ir.model,name:account_invoice_merge.model_account_invoice
113msgid "Invoice"
114msgstr "Facture"
115
116#. module: account_invoice_merge
117#: view:invoice.merge:0
118msgid "Cancel"
119msgstr "Annuler"
120
121#. module: account_invoice_merge
122#: code:addons/account_invoice_merge/wizard/invoice_merge.py:52
123#, python-format
124msgid "Not all invoices are at the same journal!"
125msgstr "Toutes les factures ne sont pas dans le même journal !"
126
127#. module: account_invoice_merge
128#: code:addons/account_invoice_merge/wizard/invoice_merge.py:50
129#, python-format
130msgid "Not all invoices are at the same currency!"
131msgstr "Toutes les factures ne sont pas dans la même devise !"
132
133#. module: account_invoice_merge
134#: view:invoice.merge:0
135msgid "Are you sure you want to merge these invoices ?"
136msgstr "Êtes vous certain de vouloir fusionner ces factures ?"
137
138#. module: account_invoice_merge
139#: code:addons/account_invoice_merge/wizard/invoice_merge.py:46
140#, python-format
141msgid "Not all invoices are for the same partner!"
142msgstr "Toutes les factures ne sont pas du même partenaire !"
143
144
0145
=== added file 'account_invoice_merge/i18n/zh_CN.po'
--- account_invoice_merge/i18n/zh_CN.po 1970-01-01 00:00:00 +0000
+++ account_invoice_merge/i18n/zh_CN.po 2013-08-06 10:17:31 +0000
@@ -0,0 +1,85 @@
1# Translation of OpenERP Server.
2# This file contains the translation of the following modules:
3# * account_invoice_merge
4#
5msgid ""
6msgstr ""
7"Project-Id-Version: OpenERP Server 6.0.3\n"
8"Report-Msgid-Bugs-To: support@openerp.com\n"
9"POT-Creation-Date: 2012-05-07 02:54+0000\n"
10"PO-Revision-Date: 2012-05-07 02:54+0000\n"
11"Last-Translator: <>\n"
12"Language-Team: \n"
13"MIME-Version: 1.0\n"
14"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Transfer-Encoding: \n"
16"Plural-Forms: \n"
17
18#. module: account_invoice_merge
19#: model:ir.model,name:account_invoice_merge.model_account_invoice
20msgid "Invoice"
21msgstr "发票"
22
23#. module: account_invoice_merge
24#: code:addons/account_invoice_merge/wizard/invoice_merge.py:86
25#, python-format
26msgid "Partner Invoice"
27msgstr "合作伙伴发票"
28
29#. module: account_invoice_merge
30#: view:invoice.merge:0
31msgid " Please note that: \n"
32" \n"
33" Invoices will only be merged if: \n"
34" * Invoices are in draft \n"
35" * Invoices belong to the same partner \n"
36" * Invoices are have same company, partner, address, currency, journal, salesman, account, type \n"
37" \n"
38" Lines will only be merged if: \n"
39" * Invoice lines are exactly the same except for the product,quantity and unit \n"
40" "
41msgstr " 请注意: \n"
42" \n"
43"符合下列条件,才会被合并: \n"
44" * 仍在草稿状态的发票。 \n"
45" * 属于同一合作伙伴的发票。 \n"
46" * 属于同一公司,有相同币别,账簿,业务员,科目及类型等的发票。 \n"
47" \n"
48" 符合下列条件,发票明细才会被合并: \n"
49" * 除了明细的产品,数量,价格,金额等字段外,发票明细必须一致。 \n"
50" "
51
52#. module: account_invoice_merge
53#: code:addons/account_invoice_merge/wizard/invoice_merge.py:48
54#, python-format
55msgid "Please select multiple invoice to merge in the list view."
56msgstr "请在列表视图里选择多个发票来进行合并。"
57
58#. module: account_invoice_merge
59#: view:invoice.merge:0
60msgid "Merge Invoices"
61msgstr "合并发票"
62
63#. module: account_invoice_merge
64#: code:addons/account_invoice_merge/wizard/invoice_merge.py:47
65#, python-format
66msgid "Warning"
67msgstr "警告"
68
69#. module: account_invoice_merge
70#: view:invoice.merge:0
71#: model:ir.actions.act_window,name:account_invoice_merge.action_view_invoice_merge
72#: model:ir.model,name:account_invoice_merge.model_invoice_merge
73msgid "Merge Partner Invoice"
74msgstr "合并发票"
75
76#. module: account_invoice_merge
77#: view:invoice.merge:0
78msgid "Cancel"
79msgstr "取消"
80
81#. module: account_invoice_merge
82#: view:invoice.merge:0
83msgid "Are you sure you want to merge these invoices ?"
84msgstr "您确认合并这些发票?"
85
086
=== added file 'account_invoice_merge/invoice.py'
--- account_invoice_merge/invoice.py 1970-01-01 00:00:00 +0000
+++ account_invoice_merge/invoice.py 2013-08-06 10:17:31 +0000
@@ -0,0 +1,187 @@
1# -*- coding: utf-8 -*-
2##############################################################################
3#
4# OpenERP, Open Source Management Solution
5# Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>).
6#
7# This program is free software: you can redistribute it and/or modify
8# it under the terms of the GNU Affero General Public License as
9# published by the Free Software Foundation, either version 3 of the
10# License, or (at your option) any later version.
11#
12# This program is distributed in the hope that it will be useful,
13# but WITHOUT ANY WARRANTY; without even the implied warranty of
14# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15# GNU Affero General Public License for more details.
16#
17# You should have received a copy of the GNU Affero General Public License
18# along with this program. If not, see <http://www.gnu.org/licenses/>.
19#
20##############################################################################
21
22from openerp.osv import orm
23from openerp import netsvc
24from osv.orm import browse_record, browse_null
25
26
27class account_invoice(orm.Model):
28 _inherit = "account.invoice"
29
30 def _get_first_invoice_fields(self, cr, uid, invoice):
31 return {'origin': '%s' % (invoice.origin or '',),
32 'partner_id': invoice.partner_id.id,
33 'journal_id': invoice.journal_id.id,
34 'user_id': invoice.user_id.id,
35 'currency_id': invoice.currency_id.id,
36 'company_id': invoice.company_id.id,
37 'type': invoice.type,
38 'account_id': invoice.account_id.id,
39 'state': 'draft',
40 'reference': '%s' % (invoice.reference or '',),
41 'name': '%s' % (invoice.name or '',),
42 'fiscal_position': invoice.fiscal_position and invoice.fiscal_position.id or False,
43 'payment_term': invoice.payment_term and invoice.payment_term.id or False,
44 'period_id': invoice.period_id and invoice.period_id.id or False,
45 'invoice_line': {},
46 }
47
48 def _get_invoice_key_cols(self, cr, uid, invoice):
49 return ('partner_id', 'user_id', 'type',
50 'account_id', 'currency_id',
51 'journal_id', 'company_id')
52
53 def _get_invoice_line_key_cols(self, cr, uid, invoice_line):
54 return ('name', 'origin', 'discount',
55 'invoice_line_tax_id', 'price_unit',
56 'product_id', 'account_id',
57 'account_analytic_id')
58
59 def do_merge(self, cr, uid, ids, context=None):
60 """
61 To merge similar type of account invoices.
62 Invoices will only be merged if:
63 * Account invoices are in draft
64 * Account invoices belong to the same partner
65 * Account invoices are have same company, partner, address, currency, journal, currency, salesman, account, type
66 Lines will only be merged if:
67 * Invoice lines are exactly the same except for the quantity and unit
68
69 @param self: The object pointer.
70 @param cr: A database cursor
71 @param uid: ID of the user currently logged in
72 @param ids: the ID or list of IDs
73 @param context: A standard dictionary
74
75 @return: new account invoice id
76
77 """
78 wf_service = netsvc.LocalService("workflow")
79
80 def make_key(br, fields):
81 list_key = []
82 for field in fields:
83 field_val = getattr(br, field)
84 if field in ('product_id', 'account_id'):
85 if not field_val:
86 field_val = False
87 if isinstance(field_val, browse_record):
88 field_val = field_val.id
89 elif isinstance(field_val, browse_null):
90 field_val = False
91 elif isinstance(field_val, list):
92 field_val = ((6, 0, tuple([v.id for v in field_val])),)
93 list_key.append((field, field_val))
94 list_key.sort()
95 return tuple(list_key)
96
97 # compute what the new invoices should contain
98
99 new_invoices = {}
100 draft_invoices = [invoice
101 for invoice in self.browse(cr, uid, ids, context=context)
102 if invoice.state == 'draft']
103 seen_origins = {}
104 seen_client_refs = {}
105
106 for account_invoice in draft_invoices:
107 invoice_key = make_key(account_invoice, self._get_invoice_key_cols(cr, uid, account_invoice))
108 new_invoice = new_invoices.setdefault(invoice_key, ({}, []))
109 origins = seen_origins.setdefault(invoice_key, set())
110 client_refs = seen_client_refs.setdefault(invoice_key, set())
111 new_invoice[1].append(account_invoice.id)
112 invoice_infos = new_invoice[0]
113 if not invoice_infos:
114 invoice_infos.update(self._get_first_invoice_fields(cr, uid, account_invoice))
115 origins.add(account_invoice.origin)
116 client_refs.add(account_invoice.reference)
117 else:
118 if account_invoice.name:
119 invoice_infos['name'] = (invoice_infos['name'] or '') + (' %s' % (account_invoice.name,))
120 if account_invoice.origin and account_invoice.origin not in origins:
121 invoice_infos['origin'] = (invoice_infos['origin'] or '') + ' ' + account_invoice.origin
122 origins.add(account_invoice.origin)
123 if account_invoice.reference and account_invoice.reference not in client_refs:
124 invoice_infos['reference'] = (invoice_infos['reference'] or '') + (' %s' % (account_invoice.reference,))
125 client_refs.add(account_invoice.reference)
126
127 for invoice_line in account_invoice.invoice_line:
128 line_key = make_key(invoice_line, self._get_invoice_line_key_cols(cr, uid, invoice_line))
129 o_line = invoice_infos['invoice_line'].setdefault(line_key, {})
130 if o_line:
131 # merge the line with an existing line
132 o_line['quantity'] += invoice_line.quantity * invoice_line.uos_id.factor / o_line['uom_factor']
133 else:
134 # append a new "standalone" line
135 for field in ('quantity', 'uos_id'):
136 field_val = getattr(invoice_line, field)
137 if isinstance(field_val, browse_record):
138 field_val = field_val.id
139 o_line[field] = field_val
140 o_line['uom_factor'] = invoice_line.uos_id and invoice_line.uos_id.factor or 1.0
141
142 allinvoices = []
143 invoices_info = {}
144 for invoice_key, (invoice_data, old_ids) in new_invoices.iteritems():
145 # skip merges with only one invoice
146 if len(old_ids) < 2:
147 allinvoices += (old_ids or [])
148 continue
149
150 # cleanup invoice line data
151 for key, value in invoice_data['invoice_line'].iteritems():
152 del value['uom_factor']
153 value.update(dict(key))
154 invoice_data['invoice_line'] = [(0, 0, value) for value in invoice_data['invoice_line'].itervalues()]
155
156 # create the new invoice
157 newinvoice_id = self.create(cr, uid, invoice_data)
158 invoices_info.update({newinvoice_id: old_ids})
159 allinvoices.append(newinvoice_id)
160
161 # make triggers pointing to the old invoices point to the new invoice
162 for old_id in old_ids:
163 wf_service.trg_redirect(uid, 'account.invoice', old_id, newinvoice_id, cr)
164 wf_service.trg_validate(uid, 'account.invoice', old_id, 'invoice_cancel', cr)
165
166 # make link between original sale order or purchase order
167 so_obj = self.pool.get('sale.order') # None if sale is not installed
168 order_line_obj = self.pool.get('sale.order.line')
169 invoice_line_obj = self.pool.get('account.invoice.line')
170 po_obj = self.pool.get('purchase.order') # None if purchase is not installed
171 for new_invoice_id in invoices_info:
172 if so_obj is not None:
173 todo_ids = so_obj.search(cr, uid, [('invoice_ids', 'in', invoices_info[new_invoice_id])], context=context)
174 for org_so in so_obj.browse(cr, uid, todo_ids, context=context):
175 so_obj.write(cr, uid, [org_so.id], {'invoice_ids': [(4, new_invoice_id)]}, context)
176 for so_line in org_so.order_line:
177 invoice_line_ids = invoice_line_obj.search(cr, uid, [('product_id', '=', so_line.product_id.id), ('invoice_id', '=', new_invoice_id)])
178 if invoice_line_ids:
179 order_line_obj.write(cr, uid, [so_line.id], {'invoice_lines': [(6, 0, invoice_line_ids)]}, context=context)
180 if po_obj is not None:
181 todo_ids = po_obj.search(cr, uid, [('invoice_ids', 'in', invoices_info[new_invoice_id])], context=context)
182 for org_po in po_obj.browse(cr, uid, todo_ids, context=context):
183 po_obj.write(cr, uid, [org_po.id], {'invoice_ids': [(4, new_invoice_id)]}, context)
184
185 return invoices_info
186
187# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
0188
=== added directory 'account_invoice_merge/wizard'
=== added file 'account_invoice_merge/wizard/__init__.py'
--- account_invoice_merge/wizard/__init__.py 1970-01-01 00:00:00 +0000
+++ account_invoice_merge/wizard/__init__.py 2013-08-06 10:17:31 +0000
@@ -0,0 +1,25 @@
1# -*- coding: utf-8 -*-
2##############################################################################
3#
4# OpenERP, Open Source Management Solution
5# Copyright (c) 2010-2011 Elico Corp. All Rights Reserved.
6#
7# This program is free software: you can redistribute it and/or modify
8# it under the terms of the GNU Affero General Public License as
9# published by the Free Software Foundation, either version 3 of the
10# License, or (at your option) any later version.
11#
12# This program is distributed in the hope that it will be useful,
13# but WITHOUT ANY WARRANTY; without even the implied warranty of
14# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15# GNU Affero General Public License for more details.
16#
17# You should have received a copy of the GNU Affero General Public License
18# along with this program. If not, see <http://www.gnu.org/licenses/>.
19#
20##############################################################################
21
22import invoice_merge
23
24# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
25
026
=== added file 'account_invoice_merge/wizard/invoice_merge.py'
--- account_invoice_merge/wizard/invoice_merge.py 1970-01-01 00:00:00 +0000
+++ account_invoice_merge/wizard/invoice_merge.py 2013-08-06 10:17:31 +0000
@@ -0,0 +1,105 @@
1# -*- coding: utf-8 -*-
2##############################################################################
3#
4# OpenERP, Open Source Management Solution
5# Copyright (c) 2010-2011 Elico Corp. All Rights Reserved.
6#
7# This program is free software: you can redistribute it and/or modify
8# it under the terms of the GNU Affero General Public License as
9# published by the Free Software Foundation, either version 3 of the
10# License, or (at your option) any later version.
11#
12# This program is distributed in the hope that it will be useful,
13# but WITHOUT ANY WARRANTY; without even the implied warranty of
14# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15# GNU Affero General Public License for more details.
16#
17# You should have received a copy of the GNU Affero General Public License
18# along with this program. If not, see <http://www.gnu.org/licenses/>.
19#
20##############################################################################
21
22from openerp.osv import orm
23from openerp.tools.translate import _
24
25
26class invoice_merge(orm.TransientModel):
27 _name = "invoice.merge"
28 _description = "Merge Partner Invoice"
29
30 def _dirty_check(self, cr, uid, context):
31 if context.get('active_model', '') == 'account.invoice':
32 ids = context['active_ids']
33 if len(ids) < 2:
34 raise orm.except_orm(_('Warning!'), _('Please select multiple invoice to merge in the list view.'))
35 inv_obj = self.pool.get('account.invoice')
36 invs = inv_obj.read(cr, uid, ids, ['account_id', 'state', 'type', 'company_id',
37 'partner_id', 'currency_id', 'journal_id'])
38 for d in invs:
39 if d['state'] != 'draft':
40 raise orm.except_orm(_('Warning'), _('At least one of the selected invoices is %s!') % d['state'])
41 if (d['account_id'] != invs[0]['account_id']):
42 raise orm.except_orm(_('Warning'), _('Not all invoices use the same account!'))
43 if (d['company_id'] != invs[0]['company_id']):
44 raise orm.except_orm(_('Warning'), _('Not all invoices are at the same company!'))
45 if (d['partner_id'] != invs[0]['partner_id']):
46 raise orm.except_orm(_('Warning'), _('Not all invoices are for the same partner!'))
47 if (d['type'] != invs[0]['type']):
48 raise orm.except_orm(_('Warning'), _('Not all invoices are of the same type!'))
49 if (d['currency_id'] != invs[0]['currency_id']):
50 raise orm.except_orm(_('Warning'), _('Not all invoices are at the same currency!'))
51 if (d['journal_id'] != invs[0]['journal_id']):
52 raise orm.except_orm(_('Warning'), _('Not all invoices are at the same journal!'))
53 return {}
54
55 def fields_view_get(self, cr, uid, view_id=None, view_type='form',
56 context=None, toolbar=False, submenu=False):
57 """
58 Changes the view dynamically
59 @param self: The object pointer.
60 @param cr: A database cursor
61 @param uid: ID of the user currently logged in
62 @param context: A standard dictionary
63 @return: New arch of view.
64 """
65 if context is None:
66 context = {}
67 res = super(invoice_merge, self).fields_view_get(cr, uid, view_id=view_id, view_type=view_type, context=context, toolbar=toolbar, submenu=False)
68 self._dirty_check(cr, uid, context)
69 return res
70
71 def merge_invoices(self, cr, uid, ids, context=None):
72 """
73 To merge similar type of account invoices.
74
75 @param self: The object pointer.
76 @param cr: A database cursor
77 @param uid: ID of the user currently logged in
78 @param ids: the ID or list of IDs
79 @param context: A standard dictionary
80
81 @return: account invoice view
82
83 """
84 inv_obj = self.pool.get('account.invoice')
85 mod_obj = self.pool.get('ir.model.data')
86
87 if context is None:
88 context = {}
89 result = mod_obj._get_id(cr, uid, 'account', 'invoice_form')
90 id = mod_obj.read(cr, uid, result, ['res_id'])
91
92 allinvoices = inv_obj.do_merge(cr, uid, context.get('active_ids', []), context)
93
94 return {
95 'domain': "[('id','in', [" + ','.join(map(str, allinvoices.keys())) + "])]",
96 'name': _('Partner Invoice'),
97 'view_type': 'form',
98 'view_mode': 'tree,form',
99 'res_model': 'account.invoice',
100 'view_id': False,
101 'type': 'ir.actions.act_window',
102 'search_view_id': id['res_id']
103 }
104
105# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
0106
=== added file 'account_invoice_merge/wizard/invoice_merge_view.xml'
--- account_invoice_merge/wizard/invoice_merge_view.xml 1970-01-01 00:00:00 +0000
+++ account_invoice_merge/wizard/invoice_merge_view.xml 2013-08-06 10:17:31 +0000
@@ -0,0 +1,40 @@
1<?xml version="1.0" encoding="utf-8"?>
2<openerp>
3 <data>
4 <record id="view_invoice_merge" model="ir.ui.view">
5 <field name="name">Merger Partner Invoice</field>
6 <field name="model">invoice.merge</field>
7 <field name="arch" type="xml">
8 <form string="Merge Partner Invoice" version="7.0">
9 <group>
10 <separator
11 string="Are you sure you want to merge these invoices ?"
12 colspan="4" />
13 <p>
14Please note that:<br/><br/>
15Invoices will only be merged if:<br/>
16* Invoices are in draft<br/>
17* Invoices belong to the same partner<br/>
18* Invoices are have same company, partner, address, currency, journal, salesman, account, type<br/><br/>
19Lines will only be merged if:<br/>
20* Invoice lines are exactly the same except for the product,quantity and unit<br/>
21 </p>
22 </group>
23 <footer>
24 <button name="merge_invoices" string="Merge Invoices"
25 type="object" class="oe_highlight" />
26 or
27 <button string="Cancel" class="oe_link"
28 special="cancel" />
29 </footer>
30 </form>
31 </field>
32 </record>
33
34 <act_window name="Merge Partner Invoice" res_model="invoice.merge"
35 src_model="account.invoice" view_mode="form" target="new"
36 multi="True" key2="client_action_multi" id="action_view_invoice_merge" />
37
38 </data>
39</openerp>
40

Subscribers

People subscribed via source and target branches