[IMP] sale, purchase: set default tax policy to 'no tax', and 'global on order' is...
[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_pricelist':fields.boolean("Pricelist per Customer",
57             implied_group='product.group_sale_pricelist',
58             help="""Allows to manage different prices based on rules per category of customers. 
59                 Example: 10% for retailers, promotion of 5 EUR on this product, etc."""),
60         'group_uom':fields.boolean("Allow different UoM per product",
61             implied_group='product.group_uom',
62             help="""Allows you to select and maintain different unit of measures per product."""),
63         'group_sale_delivery_address': fields.boolean("Specify delivery and invoice addresses",
64             implied_group='sale.group_delivery_invoice_address',
65             help="Allows you to specify different delivery and invoice addresses on a sale order."),
66         'group_discount_per_so_line': fields.boolean("Discount per sale order line",
67             implied_group='sale.group_discount_per_so_line',
68             help="Allows you to apply discount per sale order line."),
69         'module_sale_layout': fields.boolean("Notes & subtotals per line",
70             help="""Allows to format sale order lines using notes, separators, titles and subtotals.
71                 This installs the module sale_layout."""),
72         'module_warning': fields.boolean("Alerts by products or customers",
73             help="""To raise user specific warning messages on different products used in Sales Orders, Purchase Orders, Invoices and Deliveries.
74                 This installs the module warning."""),
75         'module_sale_margin': fields.boolean("Display Margins For Users",
76             help="""This adds the 'Margin' on sales order.
77                 This gives the profitability by calculating the difference between the Unit Price and Cost Price.
78                 This installs the module sale_margin."""),
79         'module_sale_journal': fields.boolean("Invoice Journal",
80             help="""Allows you to categorize your sales and deliveries (picking lists) between different journals.
81                 This installs the module sale_journal."""),
82         'module_analytic_user_function': fields.boolean("User function by contracts",
83             help="""Allows you to define what is the default function of a specific user on a given account.
84                 This is mostly used when a user encodes his timesheet. The values are retrieved and the fields are auto-filled.
85                 But the possibility to change these values is still available.
86                 This installs the module analytic_user_function."""),
87         'module_analytic_journal_billing_rate': fields.boolean("Billing rates by contracts",
88             help="""Allows you to define the default invoicing rate for a specific journal on a given account.
89                 This installs the module analytic_journal_billing_rate."""),
90         'tax_policy': fields.selection(
91             [('no_tax', 'No Tax'), ('global_on_order', 'Global On Order'), ('on_order_line', 'On Order Lines')],
92             'Taxes', required=True,
93             help="""Choose between either applying global taxes on a sale order, or applying different taxes on sale order lines, or applying no tax at all."""),
94         'group_sale_taxes_global_on_order': fields.boolean("Global on order",
95             implied_group='sale.group_taxes_global_on_order'),
96         'group_sale_taxes_on_order_line': fields.boolean("On order line",
97             implied_group='sale.group_taxes_on_order_line'),
98         'module_project_timesheet': fields.boolean("Project Timesheet"),
99         'module_project_mrp': fields.boolean("Project MRP"),
100     }
101
102     def default_get(self, cr, uid, fields, context=None):
103         ir_model_data = self.pool.get('ir.model.data')
104         res = super(sale_configuration, self).default_get(cr, uid, fields, context)
105         # task_work, time_unit and tax_policy depend on other fields
106         res['task_work'] = res.get('module_project_mrp') and res.get('module_project_timesheet')
107         if res.get('module_account_analytic_analysis'):
108             product = ir_model_data.get_object(cr, uid, 'product', 'product_consultant')
109             res['time_unit'] = product.uom_id.id
110         res['tax_policy'] = \
111             (res.get('group_sale_taxes_global_on_order') and 'global_on_order') or \
112             (res.get('group_sale_taxes_on_order_line') and 'on_order_line') or \
113             'no_tax'
114         return res
115
116     def get_default_sale_config(self, cr, uid, ids, context=None):
117         ir_values = self.pool.get('ir.values')
118         default_picking_policy = ir_values.get_default(cr, uid, 'sale.order', 'picking_policy')
119         return {
120             'default_picking_policy': default_picking_policy == 'one',
121         }
122
123     def _get_default_time_unit(self, cr, uid, context=None):
124         ids = self.pool.get('product.uom').search(cr, uid, [('name', '=', _('Hour'))], context=context)
125         return ids and ids[0] or False
126
127     _defaults = {
128         'default_order_policy': 'manual',
129         'time_unit': _get_default_time_unit,
130         'tax_policy': 'no_tax',
131     }
132
133     def set_sale_defaults(self, cr, uid, ids, context=None):
134         ir_values = self.pool.get('ir.values')
135         ir_model_data = self.pool.get('ir.model.data')
136         wizard = self.browse(cr, uid, ids)[0]
137
138         default_picking_policy = 'one' if wizard.default_picking_policy else 'direct'
139         ir_values.set_default(cr, uid, 'sale.order', 'picking_policy', default_picking_policy)
140
141         if wizard.time_unit:
142             product = ir_model_data.get_object(cr, uid, 'product', 'product_consultant')
143             product.write({'uom_id': wizard.time_unit.id, 'uom_po_id': wizard.time_unit.id})
144
145         if wizard.task_work and wizard.time_unit:
146             user = self.pool.get('res.users').browse(cr, uid, uid, context)
147             user.company_id.write({'project_time_mode_id': wizard.time_unit.id})
148
149         return {}
150
151     def onchange_task_work(self, cr, uid, ids, task_work, context=None):
152         return {'value': {
153             'module_project_timesheet': task_work,
154             'module_project_mrp': task_work,
155         }}
156
157     def onchange_tax_policy(self, cr, uid, ids, tax_policy, context=None):
158         return {'value': {
159             'group_sale_taxes_global_on_order': tax_policy == 'global_on_order',
160             'group_sale_taxes_on_order_line': tax_policy == 'on_order_line',
161         }}
162
163 # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: