[IMP] sale.config.settings: improve code for delivery and tasks work fields
[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 = 'sale.config.settings'
28
29     _columns = {
30         'group_invoice_so_lines': fields.boolean('Based on Sales Orders',
31             implied_group='sale.group_invoice_so_lines',
32             help="To allow your salesman to make invoices for sale order lines using the menu 'Lines to Invoice'."),
33         'group_invoice_deli_orders': fields.boolean('Based on Delivery Orders',
34             implied_group='sale.group_invoice_deli_orders',
35             help="To allow your salesman to make invoices for Delivery Orders using the menu 'Deliveries to Invoice'."),
36         'task_work': fields.boolean('Based on Tasks\' Work',
37             help="""Lets you transfer the entries under tasks defined for Project Management to
38                 the Timesheet line entries for particular date and particular user  with the effect of creating, editing and deleting either ways
39                 and to automatically creates project tasks from procurement lines.
40                 This installs the modules project_timesheet and project_mrp."""),
41         'module_account_analytic_analysis': fields.boolean('Based on Timesheet',
42             help = """For modifying account analytic view to show important data to project manager of services companies.
43                 You can also view the report of account analytic summary user-wise as well as month wise.
44                 This installs the module account_analytic_analysis."""),
45         'default_order_policy': fields.selection(
46             [('manual', 'Invoice Based on Sales Orders'), ('picking', 'Invoice Based on Deliveries')],
47             'Main Method Based On', required=True, default_model='sale.order',
48             help="You can generate invoices based on sales orders or based on shippings."),
49         'module_delivery': fields.boolean('Charge delivery costs',
50             help ="""Allows you to add delivery methods in sale orders and delivery orders.
51                 You can define your own carrier and delivery grids for prices.
52                 This installs the module delivery."""),
53         'time_unit': fields.many2one('product.uom', 'Working Time Unit'),
54         'default_picking_policy' : fields.boolean("Deliver all products at once",
55             help = "You can set picking policy on sale order that will allow you to deliver all products at once."),
56         'group_sale_delivery_address':fields.boolean("Multiple Address", group='base.group_user', implied_group='base.group_sale_delivery_address',
57                                                      help="Allows you to set different delivery address and invoice address. It assigns Multiple Address group to all employees."),
58         'group_sale_disc_per_sale_order_line':fields.boolean("Discounts per sale order lines ", group='base.group_user', implied_group='base.group_sale_disc_per_sale_order_line',
59                                                              help="This allows you to apply discounts per sale order lines, it assigns Discounts per sale order lines group to all employees."),
60         '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."),
61         'module_warning': fields.boolean("Alerts by products or customers",
62                                   help="""To raise user specific warning messages on different products used in Sales Orders, Purchase Orders, Invoices and Deliveries.
63                                   It installs the warning module."""),
64         'module_sale_margin': fields.boolean("Display Margin For Users",
65                         help="""This adds the 'Margin' on sales order.
66                         This gives the profitability by calculating the difference between the Unit Price and Cost Price.
67                         It installs the sale_margin module."""),
68         'module_sale_journal': fields.boolean("Invoice Journal",
69                         help="""Allows you to categorize your sales and deliveries (picking lists) between different journals.
70                         It installs the sale_journal module."""),
71         'module_analytic_user_function' : fields.boolean("User function by contracts",
72                                     help="""Allows you to define what is the default function of a specific user on a given account.
73                                     This is mostly used when a user encodes his timesheet. The values are retrieved and the fields are auto-filled.
74                                     But the possibility to change these values is still available.
75                                     It installs analytic_user_function module."""),
76         'module_analytic_journal_billing_rate' : fields.boolean("Billing rates by contracts",
77                                     help="""Allows you to define what is the default invoicing rate for a specific journal on a given account.
78                                     It installs analytic_journal_billing_rate module.
79                                     """),
80         'tax_policy': fields.selection([
81                 ('no_tax', 'No Tax'),
82                 ('global_on_order', 'Global On Order'),
83                 ('on_order_line', 'On Order Lines'),
84             ], 'Taxes', required=True,
85             help="""
86                 If you want to apply global tax on sale order then select 'Global On Order' it will add 'Global On Order' group to employees.
87                 If you want to apply different taxes for sale order lines then select 'On Order Lines' it will add 'On Order Lines' group to employees.
88             """),
89         'group_sale_taxes_global_on_order':fields.boolean("Global on order", group='base.group_user', implied_group='base.group_sale_taxes_global_on_order'),
90         'group_sale_taxes_on_order_line':fields.boolean("On order line", group='base.group_user', implied_group='base.group_sale_taxes_on_order_line'),
91         'module_project_timesheet': fields.boolean("Project Timesheet"),
92         'module_project_mrp': fields.boolean("Project MRP"),
93     }
94
95     def default_get(self, cr, uid, fields, context=None):
96         ir_model_data = self.pool.get('ir.model.data')
97         res = super(sale_configuration, self).default_get(cr, uid, fields, context)
98         res['task_work'] = res.get('module_project_mrp') and res.get('module_project_timesheet')
99         if res.get('module_account_analytic_analysis'):
100             product = ir_model_data.get_object(cr, uid, 'product', 'product_consultant')
101             res['time_unit'] = product.uom_id.id
102         if res.get('group_sale_taxes_global_on_order'):
103             res.update({'tax_policy': 'global_on_order'})
104         elif res.get('group_sale_taxes_on_order_line'):
105             res.update({'tax_policy': 'on_order_line'})
106         else:
107             res.update({'tax_policy': 'no_tax'})
108         return res
109
110     def get_default_sale_config(self, cr, uid, ids, context=None):
111         ir_values = self.pool.get('ir.values')
112         default_picking_policy = ir_values.get_default(cr, uid, 'sale.order', 'picking_policy')
113         return {
114             'default_picking_policy': default_picking_policy == 'one',
115         }
116
117     def _get_default_time_unit(self, cr, uid, context=None):
118         ids = self.pool.get('product.uom').search(cr, uid, [('name', '=', _('Hour'))], context=context)
119         return ids and ids[0] or False
120
121     _defaults = {
122         'default_order_policy': 'manual',
123         'time_unit': _get_default_time_unit,
124         'tax_policy': 'global_on_order',
125     }
126
127     def _check_default_tax(self, cr, uid, context=None):
128         ir_values_obj = self.pool.get('ir.values')
129         for tax in ir_values_obj.get(cr, uid, 'default', False, ['product.product']):
130             if tax[1] == 'taxes_id':
131                 return tax[2]
132         return False
133
134     def set_sale_defaults(self, cr, uid, ids, context=None):
135         ir_values = self.pool.get('ir.values')
136         ir_values_obj = self.pool.get('ir.values')
137         data_obj = self.pool.get('ir.model.data')
138         menu_obj = self.pool.get('ir.ui.menu')
139         res = {}
140         wizard = self.browse(cr, uid, ids)[0]
141
142         default_picking_policy = 'one' if wizard.default_picking_policy else 'direct'
143         ir_values.set_default(cr, uid, 'sale.order', 'picking_policy', default_picking_policy)
144
145         if wizard.time_unit:
146             product = ir_model_data.get_object(cr, uid, 'product', 'product_consultant')
147             product.write({'uom_id': wizard.time_unit.id, 'uom_po_id': wizard.time_unit.id})
148
149         if wizard.task_work and wizard.time_unit:
150             user = self.pool.get('res.users').browse(cr, uid, uid, context)
151             user.company_id.write({'project_time_mode_id': wizard.time_unit.id})
152
153         return res
154
155     def onchange_task_work(self, cr, uid, ids, task_work, context=None):
156         return {'value': {
157             'module_project_timesheet': task_work,
158             'module_project_mrp': task_work,
159         }}
160
161     def onchange_tax_policy(self, cr, uid, ids, tax_policy, context=None):
162         res = {'value': {}}
163         if ids:
164             self.set_tax_policy(cr, uid, ids, context=context)
165         if tax_policy == 'global_on_order':
166             res['value'].update({'group_sale_taxes_global_on_order': True})
167             res['value'].update({'group_sale_taxes_on_order_line': False})
168
169         elif tax_policy == 'on_order_line':
170             res['value'].update({'group_sale_taxes_on_order_line': True})
171             res['value'].update({'group_sale_taxes_global_on_order': False})
172         else:
173             res['value'].update({'group_sale_taxes_on_order_line': False, 'group_sale_taxes_global_on_order': False})
174         return res
175
176     def set_default_taxes(self, cr, uid, ids, context=None):
177         ir_values_obj = self.pool.get('ir.values')
178         taxes = self._check_default_tax(cr, uid, context=context)
179         if taxes:
180             ir_values_obj.set(cr, uid, 'default', False, 'tax_id', ['sale.order'], taxes[0])
181             ir_values_obj.set(cr, uid, 'default', False, 'tax_id', ['sale.order.line'], taxes)
182             ir_values_obj.set(cr, uid, 'default', False, 'taxes_id', ['product.product'], taxes)
183
184 # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: