aedbfa021b3a1c59495a32d114f840a970249256
[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         'deli_orders': fields.boolean('Based on Delivery Orders'),
32         'task_work': fields.boolean('Based on Tasks\' Work',
33                                     help="""
34                                     It installs the project_timesheet and project_mrp module
35                                     project_timesheet :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                                     project_mrp : Automatically creates project tasks from procurement lines"""),
38         'timesheet': fields.boolean('Based on Timesheet',
39                                     help = """for modifying account analytic view to show important data to project manager of services companies,
40                                     You can also view the report of account analytic summary user-wise as well as month wise
41                                     ,It installs the account_analytic_analysis module."""),
42         'order_policy': fields.selection([
43             ('manual', 'Invoice Based on Sales Orders'),
44             ('picking', 'Invoice Based on Deliveries'),
45         ], 'Main Method Based On', required=True, help="You can generate invoices based on sales orders or based on shippings."),
46         'module_delivery': fields.boolean('Do you charge the delivery?',
47                                    help ="""
48                                    Allows you to add delivery methods in sale orders and picking,
49                                    You can define your own carrier and delivery grids for prices.
50                                    It installs the delivery module.
51                                    """),
52         'time_unit': fields.many2one('product.uom','Working Time Unit'),
53         'picking_policy' : fields.boolean("Deliver all products at once?", help = ""),
54         'group_sale_delivery_address':fields.boolean("Multiple Address",help="Group To Allow delivery address different from invoice address"),
55         'group_sale_disc_per_sale_order_line':fields.boolean("Discounts per sale order lines ",help="Group to apply discounts per sale order lines"),
56         '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."),
57         'module_warning': fields.boolean("Alerts by products or customers",
58                                   help="""To trigger warnings in OpenERP objects.
59                                   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.
60                                   It installs the warning module."""),
61         'module_sale_margin': fields.boolean("Display Margin For Users",
62                         help="""This adds the 'Margin' on sales order,
63                         This gives the profitability by calculating the difference between the Unit Price and Cost Price.
64                         .It installs the sale_margin module."""),
65         'module_sale_journal': fields.boolean("Invoice journal?",
66                         help="""This allows you to categorise your sales and deliveries (picking lists) between different journals.
67                         It installs the sale_journal module."""),
68         'module_analytic_user_function' : fields.boolean("User function by contracts",
69                                     help="""This allows you to define what is the default function of a specific user on a given account
70                                     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.
71                                     It Installs analytic_user_function module"""),
72         'module_analytic_journal_billing_rate' : fields.boolean("Billing rates by contracts",
73                                     help=""" This allows you to define what is the default invoicing rate for a specific journal on a given account.
74                                     It installs analytic_journal_billing_rate module.
75                                     """),
76         'module_account_analytic_analysis': fields.boolean('Contracts',
77                                     help = """
78                                     For modifying account analytic view to show important data to project manager of services companies,
79                                     You can also view the report of account analytic summary user-wise as well as month wise
80                                     ,It installs the account_analytic_analysis module."""),
81     }
82
83     def get_default_installed_modules(self, cr, uid, ids, context=None):
84         installed_modules = super(sale_configuration, self).get_default_installed_modules(cr, uid, ids, context=context)
85         if installed_modules.get('project_mrp') and installed_modules.get('project_timesheet'):
86             installed_modules['task_work'] = True
87         if installed_modules.get('account_analytic_analysis'):
88             installed_modules['timesheet'] = True
89         return installed_modules
90     
91     def get_default_sale_configs(self, cr, uid, ids, context=None):
92         ir_values_obj = self.pool.get('ir.values')
93         data_obj = self.pool.get('ir.model.data')
94         menu_obj = self.pool.get('ir.ui.menu')
95         result = {}
96         invoicing_groups_id = [gid.id for gid in data_obj.get_object(cr, uid, 'sale', 'menu_invoicing_sales_order_lines').groups_id]
97         picking_groups_id = [gid.id for gid in data_obj.get_object(cr, uid, 'sale', 'menu_action_picking_list_to_invoice').groups_id]
98         group_id = data_obj.get_object(cr, uid, 'base', 'group_sale_salesman').id
99         for menu in ir_values_obj.get(cr, uid, 'default', False, ['ir.ui.menu']):
100             if menu[1] == 'groups_id' and group_id in menu[2][0]:
101                 if group_id in invoicing_groups_id:
102                     result['sale_orders'] = True
103                 if group_id in picking_groups_id:
104                     result['deli_orders'] = True
105         for res in ir_values_obj.get(cr, uid, 'default', False, ['sale.order']):
106             result[res[1]] = res[2]
107         return result
108     
109     def default_get(self, cr, uid, fields_list, context=None):
110         result = super(sale_configuration, self).default_get(
111             cr, uid, fields_list, context=context)
112         for method in dir(self):
113             if method.startswith('get_default_'):
114                 result.update(getattr(self, method)(cr, uid, [], context))
115         return result
116     
117     _defaults = {
118         'order_policy': 'manual',
119         '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,
120     }
121
122     def create(self, cr, uid, vals, context=None):
123         ids = super(sale_configuration, self).create(cr, uid, vals, context=context)
124         self.execute(cr, uid, [ids], vals, context=context)
125         return ids
126
127     def write(self, cr, uid, ids, vals, context=None):
128         self.execute(cr, uid, ids, vals, context=context)
129         return super(sale_configuration, self).write(cr, uid, ids, vals, context=context)
130
131     def execute(self, cr, uid, ids, vals, context=None):
132         #TODO: TO BE IMPLEMENTED
133         for method in dir(self):
134             if method.startswith('set_'):
135                 getattr(self, method)(cr, uid, ids, vals, context)
136         return True
137
138     def set_installed_modules(self, cr, uid, ids, vals, context=None):
139         if vals.get('timesheet'):
140             vals.update({'module_account_analytic_analysis': True})
141         else:
142             vals.update({'module_account_analytic_analysis': False})
143
144         if vals.get('task_work'):
145             vals.update({'module_project_timesheet': True, 'module_project_mrp': True})
146         else:
147             vals.update({'module_project_timesheet': False, 'module_project_mrp': False})
148
149         super(sale_configuration, self).set_installed_modules(cr, uid, ids, vals, context=context)
150
151     def set_sale_defaults(self, cr, uid, ids, vals, context=None):
152         ir_values_obj = self.pool.get('ir.values')
153         data_obj = self.pool.get('ir.model.data')
154         menu_obj = self.pool.get('ir.ui.menu')
155         res = {}
156         wizard = self.browse(cr, uid, ids)[0]
157         group_id = data_obj.get_object(cr, uid, 'base', 'group_sale_salesman').id
158
159         if wizard.sale_orders:
160             menu_id = data_obj.get_object(cr, uid, 'sale', 'menu_invoicing_sales_order_lines').id
161             menu_obj.write(cr, uid, menu_id, {'groups_id':[(4,group_id)]})
162             ir_values_obj.set(cr, uid, 'default', False, 'groups_id', ['ir.ui.menu'], [(4,group_id)])
163
164         if wizard.deli_orders:
165             menu_id = data_obj.get_object(cr, uid, 'sale', 'menu_action_picking_list_to_invoice').id
166             menu_obj.write(cr, uid, menu_id, {'groups_id':[(4,group_id)]})
167             ir_values_obj.set(cr, uid, 'default', False, 'groups_id', ['ir.ui.menu'], [(4,group_id)])
168             
169         if wizard.picking_policy:
170             ir_values_obj.set(cr, uid, 'default', False, 'picking_policy', ['sale.order'], 'one')
171
172         if wizard.time_unit:
173             prod_id = data_obj.get_object(cr, uid, 'product', 'product_consultant').id
174             product_obj = self.pool.get('product.product')
175             product_obj.write(cr, uid, prod_id, {'uom_id': wizard.time_unit.id, 'uom_po_id': wizard.time_unit.id})
176
177         ir_values_obj.set(cr, uid, 'default', False, 'order_policy', ['sale.order'], wizard.order_policy)
178         if wizard.task_work and wizard.time_unit:
179             company_id = self.pool.get('res.users').browse(cr, uid, uid).company_id.id
180             self.pool.get('res.company').write(cr, uid, [company_id], {
181                 'project_time_mode_id': wizard.time_unit.id
182             }, context=context)
183             
184         return res
185
186     def onchange_tax_policy(self, cr, uid, ids, tax_policy, context=None):
187         self.set_tax_policy(cr, uid, ids, {'tax_policy': tax_policy}, context=context)
188         return {'value': {}}
189     
190     def set_default_taxes(self, cr, uid, ids, vals, context=None):
191         ir_values_obj = self.pool.get('ir.values')
192         taxes = self._check_default_tax(cr, uid, context=context)
193         if isinstance(vals.get('tax_value'), list):
194             taxes = vals.get('tax_value')
195         if taxes:
196             ir_values_obj.set(cr, uid, 'default', False, 'tax_id', ['sale.order'], taxes[0])
197             ir_values_obj.set(cr, uid, 'default', False, 'tax_id', ['sale.order.line'], taxes)
198             ir_values_obj.set(cr, uid, 'default', False, 'taxes_id', ['product.product'], taxes)
199
200 sale_configuration()
201
202 # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: