Merge lp:~yannick-buron/partner-contact-management/partner-contact-management into lp:~partner-contact-core-editors/partner-contact-management/7.0

Proposed by YannickB (YOLO consulting)
Status: Needs review
Proposed branch: lp:~yannick-buron/partner-contact-management/partner-contact-management
Merge into: lp:~partner-contact-core-editors/partner-contact-management/7.0
Diff against target: 405 lines (+368/-0)
7 files modified
base_partner_customer_fiability/__init__.py (+21/-0)
base_partner_customer_fiability/__openerp__.py (+37/-0)
base_partner_customer_fiability/base_partner_customer_fiability.py (+115/-0)
base_partner_customer_fiability/base_partner_customer_fiability_view.xml (+71/-0)
base_partner_customer_fiability/i18n/base_partner_customer_fiability.pot (+61/-0)
base_partner_customer_fiability/i18n/fr.po (+61/-0)
base_partner_customer_fiability/security/ir.model.access.csv (+2/-0)
To merge this branch: bzr merge lp:~yannick-buron/partner-contact-management/partner-contact-management
Reviewer Review Type Date Requested Status
Lorenzo Battistini (community) Needs Resubmitting
Pedro Manuel Baeza code review Needs Fixing
Review via email: mp+221742@code.launchpad.net

Description of the change

Hello everybody,

Here is a little module I use for one of my customer. It is used for managing the fiability level of the customers, to know if they will pay or not.

It's really simple, but I hope it is a good base for adding more complex features later. What do you think?

To post a comment you must log in.
Revision history for this message
Pedro Manuel Baeza (pedro.baeza) wrote :

Hi, Yannick, thanks for the contribution. Some remarks:

- Please respect PEP8.
- Use orm.Model instead of osv.osv.
- Do you need all imports in base_partner_customer_fiability.py?
- Put relative imports in __init__.py.

From functional point of view:
- Why do you need a res.partner.customer.fiability model? Isn't better to have a calculated field that makes the average from invoices delays?
- I'm also worried by the overall performance of the system, due to payment_delay is not stored and general fiability of the customer changes with each paid invoice and the way you make it. You can improving calling methods with packed ids, using read for reading only one data, and so on.

Changing approach, I would put a cron job that updates once a day all the data, storing them. This only means a no real-time update, but with little differences.

Regards.

review: Needs Fixing (code review)
Revision history for this message
Lorenzo Battistini (elbati) wrote :

This project is now hosted on https://github.com/OCA/partner-contact. Please move your proposal there. This guide may help you https://github.com/OCA/maintainers-tools/wiki/How-to-move-a-Merge-Proposal-to-GitHub

review: Needs Resubmitting

Unmerged revisions

40. By yannick@yannick_buron.synerpgy.fr

[ADD] Module base_partner_customer_fiability

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== added directory 'base_partner_customer_fiability'
=== added file 'base_partner_customer_fiability/__init__.py'
--- base_partner_customer_fiability/__init__.py 1970-01-01 00:00:00 +0000
+++ base_partner_customer_fiability/__init__.py 2014-06-02 14:11:22 +0000
@@ -0,0 +1,21 @@
1# -*- coding: utf-8 -*-
2##############################################################################
3#
4# Copyright (C) Yannick Buron.
5#
6# This program is free software: you can redistribute it and/or modify
7# it under the terms of the GNU Affero General Public License as
8# published by the Free Software Foundation, either version 3 of the
9# License, or (at your option) any later version.
10#
11# This program is distributed in the hope that it will be useful,
12# but WITHOUT ANY WARRANTY; without even the implied warranty of
13# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14# GNU Affero General Public License for more details.
15#
16# You should have received a copy of the GNU Affero General Public License
17# along with this program. If not, see <http://www.gnu.org/licenses/>.
18#
19##############################################################################
20
21import base_partner_customer_fiability
022
=== added file 'base_partner_customer_fiability/__openerp__.py'
--- base_partner_customer_fiability/__openerp__.py 1970-01-01 00:00:00 +0000
+++ base_partner_customer_fiability/__openerp__.py 2014-06-02 14:11:22 +0000
@@ -0,0 +1,37 @@
1# -*- coding: utf-8 -*-
2##############################################################################
3#
4# Copyright Yannick Buron 2014
5#
6# This program is free software: you can redistribute it and/or modify
7# it under the terms of the GNU Affero General Public License as
8# published by the Free Software Foundation, either version 3 of the
9# License, or (at your option) any later version.
10#
11# This program is distributed in the hope that it will be useful,
12# but WITHOUT ANY WARRANTY; without even the implied warranty of
13# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14# GNU Affero General Public License for more details.
15#
16# You should have received a copy of the GNU Affero General Public License
17# along with this program. If not, see <http://www.gnu.org/licenses/>.
18#
19##############################################################################
20{
21 'name' : 'Customer Fiability',
22 'version' : '1',
23 'author' : 'Yannick Buron',
24 'category' : 'Other',
25 'description' : """
26This module create a status field in partner which indicate the fiability of this customer. It works by computing the average delay before the customer pay his invoices.
27 """,
28 'website': 'http://www.yolo-consulting.net',
29 'depends' : ['account'],
30 'data': [
31 'base_partner_customer_fiability_view.xml',
32 'security/ir.model.access.csv'
33 ],
34 'installable': True,
35 'auto_install': False,
36}
37# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
038
=== added file 'base_partner_customer_fiability/base_partner_customer_fiability.py'
--- base_partner_customer_fiability/base_partner_customer_fiability.py 1970-01-01 00:00:00 +0000
+++ base_partner_customer_fiability/base_partner_customer_fiability.py 2014-06-02 14:11:22 +0000
@@ -0,0 +1,115 @@
1##############################################################################
2#
3# Copyright Yannick Buron 2014
4#
5# This program is free software: you can redistribute it and/or modify
6# it under the terms of the GNU Affero General Public License as
7# published by the Free Software Foundation, either version 3 of the
8# License, or (at your option) any later version.
9#
10# This program is distributed in the hope that it will be useful,
11# but WITHOUT ANY WARRANTY; without even the implied warranty of
12# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13# GNU Affero General Public License for more details.
14#
15# You should have received a copy of the GNU Affero General Public License
16# along with this program. If not, see <http://www.gnu.org/licenses/>.
17#
18##############################################################################
19
20
21from datetime import datetime, timedelta
22import logging
23_logger = logging.getLogger(__name__)
24
25import openerp
26from openerp import SUPERUSER_ID, tools
27from openerp.osv import fields, osv
28from openerp.tools.translate import _
29from openerp.tools.float_utils import float_round
30import openerp.addons.decimal_precision as dp
31from collections import defaultdict
32import time
33
34class account_invoice(osv.osv):
35
36 _inherit = 'account.invoice'
37
38 def _get_payment_delay(self, cr, uid, ids, field, args, context=None):
39 res = {}
40 now = datetime.now()
41
42 for invoice in self.browse(cr, uid, ids):
43 res[invoice.id] = 0
44 if invoice.date_due:
45 date_due = datetime.strptime(invoice.date_due, "%Y-%m-%d")
46 if invoice.state == 'paid':
47 payment_date = False
48 for payment in invoice.payment_ids:
49 payment_date = payment.date
50 if payment_date:
51 res[invoice.id] = (datetime.strptime(payment_date, "%Y-%m-%d") - date_due).days
52 else:
53 res[invoice.id] = (now - date_due).days
54 return res
55
56 _columns = {
57 'payment_delay':fields.function(_get_payment_delay, type='integer',string="Payment delay"),
58 }
59
60 def confirm_paid(self, cr, uid, ids, context=None):
61
62 partner_obj = self.pool.get('res.partner')
63
64 res = super(account_invoice, self).confirm_paid(cr, uid, ids, context=context)
65
66 for invoice in self.browse(cr, uid, ids, context=context):
67 partner_obj.compute_customer_fiability(cr, uid, [invoice.partner_id.id], context=context)
68
69 return res
70
71
72
73class res_partner_customer_fiability(osv.osv):
74
75 _name = 'res.partner.customer.fiability'
76
77 _columns = {
78 'name': fields.char('Fiability', size=128, required=True, translate=True),
79 'days': fields.integer('Days', required=True),
80 }
81
82 _order = 'days'
83
84
85class res_partner(osv.osv):
86 _inherit = 'res.partner'
87
88 _columns = {
89 'customer_fiability_id': fields.many2one('res.partner.customer.fiability', 'Fiability'),
90 'override_customer_fiability': fields.boolean('Override fiability?')
91 }
92
93 def compute_customer_fiability(self, cr, uid, ids, context=None):
94 invoice_obj = self.pool.get('account.invoice')
95 fiability_obj = self.pool.get('res.partner.customer.fiability')
96
97 for partner in self.browse(cr, uid, ids, context=context):
98 if not partner.override_customer_fiability:
99 invoice_ids = invoice_obj.search(cr, uid, [('partner_id','=',partner.id)], context=context)
100 i = 0
101 sum = 0
102 for invoice in invoice_obj.browse(cr, uid, invoice_ids, context=context):
103 sum += invoice.payment_delay
104 i += 1
105 average = 0
106 if i:
107 average = sum / i
108
109 fiability_id = False
110 fiability_ids = fiability_obj.search(cr, uid, [], context=context)
111 for fiability in fiability_obj.browse(cr, uid, fiability_ids, context=context):
112 if fiability.days < average:
113 fiability_id = fiability.id
114
115 self.write(cr, uid, [partner.id], {'customer_fiability_id': fiability_id}, context=context)
0116
=== added file 'base_partner_customer_fiability/base_partner_customer_fiability_view.xml'
--- base_partner_customer_fiability/base_partner_customer_fiability_view.xml 1970-01-01 00:00:00 +0000
+++ base_partner_customer_fiability/base_partner_customer_fiability_view.xml 2014-06-02 14:11:22 +0000
@@ -0,0 +1,71 @@
1<?xml version="1.0" ?>
2<openerp>
3 <data>
4
5 <record id="res_partner_customer_fiability_form" model="ir.ui.view">
6 <field name="name">res.partner.customer.fiability.form</field>
7 <field name="model">res.partner</field>
8 <field name="inherit_id" ref="base.view_partner_form"/>
9 <field name="arch" type="xml">
10 <field name="email" position="after">
11 <field name="customer_fiability_id" readonly="1"/>
12 <field name="override_customer_fiability" invisible="1"/>
13 </field>
14 </field>
15 </record>
16
17 <record id="res_partner_customer_fiability_form_manager" model="ir.ui.view">
18 <field name="name">res.partner.customer.fiability.form.manager</field>
19 <field name="model">res.partner</field>
20 <field name="inherit_id" ref="res_partner_customer_fiability_form"/>
21 <field name="groups_id" eval="[(6, 0, [ref('account.group_account_manager') ])]"/>
22 <field name="arch" type="xml">
23 <field name='customer_fiability_id' position="attributes">
24 <attribute name="readonly">0</attribute>
25 <attribute name="attrs">{'readonly': [('override_customer_fiability','=',False)]}</attribute>
26 </field>
27 <field name='override_customer_fiability' position="attributes">
28 <attribute name="invisible">0</attribute>
29 </field>
30
31 </field>
32 </record>
33
34
35 <record id="customer_fiability_form" model="ir.ui.view">
36 <field name="name">customer.fiability.form</field>
37 <field name="model">res.partner.customer.fiability</field>
38 <field name="arch" type="xml">
39 <form string="Fiability" version="7.0">
40 <group col="4">
41 <field name="name"/>
42 <field name="days"/>
43 </group>
44 </form>
45 </field>
46 </record>
47
48 <record id="customer_fiability_tree" model="ir.ui.view">
49 <field name="name">customer.fiability.tree</field>
50 <field name="model">res.partner.customer.fiability</field>
51 <field name="arch" type="xml">
52 <tree string="Fiability">
53 <field name="name"/>
54 <field name="days"/>
55 </tree>
56 </field>
57 </record>
58
59
60 <record id="action_customer_fiability_tree" model="ir.actions.act_window">
61 <field name="name">Fiability</field>
62 <field name="res_model">res.partner.customer.fiability</field>
63 <field name="view_type">form</field>
64 <field name="view_mode">tree,form</field>
65 </record>
66
67 <menuitem action="action_customer_fiability_tree" id="menu_action_customer_fiability_tree" parent="account.menu_configuration_misc"/>
68
69
70 </data>
71</openerp>
072
=== added directory 'base_partner_customer_fiability/i18n'
=== added file 'base_partner_customer_fiability/i18n/base_partner_customer_fiability.pot'
--- base_partner_customer_fiability/i18n/base_partner_customer_fiability.pot 1970-01-01 00:00:00 +0000
+++ base_partner_customer_fiability/i18n/base_partner_customer_fiability.pot 2014-06-02 14:11:22 +0000
@@ -0,0 +1,61 @@
1# Translation of OpenERP Server.
2# This file contains the translation of the following modules:
3# * base_partner_customer_fiability
4#
5msgid ""
6msgstr ""
7"Project-Id-Version: OpenERP Server 7.0\n"
8"Report-Msgid-Bugs-To: \n"
9"POT-Creation-Date: 2014-06-02 13:53+0000\n"
10"PO-Revision-Date: 2014-06-02 13:53+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: base_partner_customer_fiability
19#: field:res.partner.customer.fiability,days:0
20msgid "Days"
21msgstr ""
22
23#. module: base_partner_customer_fiability
24#: field:account.invoice,payment_delay:0
25msgid "Payment delay"
26msgstr ""
27
28#. module: base_partner_customer_fiability
29#: model:ir.model,name:base_partner_customer_fiability.model_res_partner_customer_fiability
30msgid "res.partner.customer.fiability"
31msgstr ""
32
33#. module: base_partner_customer_fiability
34#: model:ir.model,name:base_partner_customer_fiability.model_account_invoice
35msgid "Invoice"
36msgstr ""
37
38#. module: base_partner_customer_fiability
39#: model:ir.model,name:base_partner_customer_fiability.model_res_partner
40msgid "Partner"
41msgstr ""
42
43#. module: base_partner_customer_fiability
44#: field:res.partner,override_customer_fiability:0
45msgid "Override fiability?"
46msgstr ""
47
48#. module: base_partner_customer_fiability
49#: view:res.partner:0
50msgid "{'readonly': [('override_customer_fiability','=',False)]}"
51msgstr ""
52
53#. module: base_partner_customer_fiability
54#: model:ir.actions.act_window,name:base_partner_customer_fiability.action_customer_fiability_tree
55#: model:ir.ui.menu,name:base_partner_customer_fiability.menu_action_customer_fiability_tree
56#: field:res.partner,customer_fiability_id:0
57#: view:res.partner.customer.fiability:0
58#: field:res.partner.customer.fiability,name:0
59msgid "Fiability"
60msgstr ""
61
062
=== added file 'base_partner_customer_fiability/i18n/fr.po'
--- base_partner_customer_fiability/i18n/fr.po 1970-01-01 00:00:00 +0000
+++ base_partner_customer_fiability/i18n/fr.po 2014-06-02 14:11:22 +0000
@@ -0,0 +1,61 @@
1# Translation of OpenERP Server.
2# This file contains the translation of the following modules:
3# * base_partner_customer_fiability
4#
5msgid ""
6msgstr ""
7"Project-Id-Version: OpenERP Server 7.0\n"
8"Report-Msgid-Bugs-To: \n"
9"POT-Creation-Date: 2014-06-02 13:53+0000\n"
10"PO-Revision-Date: 2014-06-02 13:53+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: base_partner_customer_fiability
19#: field:res.partner.customer.fiability,days:0
20msgid "Days"
21msgstr "Jours"
22
23#. module: base_partner_customer_fiability
24#: field:account.invoice,payment_delay:0
25msgid "Payment delay"
26msgstr "Délai de paiement"
27
28#. module: base_partner_customer_fiability
29#: model:ir.model,name:base_partner_customer_fiability.model_res_partner_customer_fiability
30msgid "res.partner.customer.fiability"
31msgstr ""
32
33#. module: base_partner_customer_fiability
34#: model:ir.model,name:base_partner_customer_fiability.model_account_invoice
35msgid "Invoice"
36msgstr "Facture"
37
38#. module: base_partner_customer_fiability
39#: model:ir.model,name:base_partner_customer_fiability.model_res_partner
40msgid "Partner"
41msgstr "Partenaire"
42
43#. module: base_partner_customer_fiability
44#: field:res.partner,override_customer_fiability:0
45msgid "Override fiability?"
46msgstr "Surcharger fiabilité?"
47
48#. module: base_partner_customer_fiability
49#: view:res.partner:0
50msgid "{'readonly': [('override_customer_fiability','=',False)]}"
51msgstr ""
52
53#. module: base_partner_customer_fiability
54#: model:ir.actions.act_window,name:base_partner_customer_fiability.action_customer_fiability_tree
55#: model:ir.ui.menu,name:base_partner_customer_fiability.menu_action_customer_fiability_tree
56#: field:res.partner,customer_fiability_id:0
57#: view:res.partner.customer.fiability:0
58#: field:res.partner.customer.fiability,name:0
59msgid "Fiability"
60msgstr "Fiabilité"
61
062
=== added directory 'base_partner_customer_fiability/security'
=== added file 'base_partner_customer_fiability/security/ir.model.access.csv'
--- base_partner_customer_fiability/security/ir.model.access.csv 1970-01-01 00:00:00 +0000
+++ base_partner_customer_fiability/security/ir.model.access.csv 2014-06-02 14:11:22 +0000
@@ -0,0 +1,2 @@
1id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
2res_partner_customer_fiability_manager,res_partner_customer_fiability manager,model_res_partner_customer_fiability,account.group_account_manager,1,1,1,1