[MERGE]: Merged with tpa's branch.
[odoo/odoo.git] / addons / sale / res_config.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 from osv import fields, osv
23 import pooler
24 from tools.translate import _
25
26 class sale_configuration(osv.osv_memory):
27     _inherit = 'res.config'
28
29     _columns = {
30         'sale_orders': fields.boolean('Based on Sales Orders', 
31                                       help="To allow your salesman to make invoices for sale order lines using 'Lines to Invoice' menu."),
32         'deli_orders': fields.boolean('Based on Delivery Orders',
33                                       help="To allow your salesman to make invoices for Delivery Orders using 'Deliveries to Invoice' menu."),
34         'task_work': fields.boolean('Based on Tasks\' Work',
35                                     help="""Lets you transfer the entries under tasks defined for Project Management to
36                                     the Timesheet line entries for particular date and particular user  with the effect of creating, editing and deleting either ways.
37                                     and to automatically creates project tasks from procurement lines.
38                                     It installs the project_timesheet and project_mrp module"""),
39         'module_account_analytic_analysis': fields.boolean('Based on Timesheet',
40                                     help = """For modifying account analytic view to show important data to project manager of services companies,
41                                     You can also view the report of account analytic summary user-wise as well as month wise.
42                                     It installs the account_analytic_analysis module."""),
43         'order_policy': fields.selection([
44             ('manual', 'Invoice Based on Sales Orders'),
45             ('picking', 'Invoice Based on Deliveries'),
46         ], 'Main Method Based On', required=True, help="You can generate invoices based on sales orders or based on shippings."),
47         'module_delivery': fields.boolean('Do you charge the delivery?',
48                                    help ="""
49                                    Allows you to add delivery methods in sale orders and picking,
50                                    You can define your own carrier and delivery grids for prices.
51                                    It installs the delivery module.
52                                    """),
53         'time_unit': fields.many2one('product.uom','Working Time Unit'),
54         'picking_policy' : fields.boolean("Deliver all products at once?", help = "You can set picking policy on sale order that will allow you to deliver all products at once."),
55         'group_sale_delivery_address':fields.boolean("Multiple Address",help="This allows you to set different delivery address and picking address,it assigns Multiple Address group to all employees."),
56         'group_sale_disc_per_sale_order_line':fields.boolean("Discounts per sale order lines ",help="This allows you to apply discounts per sale order lines, it assigns Discounts per sale order lines group to all employees."),
57         'module_sale_layout':fields.boolean("Notes & subtotals per line",help="Allows to format sale order lines using notes, separators, titles and subtotals. It installs the sale_layout module."),
58         'module_warning': fields.boolean("Alerts by products or customers",
59                                   help="""To trigger warnings in OpenERP objects.
60                                   Warning messages can be displayed for objects like sale order, purchase order, picking and invoice. The message is triggered by the form's onchange event.
61                                   It installs the warning module."""),
62         'module_sale_margin': fields.boolean("Display Margin For Users",
63                         help="""This adds the 'Margin' on sales order,
64                         This gives the profitability by calculating the difference between the Unit Price and Cost Price.
65                         .It installs the sale_margin module."""),
66         'module_sale_journal': fields.boolean("Invoice journal?",
67                         help="""This allows you to categorise your sales and deliveries (picking lists) between different journals.
68                         It installs the sale_journal module."""),
69         'module_analytic_user_function' : fields.boolean("User function by contracts",
70                                     help="""This allows you to define what is the default function of a specific user on a given account
71                                     This is mostly used when a user encodes his timesheet: the values are retrieved and the fields are auto-filled. But the possibility to change these values is still available.
72                                     It Installs analytic_user_function module."""),
73         'module_analytic_journal_billing_rate' : fields.boolean("Billing rates by contracts",
74                                     help=""" This allows you to define what is the default invoicing rate for a specific journal on a given account.
75                                     It installs analytic_journal_billing_rate module.
76                                     """)
77     }
78     
79     def get_default_installed_modules(self, cr, uid, ids, context=None):
80         installed_modules = super(sale_configuration, self).get_default_installed_modules(cr, uid, ids, context=context)
81         if installed_modules.get('module_project_mrp') and installed_modules.get('module_project_timesheet'):
82             installed_modules['task_work'] = True
83             prod_id = data_obj.get_object(cr, uid, 'product', 'product_consultant').id
84             uom_id = self.pool.get('product.product').browse(cr, uid, prod_id).uom_id.id
85             defaults.update({'time_unit': uom_id})
86         return installed_modules
87
88     def get_default_sale_configs(self, cr, uid, ids, context=None):
89         ir_values_obj = self.pool.get('ir.values')
90         data_obj = self.pool.get('ir.model.data')
91         menu_obj = self.pool.get('ir.ui.menu')
92         result = {}
93         invoicing_groups_id = [gid.id for gid in data_obj.get_object(cr, uid, 'sale', 'menu_invoicing_sales_order_lines').groups_id]
94         picking_groups_id = [gid.id for gid in data_obj.get_object(cr, uid, 'sale', 'menu_action_picking_list_to_invoice').groups_id]
95         group_id = data_obj.get_object(cr, uid, 'base', 'group_sale_salesman').id
96         for menu in ir_values_obj.get(cr, uid, 'default', False, ['ir.ui.menu']):
97             if menu[1] == 'groups_id' and group_id in menu[2][0]:
98                 if group_id in invoicing_groups_id:
99                     result['sale_orders'] = True
100                 if group_id in picking_groups_id:
101                     result['deli_orders'] = True
102         for res in ir_values_obj.get(cr, uid, 'default', False, ['sale.order']):
103             result[res[1]] = res[2]
104         return result
105     
106     def default_get(self, cr, uid, fields_list, context=None):
107         result = super(sale_configuration, self).default_get(
108             cr, uid, fields_list, context=context)
109         for method in dir(self):
110             if method.startswith('get_default_'):
111                 result.update(getattr(self, method)(cr, uid, [], context))
112         return result
113     
114     _defaults = {
115         'order_policy': 'manual',
116         'time_unit': lambda self, cr, uid, c: self.pool.get('product.uom').search(cr, uid, [('name', '=', _('Hour'))], context=c) and self.pool.get('product.uom').search(cr, uid, [('name', '=', _('Hour'))], context=c)[0] or False,
117     }
118
119     def create(self, cr, uid, vals, context=None):
120         ids = super(sale_configuration, self).create(cr, uid, vals, context=context)
121         self.execute(cr, uid, [ids], vals, context=context)
122         return ids
123
124     def write(self, cr, uid, ids, vals, context=None):
125         self.execute(cr, uid, ids, vals, context=context)
126         return super(sale_configuration, self).write(cr, uid, ids, vals, context=context)
127
128     def execute(self, cr, uid, ids, vals, context=None):
129         #TODO: TO BE IMPLEMENTED
130         for method in dir(self):
131             if method.startswith('set_'):
132                 getattr(self, method)(cr, uid, ids, vals, context)
133         return True
134
135     def set_installed_modules(self, cr, uid, ids, vals, context=None):
136         if vals.get('task_work'):
137             vals.update({'module_project_timesheet': True, 'module_project_mrp': True})
138         else:
139             vals.update({'module_project_timesheet': False, 'module_project_mrp': False})
140
141         super(sale_configuration, self).set_installed_modules(cr, uid, ids, vals, context=context)
142
143     def set_sale_defaults(self, cr, uid, ids, vals, context=None):
144         ir_values_obj = self.pool.get('ir.values')
145         data_obj = self.pool.get('ir.model.data')
146         menu_obj = self.pool.get('ir.ui.menu')
147         res = {}
148         wizard = self.browse(cr, uid, ids)[0]
149         group_id = data_obj.get_object(cr, uid, 'base', 'group_sale_salesman').id
150
151         if wizard.sale_orders:
152             menu_id = data_obj.get_object(cr, uid, 'sale', 'menu_invoicing_sales_order_lines').id
153             menu_obj.write(cr, uid, menu_id, {'groups_id':[(4,group_id)]})
154             ir_values_obj.set(cr, uid, 'default', False, 'groups_id', ['ir.ui.menu'], [(4,group_id)])
155
156         if wizard.deli_orders:
157             menu_id = data_obj.get_object(cr, uid, 'sale', 'menu_action_picking_list_to_invoice').id
158             menu_obj.write(cr, uid, menu_id, {'groups_id':[(4,group_id)]})
159             ir_values_obj.set(cr, uid, 'default', False, 'groups_id', ['ir.ui.menu'], [(4,group_id)])
160             
161         if wizard.picking_policy:
162             ir_values_obj.set(cr, uid, 'default', False, 'picking_policy', ['sale.order'], 'one')
163
164         if wizard.time_unit:
165             prod_id = data_obj.get_object(cr, uid, 'product', 'product_consultant').id
166             product_obj = self.pool.get('product.product')
167             product_obj.write(cr, uid, prod_id, {'uom_id': wizard.time_unit.id, 'uom_po_id': wizard.time_unit.id})
168
169         ir_values_obj.set(cr, uid, 'default', False, 'order_policy', ['sale.order'], wizard.order_policy)
170         if wizard.task_work and wizard.time_unit:
171             company_id = self.pool.get('res.users').browse(cr, uid, uid).company_id.id
172             self.pool.get('res.company').write(cr, uid, [company_id], {
173                 'project_time_mode_id': wizard.time_unit.id
174             }, context=context)
175             
176         return res
177
178     def onchange_tax_policy(self, cr, uid, ids, tax_policy, context=None):
179         self.set_tax_policy(cr, uid, ids, {'tax_policy': tax_policy}, context=context)
180         return {'value': {}}
181     
182     def set_default_taxes(self, cr, uid, ids, vals, context=None):
183         ir_values_obj = self.pool.get('ir.values')
184         taxes = self._check_default_tax(cr, uid, context=context)
185         if isinstance(vals.get('tax_value'), list):
186             taxes = vals.get('tax_value')
187         if taxes:
188             ir_values_obj.set(cr, uid, 'default', False, 'tax_id', ['sale.order'], taxes[0])
189             ir_values_obj.set(cr, uid, 'default', False, 'tax_id', ['sale.order.line'], taxes)
190             ir_values_obj.set(cr, uid, 'default', False, 'taxes_id', ['product.product'], taxes)
191
192 sale_configuration()
193
194 # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: