[IMP,FIX]: Fixed problem of plugin installation. Improved fetchmail code.
[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 modules."""),
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 delivery orders.
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="Allows you to set different delivery address and invoice 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 raise user specific warning messages on different products used in Sales Orders, Purchase Orders, Invoices and Deliveries. 
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="""Allows you to categorize 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="""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. 
71                                     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="""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         data_obj = self.pool.get('ir.model.data')
81         installed_modules = super(sale_configuration, self).get_default_installed_modules(cr, uid, ids, context=context)
82         if installed_modules.get('module_project_mrp') and installed_modules.get('module_project_timesheet'):
83             installed_modules['task_work'] = True
84         if installed_modules.get('module_account_analytic_analysis'):
85             prod_id = data_obj.get_object(cr, uid, 'product', 'product_consultant').id
86             uom_id = self.pool.get('product.product').browse(cr, uid, prod_id).uom_id.id
87             installed_modules.update({'time_unit': uom_id})
88         return installed_modules
89
90     def get_default_sale_configs(self, cr, uid, ids, context=None):
91         ir_values_obj = self.pool.get('ir.values')
92         data_obj = self.pool.get('ir.model.data')
93         menu_obj = self.pool.get('ir.ui.menu')
94         result = {}
95         invoicing_groups_id = [gid.id for gid in data_obj.get_object(cr, uid, 'sale', 'menu_invoicing_sales_order_lines').groups_id]
96         picking_groups_id = [gid.id for gid in data_obj.get_object(cr, uid, 'sale', 'menu_action_picking_list_to_invoice').groups_id]
97         group_id = data_obj.get_object(cr, uid, 'base', 'group_sale_salesman').id
98         for menu in ir_values_obj.get(cr, uid, 'default', False, ['ir.ui.menu']):
99             if menu[1] == 'groups_id' and group_id in menu[2][0]:
100                 if group_id in invoicing_groups_id:
101                     result['sale_orders'] = True
102                 if group_id in picking_groups_id:
103                     result['deli_orders'] = True
104         for res in ir_values_obj.get(cr, uid, 'default', False, ['sale.order']):
105             result[res[1]] = res[2]
106         return result
107     
108     _defaults = {
109         'order_policy': 'manual',
110         '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,
111     }
112
113     def create(self, cr, uid, vals, context=None):
114         ids = super(sale_configuration, self).create(cr, uid, vals, context=context)
115         self.execute(cr, uid, [ids], vals, context)
116         return ids
117
118     def write(self, cr, uid, ids, vals, context=None):
119         self.execute(cr, uid, ids, vals, context)
120         return super(sale_configuration, self).write(cr, uid, ids, vals, context=context)
121
122     def execute(self, cr, uid, ids, vals, context=None):
123         for method in dir(self):
124             if method.startswith('set_'):
125                 getattr(self, method)(cr, uid, ids, vals, context)
126         return True
127
128     def set_installed_modules(self, cr, uid, ids, vals, context=None):
129         if vals.get('task_work'):
130             vals.update({'module_project_timesheet': True, 'module_project_mrp': True})
131         else:
132             vals.update({'module_project_timesheet': False, 'module_project_mrp': False})
133
134         super(sale_configuration, self).set_installed_modules(cr, uid, ids, vals, context=context)
135
136     def set_sale_defaults(self, cr, uid, ids, vals, context=None):
137         ir_values_obj = self.pool.get('ir.values')
138         data_obj = self.pool.get('ir.model.data')
139         menu_obj = self.pool.get('ir.ui.menu')
140         res = {}
141         wizard = self.browse(cr, uid, ids)[0]
142         group_id = data_obj.get_object(cr, uid, 'base', 'group_sale_salesman').id
143
144         if wizard.sale_orders:
145             menu_id = data_obj.get_object(cr, uid, 'sale', 'menu_invoicing_sales_order_lines').id
146             menu_obj.write(cr, uid, menu_id, {'groups_id':[(4,group_id)]})
147             ir_values_obj.set(cr, uid, 'default', False, 'groups_id', ['ir.ui.menu'], [(4,group_id)])
148
149         if wizard.deli_orders:
150             menu_id = data_obj.get_object(cr, uid, 'sale', 'menu_action_picking_list_to_invoice').id
151             menu_obj.write(cr, uid, menu_id, {'groups_id':[(4,group_id)]})
152             ir_values_obj.set(cr, uid, 'default', False, 'groups_id', ['ir.ui.menu'], [(4,group_id)])
153             
154         if wizard.picking_policy:
155             ir_values_obj.set(cr, uid, 'default', False, 'picking_policy', ['sale.order'], 'one')
156
157         if wizard.time_unit:
158             prod_id = data_obj.get_object(cr, uid, 'product', 'product_consultant').id
159             product_obj = self.pool.get('product.product')
160             product_obj.write(cr, uid, prod_id, {'uom_id': wizard.time_unit.id, 'uom_po_id': wizard.time_unit.id})
161
162         ir_values_obj.set(cr, uid, 'default', False, 'order_policy', ['sale.order'], wizard.order_policy)
163         if wizard.task_work and wizard.time_unit:
164             company_id = self.pool.get('res.users').browse(cr, uid, uid).company_id.id
165             self.pool.get('res.company').write(cr, uid, [company_id], {
166                 'project_time_mode_id': wizard.time_unit.id
167             }, context=context)
168             
169         return res
170
171     def onchange_tax_policy(self, cr, uid, ids, tax_policy, context=None):
172         self.set_tax_policy(cr, uid, ids, {'tax_policy': tax_policy}, context=context)
173         return {'value': {}}
174     
175     def set_default_taxes(self, cr, uid, ids, vals, context=None):
176         ir_values_obj = self.pool.get('ir.values')
177         taxes = self._check_default_tax(cr, uid, context=context)
178         if isinstance(vals.get('tax_value'), list):
179             taxes = vals.get('tax_value')
180         if taxes:
181             ir_values_obj.set(cr, uid, 'default', False, 'tax_id', ['sale.order'], taxes[0])
182             ir_values_obj.set(cr, uid, 'default', False, 'tax_id', ['sale.order.line'], taxes)
183             ir_values_obj.set(cr, uid, 'default', False, 'taxes_id', ['product.product'], taxes)
184
185 sale_configuration()
186
187 # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: