[IMP] mark a bunch of templates as pages, mark all new pages as pages on creation
[odoo/odoo.git] / addons / account_analytic_default / account_analytic_default.py
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
22 import time
23
24 from openerp.osv import fields, osv
25
26 class account_analytic_default(osv.osv):
27     _name = "account.analytic.default"
28     _description = "Analytic Distribution"
29     _rec_name = "analytic_id"
30     _order = "sequence"
31     _columns = {
32         'sequence': fields.integer('Sequence', help="Gives the sequence order when displaying a list of analytic distribution"),
33         'analytic_id': fields.many2one('account.analytic.account', 'Analytic Account'),
34         'product_id': fields.many2one('product.product', 'Product', ondelete='cascade', help="Select a product which will use analytic account specified in analytic default (e.g. create new customer invoice or Sales order if we select this product, it will automatically take this as an analytic account)"),
35         'partner_id': fields.many2one('res.partner', 'Partner', ondelete='cascade', help="Select a partner which will use analytic account specified in analytic default (e.g. create new customer invoice or Sales order if we select this partner, it will automatically take this as an analytic account)"),
36         'user_id': fields.many2one('res.users', 'User', ondelete='cascade', help="Select a user which will use analytic account specified in analytic default."),
37         'company_id': fields.many2one('res.company', 'Company', ondelete='cascade', help="Select a company which will use analytic account specified in analytic default (e.g. create new customer invoice or Sales order if we select this company, it will automatically take this as an analytic account)"),
38         'date_start': fields.date('Start Date', help="Default start date for this Analytic Account."),
39         'date_stop': fields.date('End Date', help="Default end date for this Analytic Account."),
40     }
41
42     def account_get(self, cr, uid, product_id=None, partner_id=None, user_id=None, date=None, context=None):
43         domain = []
44         if product_id:
45             domain += ['|', ('product_id', '=', product_id)]
46         domain += [('product_id','=', False)]
47         if partner_id:
48             domain += ['|', ('partner_id', '=', partner_id)]
49         domain += [('partner_id', '=', False)]
50         if user_id:
51             domain += ['|',('user_id', '=', user_id)]
52         domain += [('user_id','=', False)]
53         if date:
54             domain += ['|', ('date_start', '<=', date), ('date_start', '=', False)]
55             domain += ['|', ('date_stop', '>=', date), ('date_stop', '=', False)]
56         best_index = -1
57         res = False
58         for rec in self.browse(cr, uid, self.search(cr, uid, domain, context=context), context=context):
59             index = 0
60             if rec.product_id: index += 1
61             if rec.partner_id: index += 1
62             if rec.user_id: index += 1
63             if rec.date_start: index += 1
64             if rec.date_stop: index += 1
65             if index > best_index:
66                 res = rec
67                 best_index = index
68         return res
69
70
71 class account_invoice_line(osv.osv):
72     _inherit = "account.invoice.line"
73     _description = "Invoice Line"
74
75     def product_id_change(self, cr, uid, ids, product, uom_id, qty=0, name='', type='out_invoice', partner_id=False, fposition_id=False, price_unit=False, currency_id=False, context=None, company_id=None):
76         res_prod = super(account_invoice_line, self).product_id_change(cr, uid, ids, product, uom_id, qty, name, type, partner_id, fposition_id, price_unit, currency_id=currency_id, context=context, company_id=company_id)
77         rec = self.pool.get('account.analytic.default').account_get(cr, uid, product, partner_id, uid, time.strftime('%Y-%m-%d'), context=context)
78         if rec:
79             res_prod['value'].update({'account_analytic_id': rec.analytic_id.id})
80         else:
81             res_prod['value'].update({'account_analytic_id': False})
82         return res_prod
83
84
85
86 class stock_picking(osv.osv):
87     _inherit = "stock.picking"
88
89     def _get_account_analytic_invoice(self, cursor, user, picking, move_line):
90         partner_id = picking.partner_id and picking.partner_id.id or False
91         rec = self.pool.get('account.analytic.default').account_get(cursor, user, move_line.product_id.id, partner_id , user, time.strftime('%Y-%m-%d'), context={})
92
93         if rec:
94             return rec.analytic_id.id
95
96         return super(stock_picking, self)._get_account_analytic_invoice(cursor, user, picking, move_line)
97
98
99 class sale_order_line(osv.osv):
100     _inherit = "sale.order.line"
101
102     # Method overridden to set the analytic account by default on criterion match
103     def invoice_line_create(self, cr, uid, ids, context=None):
104         create_ids = super(sale_order_line, self).invoice_line_create(cr, uid, ids, context=context)
105         if not ids:
106             return create_ids
107         sale_line = self.browse(cr, uid, ids[0], context=context)
108         inv_line_obj = self.pool.get('account.invoice.line')
109         anal_def_obj = self.pool.get('account.analytic.default')
110
111         for line in inv_line_obj.browse(cr, uid, create_ids, context=context):
112             rec = anal_def_obj.account_get(cr, uid, line.product_id.id, sale_line.order_id.partner_id.id, sale_line.order_id.user_id.id, time.strftime('%Y-%m-%d'), context=context)
113
114             if rec:
115                 inv_line_obj.write(cr, uid, [line.id], {'account_analytic_id': rec.analytic_id.id}, context=context)
116         return create_ids
117
118
119 # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: