1 # -*- coding: utf-8 -*-
2 ##############################################################################
4 # OpenERP, Open Source Management Solution
5 # Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>).
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.
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.
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/>.
20 ##############################################################################
22 from osv import fields, osv
24 from tools.translate import _
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'
34 class sale_configuration(osv.osv_memory):
35 _inherit = 'res.config'
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',
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?',
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.
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.
84 'account_analytic_analysis': fields.boolean('Contracts',
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."""),
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
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')
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]
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))
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,
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)
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)
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)
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})
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')
160 wizard = self.browse(cr, uid, ids)[0]
161 group_id = data_obj.get_object(cr, uid, 'base', 'group_sale_salesman').id
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)])
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)])
173 if wizard.picking_policy:
174 ir_values_obj.set(cr, uid, 'default', False, 'picking_policy', ['sale.order'], 'one')
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})
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
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)
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')
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)
206 # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: