f686c2dbb83c9eca4b981e0da35b147718392ea0
[odoo/odoo.git] / addons / account_asset / account_asset.py
1 # -*- encoding: utf-8 -*-
2 ##############################################################################
3 #
4 #    OpenERP, Open Source Management Solution
5 #    Copyright (C) 2004-2009 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
22 import time
23 from datetime import datetime
24 from dateutil.relativedelta import relativedelta
25
26 from osv import osv, fields
27 import decimal_precision as dp
28
29 class account_asset_category(osv.osv):
30     _name = 'account.asset.category'
31     _description = 'Asset category'
32
33     _columns = {
34         'name': fields.char('Name', size=64, required=True, select=1),
35         'note': fields.text('Note'),
36         'account_analytic_id': fields.many2one('account.analytic.account', 'Analytic account'),
37         'account_asset_id': fields.many2one('account.account', 'Asset Account', required=True),
38         'account_depreciation_id': fields.many2one('account.account', 'Depreciation Account', required=True),
39         'account_expense_depreciation_id': fields.many2one('account.account', 'Depr. Expense Account', required=True),
40         'journal_id': fields.many2one('account.journal', 'Journal', required=True),
41         'company_id': fields.many2one('res.company', 'Company', required=True),
42         'method': fields.selection([('linear','Linear'),('progressif','Progressive')], 'Computation method', required=True),
43         'method_delay': fields.integer('Number of Depreciation'),
44         'method_period': fields.integer('Period Length', help="State here the time between 2 depreciations, in months"),
45         'method_progress_factor': fields.float('Progressif Factor'),
46         'method_time': fields.selection([('delay','Delay'),('end','Ending Period')], 'Time Method', required=True),
47         'method_end': fields.date('Ending date'),
48         'prorata':fields.boolean('Prorata Temporis', help='Indicates that the accounting entries for this asset have to be done from the purchase date instead of the first January'),
49         'open_asset': fields.boolean('Skip Draft State', help="Check this if you want to automatically confirm the assets of this category when created by invoice."),
50     }
51
52     _defaults = {
53         'company_id': lambda self, cr, uid, context: self.pool.get('res.company')._company_default_get(cr, uid, 'account.asset.category', context=context),
54         'method': 'linear',
55         'method_delay': 5,
56         'method_time': 'delay',
57         'method_period': 12,
58         'method_progress_factor': 0.3,
59     }
60
61     def onchange_account_asset(self, cr, uid, ids, account_asset_id, context=None):
62         res = {'value':{}}
63         if account_asset_id:
64            res['value'] = {'account_depreciation_id': account_asset_id}
65         return res
66
67 account_asset_category()
68
69 #class one2many_mod_asset(fields.one2many):
70 #
71 #    def get(self, cr, obj, ids, name, user=None, offset=0, context=None, values=None):
72 #        prinasset_property_id        if context is None:
73 #            context = {}
74 #        if not values:
75 #            values = {}
76 #        res = {}
77 #        for id in ids:
78 #            res[id] = []
79 #        #compute depreciation board
80 #        depreciation_line_ids = obj.pool.get('account.asset.asset').compute_depreciation_board(cr, user, ids, context=context)
81 #        for key, value in depreciation_line_ids.items():
82 #            #write values on asset
83 #            obj.pool.get(self._obj).write(cr, user, key, {'depreciation_line_ids': [6,0,value]})
84 #        return depreciation_line_ids
85
86 class account_asset_asset(osv.osv):
87     _name = 'account.asset.asset'
88     _description = 'Asset'
89
90     def _get_period(self, cr, uid, context={}):
91         periods = self.pool.get('account.period').find(cr, uid)
92         if periods:
93             return periods[0]
94         else:
95             return False
96
97     def _get_last_depreciation_date(self, cr, uid, ids, context=None):
98         """
99         @param id: ids of a account.asset.asset objects
100         @return: Returns a dictionary of the effective dates of the last depreciation entry made for given asset ids. If there isn't any, return the purchase date of this asset
101         """
102         cr.execute("""
103             SELECT a.id as id, COALESCE(MAX(l.date),a.purchase_date) AS date
104             FROM account_asset_asset a
105             LEFT JOIN account_move_line l ON (l.asset_id = a.id)
106             WHERE a.id IN %s
107             GROUP BY a.id, a.purchase_date """, (tuple(ids),))
108         return dict(cr.fetchall())
109
110     def compute_depreciation_board(self, cr, uid,ids, context=None):
111         depreciation_lin_obj = self.pool.get('account.asset.depreciation.line')
112         for asset in self.browse(cr, uid, ids, context=context):
113             if asset.value_residual == 0.0:
114                 continue
115             posted_depreciation_line_ids = depreciation_lin_obj.search(cr, uid, [('asset_id', '=', asset.id), ('move_check', '=', True)])
116             old_depreciation_line_ids = depreciation_lin_obj.search(cr, uid, [('asset_id', '=', asset.id), ('move_id', '=', False)])
117             if old_depreciation_line_ids:
118                 depreciation_lin_obj.unlink(cr, uid, old_depreciation_line_ids, context=context)
119             
120             amount_to_depr = residual_amount = asset.value_residual
121
122             depreciation_date = datetime.strptime(self._get_last_depreciation_date(cr, uid, [asset.id], context)[asset.id], '%Y-%m-%d')
123             day = depreciation_date.day
124             month = depreciation_date.month
125             year = depreciation_date.year
126             total_days = (year % 4) and 365 or 366
127             undone_dotation_number = asset.method_delay
128             if asset.method_time == 'end':
129                 end_date = datetime.strptime(asset.method_end, '%Y-%m-%d')
130                 undone_dotation_number = (end_date - depreciation_date).days / total_days
131             if asset.prorata or asset.method_time == 'end':
132                 undone_dotation_number += 1
133             for x in range(len(posted_depreciation_line_ids), undone_dotation_number):
134                 i = x + 1
135                 if i == undone_dotation_number:
136                     amount = residual_amount
137                 else:
138                     if asset.method == 'linear':
139                         amount = amount_to_depr / (undone_dotation_number - len(posted_depreciation_line_ids))
140                         if asset.prorata:
141                             amount = amount_to_depr / asset.method_delay
142                             if i == 1:
143                                 days = total_days - float(depreciation_date.strftime('%j'))
144                                 amount = (amount_to_depr / asset.method_delay) / total_days * days
145                             elif i == undone_dotation_number:
146                                 amount = (amount_to_depr / asset.method_delay) / total_days * (total_days - days)
147                     else:
148                         amount = residual_amount * asset.method_progress_factor
149                 residual_amount -= amount
150                 vals = {
151                      'amount': amount,
152                      'asset_id': asset.id,
153                      'sequence': i,
154                      'name': str(asset.id) +'/' + str(i),
155                      'remaining_value': residual_amount,
156                      'depreciated_value': (asset.purchase_value - asset.salvage_value) - (residual_amount + amount),
157                      'depreciation_date': depreciation_date.strftime('%Y-%m-%d'),
158                 }
159                 depreciation_lin_obj.create(cr, uid, vals, context=context)
160                 # Considering Depr. Period as months
161                 depreciation_date = (datetime(year, month, day) + relativedelta(months=+asset.method_period))
162                 day = depreciation_date.day
163                 month = depreciation_date.month
164                 year = depreciation_date.year
165         return True
166
167     def validate(self, cr, uid, ids, context={}):
168         return self.write(cr, uid, ids, {
169             'state':'open'
170         }, context)
171
172     def _amount_residual(self, cr, uid, ids, name, args, context=None):
173         cr.execute("""SELECT
174                 l.asset_id as id, round(SUM(abs(l.debit-l.credit))) AS amount
175             FROM
176                 account_move_line l
177             WHERE
178                 l.asset_id IN %s GROUP BY l.asset_id """, (tuple(ids),))
179         res=dict(cr.fetchall())
180         for asset in self.browse(cr, uid, ids, context):
181             res[asset.id] = asset.purchase_value - res.get(asset.id, 0.0) - asset.salvage_value
182         for id in ids:
183             res.setdefault(id, 0.0)
184         return res
185
186     _columns = {
187         'period_id': fields.many2one('account.period', 'First Period', required=True, readonly=True, states={'draft':[('readonly',False)]}),
188         'account_move_line_ids': fields.one2many('account.move.line', 'asset_id', 'Entries', readonly=True, states={'draft':[('readonly',False)]}),
189
190         'name': fields.char('Asset', size=64, required=True, select=1),
191         'code': fields.char('Reference ', size=16, select=1),
192         'purchase_value': fields.float('Gross value ', required=True, size=16, select=1),
193         'currency_id': fields.many2one('res.currency','Currency',required=True,size=5,select=1),
194         'company_id': fields.many2one('res.company', 'Company', required=True),
195         'note': fields.text('Note'),
196         'category_id': fields.many2one('account.asset.category', 'Asset category',required=True, change_default=True),
197         'localisation': fields.char('Localisation', size=32, select=2),
198         'parent_id': fields.many2one('account.asset.asset', 'Parent Asset'),
199         'child_ids': fields.one2many('account.asset.asset', 'parent_id', 'Children Assets'),
200         'purchase_date': fields.date('Purchase Date', required=True),
201         'state': fields.selection([('draft','Draft'),('open','Running'),('close','Close')], 'State', required=True),
202         'active': fields.boolean('Active', select=2),
203         'partner_id': fields.many2one('res.partner', 'Partner'),
204         'method': fields.selection([('linear','Linear'),('progressif','Progressive')], 'Computation Method', required=True, readonly=True, states={'draft':[('readonly',False)]}, help="Linear: Calculated on basis of Gross Value/During (interval) \
205          \nProgressive: Calculated on basis of Gross Value * Progressif Factor"),
206         'method_delay': fields.integer('Number of Depreciation', readonly=True, states={'draft':[('readonly',False)]}, help="Calculates Depreciation within specified interval"),
207         'method_period': fields.integer('Period Length', readonly=True, states={'draft':[('readonly',False)]}, help="State here the time during 2 depreciations, in months"),
208         'method_end': fields.date('Ending date', readonly=True, states={'draft':[('readonly',False)]}),
209         'method_progress_factor': fields.float('Progressif Factor', readonly=True, states={'draft':[('readonly',False)]}),
210         'value_residual': fields.function(_amount_residual, method=True, digits_compute=dp.get_precision('Account'), string='Residual Value'),
211         'method_time': fields.selection([('delay','Delay'),('end','Ending Period')], 'Time Method', required=True, readonly=True, states={'draft':[('readonly',False)]}, help="Delay: Allow users to enter number of periods to generate depreciation lines \n Ending Period: Calculates depreciation lines on the basis of Ending Period Date and Number of Depreciation"),
212         'prorata':fields.boolean('Prorata Temporis', Readonly="True", help='Indicates that the accounting entries for this asset have to be done from the purchase date instead of the first January'),
213         'history_ids': fields.one2many('account.asset.history', 'asset_id', 'History', readonly=True),
214         'depreciation_line_ids': fields.one2many('account.asset.depreciation.line', 'asset_id', 'Depreciation Lines'),
215         'salvage_value': fields.float('Salvage Value', digits_compute=dp.get_precision('Account'), help="It is the amount you plan to have that you cannot depreciate."),
216     }
217     _defaults = {
218         'code': lambda obj, cr, uid, context: obj.pool.get('ir.sequence').get(cr, uid, 'account.asset.code'),
219         'purchase_date': lambda obj, cr, uid, context: time.strftime('%Y-%m-%d'),
220         'active': lambda obj, cr, uid, context: True,
221         'state': lambda obj, cr, uid, context: 'draft',
222         'period_id': _get_period,
223         'method': lambda obj, cr, uid, context: 'linear',
224         'method_delay': lambda obj, cr, uid, context: 5,
225         'method_time': lambda obj, cr, uid, context: 'delay',
226         'method_period': lambda obj, cr, uid, context: 12,
227         'method_progress_factor': lambda obj, cr, uid, context: 0.3,
228         'currency_id': lambda self,cr,uid,c: self.pool.get('res.users').browse(cr, uid, uid, c).company_id.currency_id.id,
229         'company_id': lambda self, cr, uid, context: self.pool.get('res.company')._company_default_get(cr, uid, 'account.asset.asset',context=context),
230     }
231
232     def _check_prorata(self, cr, uid, ids, context=None):
233         for asset in self.browse(cr, uid, ids, context=context):
234             if asset.prorata and (asset.method != 'linear' or asset.method_time != 'delay'):
235                 return False
236         return True
237
238     _constraints = [
239         (_check_prorata, '\nProrata temporis can be applied only for computation method linear and time method delay.', ['prorata']),
240     ]
241
242     def onchange_category_id(self, cr, uid, ids, category_id, context=None):
243         res = {'value':{}}
244         asset_categ_obj = self.pool.get('account.asset.category')
245         if category_id:
246             category_obj = asset_categ_obj.browse(cr, uid, category_id, context=context)
247             res['value'] = {
248                             'method': category_obj.method,
249                             'method_delay': category_obj.method_delay,
250                             'method_time': category_obj.method_time,
251                             'method_period': category_obj.method_period,
252                             'method_progress_factor': category_obj.method_progress_factor,
253                             'method_end': category_obj.method_end,
254                             'prorata': category_obj.prorata,
255             }
256         return res
257
258     def onchange_method_time(self, cr, uid, ids, method='linear', method_time='delay', context=None):
259         res = {'value': {}}
260         if method != 'linear' or method_time != 'delay':
261             res['value'] = {'prorata': False}
262         return res
263
264     def copy(self, cr, uid, id, default=None, context=None):
265         if default is None:
266             default = {}
267         if context is None:
268             context = {}
269         default.update({'depreciation_line_ids': [], 'state': 'draft'})
270         return super(account_asset_asset, self).copy(cr, uid, id, default, context=context)
271
272     def _compute_period(self, cr, uid, property, context={}):
273         if (len(property.entry_asset_ids or [])/2)>=property.method_delay:
274             return False
275         if len(property.entry_asset_ids):
276             cp = property.entry_asset_ids[-1].period_id
277             cpid = self.pool.get('account.period').next(cr, uid, cp, property.method_period, context)
278             current_period = self.pool.get('account.period').browse(cr, uid, cpid, context)
279         else:
280             current_period = property.asset_id.period_id
281         return current_period
282
283     def _compute_move(self, cr, uid, property, period, context={}):
284         #FIXME: fucntion not working OK
285         result = []
286         total = 0.0
287         for move in property.asset_id.entry_ids:
288             total += move.debit-move.credit
289         for move in property.entry_asset_ids:
290             if move.account_id == property.account_asset_ids:
291                 total += move.debit
292                 total += -move.credit
293         periods = (len(property.entry_asset_ids)/2) - property.method_delay
294
295         if periods==1:
296             amount = total
297         else:
298             if property.method == 'linear':
299                 amount = total / periods
300             else:
301                 amount = total * property.method_progress_factor
302
303         move_id = self.pool.get('account.move').create(cr, uid, {
304             'journal_id': property.journal_id.id,
305             'period_id': period.id,
306             'name': property.name or property.asset_id.name,
307             'ref': property.asset_id.code
308         })
309         result = [move_id]
310         id = self.pool.get('account.move.line').create(cr, uid, {
311             'name': property.name or property.asset_id.name,
312             'move_id': move_id,
313             'account_id': property.account_asset_id.id,
314             'debit': amount>0 and amount or 0.0,
315             'credit': amount<0 and -amount or 0.0,
316             'ref': property.asset_id.code,
317             'period_id': period.id,
318             'journal_id': property.journal_id.id,
319             'partner_id': property.asset_id.partner_id.id,
320             'date': time.strftime('%Y-%m-%d'),
321         })
322         id2 = self.pool.get('account.move.line').create(cr, uid, {
323             'name': property.name or property.asset_id.name,
324             'move_id': move_id,
325             'account_id': property.account_actif_id.id,
326             'credit': amount>0 and amount or 0.0,
327             'debit': amount<0 and -amount or 0.0,
328             'ref': property.asset_id.code,
329             'period_id': period.id,
330             'journal_id': property.journal_id.id,
331             'partner_id': property.asset_id.partner_id.id,
332             'date': time.strftime('%Y-%m-%d'),
333         })
334     #
335         self.pool.get('account.asset.asset').write(cr, uid, [property.id], {
336             'entry_asset_ids': [(4, id2, False),(4,id,False)]
337         })
338         if property.method_delay - (len(property.entry_asset_ids)/2)<=1:
339             #self.pool.get('account.asset.property')._close(cr, uid, property, context)
340             return result
341         return result
342
343     def _compute_entries(self, cr, uid, asset, period_id, context={}):
344         #FIXME: function not working CHECK all res
345         result = []
346         date_start = self.pool.get('account.period').browse(cr, uid, period_id, context).date_start
347         for property in asset.property_ids:
348             if property.state=='open':
349                 period = self._compute_period(cr, uid, property, context)
350                 if period and (period.date_start<=date_start):
351                     result += self._compute_move(cr, uid, property, period, context)
352         return result
353 account_asset_asset()
354
355 class account_asset_depreciation_line(osv.osv):
356     _name = 'account.asset.depreciation.line'
357     _description = 'Asset depreciation line'
358
359     def _get_move_check(self, cr, uid, ids, name, args, context=None):
360         res = {}
361         for line in self.browse(cr, uid, ids, context=context):
362             res[line.id] = bool(line.move_id)
363         return res
364
365     _columns = {
366         'name': fields.char('Depreciation Name', size=64, required=True, select=1),
367         'sequence': fields.integer('Sequence of the depreciation', required=True),
368         'asset_id': fields.many2one('account.asset.asset', 'Asset', required=True),
369         'amount': fields.float('Depreciation Amount', required=True),
370         'remaining_value': fields.float('Amount to Depreciate', required=True),
371         'depreciated_value': fields.float('Amount Already Depreciated', required=True),
372         'depreciation_date': fields.char('Depreciation Date', size=64, select=1),
373         'move_id': fields.many2one('account.move', 'Depreciation Entry'),
374         'move_check': fields.function(_get_move_check, method=True, type='boolean', string='Posted', store=True)
375     }
376
377     def create_move(self, cr, uid,ids, context=None):
378         if context is None:
379             context = {}
380         asset_obj = self.pool.get('account.asset.asset')
381         period_obj = self.pool.get('account.period')
382         move_obj = self.pool.get('account.move')
383         move_line_obj = self.pool.get('account.move.line')
384         currency_obj = self.pool.get('res.currency')
385         for line in self.browse(cr, uid, ids, context=context):
386             depreciation_date = line.asset_id.prorata and line.asset_id.purchase_date or time.strftime('%Y-%m-%d')
387             period_ids = period_obj.find(cr, uid, depreciation_date, context=context)
388             company_currency = line.asset_id.company_id.currency_id.id
389             current_currency = line.asset_id.currency_id.id
390             context.update({'date': depreciation_date})
391             amount = currency_obj.compute(cr, uid, current_currency, company_currency, line.amount, context=context)
392             sign = line.asset_id.category_id.journal_id.type = 'purchase' and 1 or -1
393             move_vals = {
394                 'name': line.name,
395                 'date': depreciation_date,
396                 'ref': line.name,
397                 'period_id': period_ids and period_ids[0] or False,
398                 'journal_id': line.asset_id.category_id.journal_id.id,
399                 }
400             move_id = move_obj.create(cr, uid, move_vals, context=context)
401             move_line_obj.create(cr, uid, {
402                 'name': line.name,
403                 'ref': line.name,
404                 'move_id': move_id,
405                 'account_id': line.asset_id.category_id.account_depreciation_id.id,
406                 'debit': 0.0,
407                 'credit': amount,
408                 'period_id': period_ids and period_ids[0] or False,
409                 'journal_id': line.asset_id.category_id.journal_id.id,
410                 'partner_id': line.asset_id.partner_id.id,
411                 'currency_id': company_currency <> current_currency and  current_currency or False,
412                 'amount_currency': company_currency <> current_currency and - sign * line.amount or 0.0,
413                 'date': depreciation_date,
414             })
415             move_line_obj.create(cr, uid, {
416                 'name': line.name,
417                 'ref': line.name,
418                 'move_id': move_id,
419                 'account_id': line.asset_id.category_id.account_expense_depreciation_id.id,
420                 'credit': 0.0,
421                 'debit': amount,
422                 'period_id': period_ids and period_ids[0] or False,
423                 'journal_id': line.asset_id.category_id.journal_id.id,
424                 'partner_id': line.asset_id.partner_id.id,
425                 'currency_id': company_currency <> current_currency and  current_currency or False,
426                 'amount_currency': company_currency <> current_currency and sign * line.amount or 0.0,
427                 'analytic_account_id': line.asset_id.category_id.account_analytic_id.id,
428                 'date': depreciation_date,
429                 'asset_id': line.asset_id.id
430             })
431             self.write(cr, uid, line.id, {'move_id': move_id}, context=context)
432         return True
433
434 account_asset_depreciation_line()
435
436 #class account_asset_property(osv.osv):
437 #    def _amount_total(self, cr, uid, ids, name, args, context={}):
438 #        id_set=",".join(map(str,ids))
439 #        cr.execute("""SELECT l.asset_id,abs(SUM(l.debit-l.credit)) AS amount FROM
440 #                account_asset_property p
441 #            left join
442 #                account_move_line l on (p.asset_id=l.asset_id)
443 #            WHERE p.id IN ("""+id_set+") GROUP BY l.asset_id ")
444 #        res=dict(cr.fetchall())
445 #        for id in ids:
446 #            res.setdefault(id, 0.0)
447 #        return res
448 #
449 #    def _close(self, cr, uid, property, context={}):
450 #        if property.state<>'close':
451 #            self.pool.get('account.asset.property').write(cr, uid, [property.id], {
452 #                'state': 'close'
453 #            })
454 #            property.state='close'
455 #        ok = property.asset_id.state=='open'
456 #        for prop in property.asset_id.property_ids:
457 #            ok = ok and prop.state=='close'
458 #        self.pool.get('account.asset.asset').write(cr, uid, [property.asset_id.id], {
459 #            'state': 'close'
460 #        }, context)
461 #        return True
462 #
463 #    _name = 'account.asset.property'
464 #    _description = 'Asset property'
465 #    _columns = {
466 #        'name': fields.char('Method name', size=64, select=1),
467 #        'type': fields.selection([('direct','Direct'),('indirect','Indirect')], 'Depr. method type', select=2, required=True),
468 #        'asset_id': fields.many2one('account.asset.asset', 'Asset', required=True),
469 #        'account_asset_id': fields.many2one('account.account', 'Asset account', required=True),
470 #        'account_actif_id': fields.many2one('account.account', 'Depreciation account', required=True),
471 #        'journal_id': fields.many2one('account.journal', 'Journal', required=True),
472 #        'journal_analytic_id': fields.many2one('account.analytic.journal', 'Analytic journal'),
473 #        'account_analytic_id': fields.many2one('account.analytic.account', 'Analytic account'),
474 #
475 #        'method': fields.selection([('linear','Linear'),('progressif','Progressive')], 'Computation method', required=True, readonly=True, states={'draft':[('readonly',False)]}),
476 #        'method_delay': fields.integer('During', readonly=True, states={'draft':[('readonly',False)]}),
477 #        'method_period': fields.integer('Depre. all', readonly=True, states={'draft':[('readonly',False)]}),
478 #        'method_end': fields.date('Ending date'),
479 #
480 #        'date': fields.date('Date created'),
481 #    #'test': fields.one2many('account.pre', 'asset_id',  readonly=True, states={'draft':[('readonly',False)]}),
482 #        'entry_asset_ids': fields.many2many('account.move.line', 'account_move_asset_entry_rel', 'asset_property_id', 'move_id', 'Asset Entries'),
483 #        'board_ids': fields.one2many('account.asset.board', 'asset_id', 'Asset board'),
484 #
485 #        'value_total': fields.function(_amount_total, method=True, digits=(16,2),string='Gross value'),
486 #        'state': fields.selection([('draft','Draft'), ('open','Open'), ('close','Close')], 'State', required=True),
487 #        'history_ids': fields.one2many('account.asset.property.history', 'asset_property_id', 'History', readonly=True)
488 ##    'parent_id': fields.many2one('account.asset.asset', 'Parent asset'),
489 ##    'partner_id': fields.many2one('res.partner', 'Partner'),
490 ##    'note': fields.text('Note'),
491 #
492 #    }
493 #    _defaults = {
494 #        'type': lambda obj, cr, uid, context: 'direct',
495 #        'state': lambda obj, cr, uid, context: 'draft',
496 #        'method': lambda obj, cr, uid, context: 'linear',
497 #        'method_time': lambda obj, cr, uid, context: 'delay',
498 #        'method_progress_factor': lambda obj, cr, uid, context: 0.3,
499 #        'method_delay': lambda obj, cr, uid, context: 5,
500 #        'method_period': lambda obj, cr, uid, context: 12,
501 #        'date': lambda obj, cr, uid, context: time.strftime('%Y-%m-%d')
502 #    }
503 #account_asset_property()
504
505 class account_move_line(osv.osv):
506     _inherit = 'account.move.line'
507     _columns = {
508         'asset_id': fields.many2one('account.asset.asset', 'Asset'),
509         'entry_ids': fields.one2many('account.move.line', 'asset_id', 'Entries', readonly=True, states={'draft':[('readonly',False)]}),
510
511     }
512 account_move_line()
513
514 class account_asset_history(osv.osv):
515     _name = 'account.asset.history'
516     _description = 'Asset history'
517     _columns = {
518         'name': fields.char('History name', size=64, select=1),
519         'user_id': fields.many2one('res.users', 'User', required=True),
520         'date': fields.date('Date', required=True),
521         'asset_id': fields.many2one('account.asset.asset', 'Asset', required=True),
522         'method_delay': fields.integer('Number of interval'),
523         'method_period': fields.integer('Period per interval'),
524         'method_end': fields.date('Ending date'),
525         'note': fields.text('Note'),
526     }
527     _order = 'create_date desc'
528     _defaults = {
529         'date': lambda *args: time.strftime('%Y-%m-%d'),
530         'user_id': lambda self,cr, uid,ctx: uid
531     }
532     
533 account_asset_history()
534
535 # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: