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