1
# -*- coding: utf-8 -*-
2
##############################################################################
4
# OpenERP, Open Source Management Solution
5
# Copyright (C) MSF, TeMPO Consulting.
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.
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.
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/>.
20
##############################################################################
22
from osv import fields, osv
23
import decimal_precision as dp
24
from tools.misc import flatten
26
class analytic_distribution(osv.osv):
27
_name = "analytic.distribution"
30
'name': fields.char('Name', size=12, required=True),
31
'global_distribution': fields.boolean('Is this distribution copied from the global distribution'),
32
'analytic_lines': fields.one2many('account.analytic.line', 'distribution_id', 'Analytic Lines'),
33
'invoice_ids': fields.one2many('account.invoice', 'analytic_distribution_id', string="Invoices"),
34
'invoice_line_ids': fields.one2many('account.invoice.line', 'analytic_distribution_id', string="Invoice Lines"),
35
'register_line_ids': fields.one2many('account.bank.statement.line', 'analytic_distribution_id', string="Register Lines"),
36
'move_line_ids': fields.one2many('account.move.line', 'analytic_distribution_id', string="Move Lines"),
40
'name': lambda *a: 'Distribution',
41
'global_distribution': lambda *a: False,
44
analytic_distribution()
46
class distribution_line(osv.osv):
47
_name = "distribution.line"
50
'name': fields.char('Name', size=64, required=True),
51
"distribution_id": fields.many2one('analytic.distribution', 'Associated Analytic Distribution', ondelete='cascade'),
52
"analytic_id": fields.many2one('account.analytic.account', 'Analytical Account'),
53
"amount": fields.float('Amount', required=True),
54
"percentage": fields.float('Percentage'),
55
"currency_id": fields.many2one('res.currency', 'Currency', required=True),
56
"date": fields.date(string="Date"),
57
"source_date": fields.date(string="Source Date", help="This date is for source_date for analytic lines"),
61
'name': 'Distribution Line',
66
class cost_center_distribution_line(osv.osv):
67
_name = "cost.center.distribution.line"
68
_inherit = "distribution.line"
70
cost_center_distribution_line()
72
class funding_pool_distribution_line(osv.osv):
73
_name = "funding.pool.distribution.line"
74
_inherit = "distribution.line"
76
"cost_center_id": fields.many2one('account.analytic.account', 'Cost Center Account'),
79
funding_pool_distribution_line()
81
class free_1_distribution_line(osv.osv):
82
_name = "free.1.distribution.line"
83
_inherit = "distribution.line"
85
free_1_distribution_line()
87
class free_2_distribution_line(osv.osv):
88
_name = "free.2.distribution.line"
89
_inherit = "distribution.line"
91
free_2_distribution_line()
93
class analytic_distribution(osv.osv):
94
_inherit = "analytic.distribution"
97
'cost_center_lines': fields.one2many('cost.center.distribution.line', 'distribution_id', 'Cost Center Distribution'),
98
'funding_pool_lines': fields.one2many('funding.pool.distribution.line', 'distribution_id', 'Funding Pool Distribution'),
99
'free_1_lines': fields.one2many('free.1.distribution.line', 'distribution_id', 'Free 1 Distribution'),
100
'free_2_lines': fields.one2many('free.2.distribution.line', 'distribution_id', 'Free 2 Distribution'),
103
def copy_from_global_distribution(self, cr, uid, source_id, destination_id, destination_amount, destination_currency, context={}):
104
cc_distrib_line_obj = self.pool.get('cost.center.distribution.line')
105
fp_distrib_line_obj = self.pool.get('funding.pool.distribution.line')
106
f1_distrib_line_obj = self.pool.get('free.1.distribution.line')
107
f2_distrib_line_obj = self.pool.get('free.2.distribution.line')
108
source_obj = self.browse(cr, uid, source_id, context=context)
109
destination_obj = self.browse(cr, uid, destination_id, context=context)
111
for cost_center_line in destination_obj.cost_center_lines:
112
cc_distrib_line_obj.unlink(cr, uid, cost_center_line.id)
113
for funding_pool_line in destination_obj.funding_pool_lines:
114
fp_distrib_line_obj.unlink(cr, uid, funding_pool_line.id)
115
for free_1_line in destination_obj.free_1_lines:
116
f1_distrib_line_obj.unlink(cr, uid, free_1_line.id)
117
for free_2_line in destination_obj.free_2_lines:
118
f2_distrib_line_obj.unlink(cr, uid, free_2_line.id)
121
vals['name'] = source_obj.name
122
vals['global_distribution'] = True
123
for source_cost_center_line in source_obj.cost_center_lines:
124
distrib_line_vals = {
125
'name': source_cost_center_line.name,
126
'analytic_id': source_cost_center_line.analytic_id.id,
127
'percentage': source_cost_center_line.percentage,
128
'amount': round(source_cost_center_line.percentage * destination_amount) / 100.0,
129
'distribution_id': destination_id,
130
'currency_id': destination_currency,
131
'date': source_cost_center_line.date or False,
132
'source_date': source_cost_center_line.source_date or False,
134
cc_distrib_line_obj.create(cr, uid, distrib_line_vals, context=context)
135
for source_funding_pool_line in source_obj.funding_pool_lines:
136
distrib_line_vals = {
137
'name': source_funding_pool_line.name,
138
'analytic_id': source_funding_pool_line.analytic_id.id,
139
'cost_center_id': source_funding_pool_line.cost_center_id.id,
140
'percentage': source_funding_pool_line.percentage,
141
'amount': round(source_funding_pool_line.percentage * destination_amount) / 100.0,
142
'distribution_id': destination_id,
143
'currency_id': destination_currency,
144
'date': source_funding_pool_line.date or False,
145
'source_date': source_funding_pool_line.source_date or False,
147
fp_distrib_line_obj.create(cr, uid, distrib_line_vals, context=context)
148
for source_free_1_line in source_obj.free_1_lines:
149
distrib_line_vals = {
150
'name': source_free_1_line.name,
151
'analytic_id': source_free_1_line.analytic_id.id,
152
'percentage': source_free_1_line.percentage,
153
'amount': round(source_free_1_line.percentage * destination_amount) / 100.0,
154
'distribution_id': destination_id,
155
'currency_id': destination_currency,
156
'date': source_free_1_line.date or False,
157
'source_date': source_free_1_line.source_date or False,
159
f1_distrib_line_obj.create(cr, uid, distrib_line_vals, context=context)
160
for source_free_2_line in source_obj.free_2_lines:
161
distrib_line_vals = {
162
'name': source_free_2_line.name,
163
'analytic_id': source_free_2_line.analytic_id.id,
164
'percentage': source_free_2_line.percentage,
165
'amount': round(source_free_2_line.percentage * destination_amount) / 100.0,
166
'distribution_id': destination_id,
167
'currency_id': destination_currency,
168
'date': source_free_2_line.date or False,
169
'source_date': source_free_2_line.source_date or False,
171
f2_distrib_line_obj.create(cr, uid, distrib_line_vals, context=context)
172
if destination_obj.invoice_line_ids:
173
self.pool.get('account.invoice.line').create_engagement_lines(cr, uid, [x.id for x in destination_obj.invoice_line_ids])
174
return super(analytic_distribution, self).write(cr, uid, [destination_id], vals, context=context)
176
def update_distribution_line_amount(self, cr, uid, ids, amount=False, context={}):
178
Update amount on distribution lines for given distribution (ids)
183
if isinstance(ids, (int, long)):
187
# Process distributions
188
for distrib_id in ids:
189
for dl_name in ['cost.center.distribution.line', 'funding.pool.distribution.line', 'free.1.distribution.line', 'free.2.distribution.line']:
190
dl_obj = self.pool.get(dl_name)
191
dl_ids = dl_obj.search(cr, uid, [('distribution_id', '=', distrib_id)], context=context)
192
for dl in dl_obj.browse(cr, uid, dl_ids, context=context):
194
'amount': round(dl.percentage * amount) / 100.0,
196
dl_obj.write(cr, uid, [dl.id], dl_vals, context=context)
199
def copy(self, cr, uid, id, defaults={}, context={}):
201
Copy an analytic distribution without the one2many links
206
'analytic_lines': False,
207
'invoice_ids': False,
208
'invoice_line_ids': False,
209
'register_line_ids': False,
210
'move_line_ids': False,
212
return super(osv.osv, self).copy(cr, uid, id, defaults, context=context)
214
analytic_distribution()
215
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: