[MERGE] trunk-v62_config_sale-uco (new sale config wizard)

bzr revid: rco@openerp.com-20120321152751-9okrox08jmd2wrxu
This commit is contained in:
Raphael Collet
2012-03-21 16:27:51 +01:00
36 changed files with 661 additions and 288 deletions
@@ -3,15 +3,15 @@
<data>
<!--
Analytic Account form
Analytic Account form
Remove information on Account data => because they move on analysis sheet
create a page with invoicing informations
-->
<record id="account_analytic_account_invoice_stat_form" model="ir.ui.view">
<field name="name">account.analytic.account.invoice.stat.form.inherit</field>
<field name="model">account.analytic.account</field>
<field name="type">form</field>
<field name="name">account.analytic.account.invoice.stat.form.inherit</field>
<field name="model">account.analytic.account</field>
<field name="type">form</field>
<field name="inherit_id" ref="hr_timesheet_invoice.account_analytic_account_form_form"/>
<field eval="18" name="priority"/>
<field name="arch" type="xml">
@@ -30,9 +30,9 @@
</record>
<record id="hr_timesheet.account_analytic_account_form_form" model="ir.ui.view">
<field name="name">account.analytic.account.invoice.form.inherit</field>
<field name="model">account.analytic.account</field>
<field name="type">form</field>
<field name="name">account.analytic.account.invoice.form.inherit</field>
<field name="model">account.analytic.account</field>
<field name="type">form</field>
<field name="inherit_id" ref="account.view_account_analytic_account_form"/>
<field eval="18" name="priority"/>
<field name="arch" type="xml">
@@ -69,7 +69,7 @@
</tree>
</field>
</page>
<page string="Stats by user">
<page string="Stats by user">
<field colspan="4" name="user_ids" nolabel="1">
<tree string="Users">
<field name="user"/>
@@ -97,19 +97,33 @@
</field>
</field>
</record>
<record id="view_account_analytic_account_tree_c2c_3" model="ir.ui.view">
<field name="name">account.analytic.account.tree</field>
<field name="model">account.analytic.account</field>
<record id="view_account_analytic_account_tree_c2c_3" model="ir.ui.view">
<field name="name">account.analytic.account.tree</field>
<field name="model">account.analytic.account</field>
<field name="inherit_id" ref="account.view_account_analytic_account_list"/>
<field name="type">tree</field>
<field name="arch" type="xml">
<field name="date" position="before">
<field name="type">tree</field>
<field name="arch" type="xml">
<field name="date" position="before">
<field name="last_invoice_date"/>
<field name="ca_to_invoice"/>
</field>
</field>
</record>
<record id="view_contract_installation" model="ir.ui.view">
<field name="name">Sales Application</field>
<field name="model">sale.config.settings</field>
<field name="inherit_id" ref="sale.view_sales_config"/>
<field name="type">form</field>
<field name="arch" type="xml">
<group name="config_contracts" position="inside">
<separator string="Contracts" colspan="4"/>
<field name="module_analytic_user_function"/>
<field name="module_analytic_journal_billing_rate"/>
</group>
</field>
</record>
</data>
</openerp>
+10 -9
View File
@@ -142,18 +142,19 @@
<field name="sequence">1</field>
</record>
<record id="base.sale_settings_form_view" model="ir.ui.view">
<record id="base.view_sale_config_settings" model="ir.ui.view">
<field name="name">sale.config.settings</field>
<field name="model">sale.config.settings</field>
<field name="type">form</field>
<field name="arch" type="xml">
<form string="Configure Sales &amp; CRM">
<group name="sales" colspan="4">
</group>
<group name="crm" colspan="4">
</group>
<group name="plugins" colspan="4">
</group>
<group name="config_sale" colspan="4"/>
<group name="config_contracts" colspan="4"/>
<group name="config_emails" colspan="4"/>
<group name="config_crm" colspan="4"/>
<label colspan="2"/>
<button string="Cancel" icon="gtk-cancel" special="cancel"/>
<button string="Apply" icon="gtk-ok" type="object" name="execute"/>
</form>
</field>
</record>
@@ -162,9 +163,9 @@
<field name="name">Configure Sales &amp; CRM</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">sale.config.settings</field>
<field name="view_id" ref="base.sale_settings_form_view"/>
<field name="view_type">form</field>
<field name="view_id" ref="base.view_sale_config_settings"/>
<field name="view_mode">form</field>
<field name="target">new</field>
</record>
</data>
+1
View File
@@ -28,6 +28,7 @@ import crm_phonecall
import report
import wizard
import res_partner
import res_config
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
+2
View File
@@ -111,6 +111,8 @@ Creates a dashboard for CRM that includes:
'res_partner_view.xml',
'board_crm_statistical_view.xml',
'board_crm_view.xml',
'res_config_view.xml',
],
'demo_xml': [
+126
View File
@@ -0,0 +1,126 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# OpenERP, Open Source Management Solution
# Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>).
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
from osv import fields, osv
class crm_configuration(osv.osv_memory):
_inherit = 'sale.config.settings'
_columns = {
'module_crm_caldav': fields.boolean("Caldav Synchronization",
help="""Use protocol caldav to synchronize meetings with other calendar applications (like Sunbird).
This installs the module crm_caldav."""),
'fetchmail_crm': fields.boolean("Lead/Opportunity mail gateway",
help="Create leads automatically from an email gateway."),
'default_server': fields.char('Server Name', size=256),
'default_port': fields.integer('Port'),
'default_type': fields.selection([
('pop', 'POP Server'),
('imap', 'IMAP Server'),
('local', 'Local Server'),
], 'Server Type'),
'default_is_ssl': fields.boolean('SSL/TLS',
help="Connections are encrypted with SSL/TLS through a dedicated port (default: IMAPS=993, POP=995)"),
'default_user': fields.char('Username', size=256),
'default_password': fields.char('Password', size=1024),
'module_import_sugarcrm': fields.boolean("SugarCRM Import",
help="""Import SugarCRM leads, opportunities, users, accounts, contacts, employees, meetings, phonecalls, emails, project and project tasks data.
This installs the module import_sugarcrm."""),
'module_import_google': fields.boolean("Google Import",
help="""Import google contact in partner address and add google calendar events details in Meeting.
This installs the module import_google."""),
'module_wiki_sale_faq': fields.boolean("Install a sales FAQ",
help="""This provides demo data, thereby creating a Wiki Group and a Wiki Page for Wiki Sale FAQ.
This installs the module wiki_sale_faq."""),
'module_base_contact': fields.boolean("Manage a several addresses per customer",
help="""Lets you define:
* contacts unrelated to a partner,
* contacts working at several addresses (possibly for different partners),
* contacts with possibly different job functions.
This installs the module base_contact."""),
'module_google_map': fields.boolean("Google maps on customer",
help="""Locate customers on Google Map.
This installs the module google_map."""),
}
_defaults = {
'default_type': 'pop',
}
def onchange_server_type(self, cr, uid, ids, server_type, ssl, context=None):
values = {}
if server_type == 'pop':
values['default_port'] = ssl and 995 or 110
elif server_type == 'imap':
values['default_port'] = ssl and 993 or 143
else:
values['default_server'] = False
values['default_port'] = 0
return {'value': values}
def get_default_email_configurations(self, cr, uid, ids, context=None):
ir_values = self.pool.get('ir.values')
server_count = self.pool.get('fetchmail.server').search(cr, uid,
[('name','=','Incoming Leads'), ('state','=','done')], count=True)
return {
'fetchmail_crm': bool(server_count),
'default_server': ir_values.get_default(cr, uid, 'fetchmail.server', 'server') or False,
'default_port': ir_values.get_default(cr, uid, 'fetchmail.server', 'port') or False,
'default_type': ir_values.get_default(cr, uid, 'fetchmail.server', 'type') or False,
'default_is_ssl': ir_values.get_default(cr, uid, 'fetchmail.server', 'is_ssl') or False,
'default_user': ir_values.get_default(cr, uid, 'fetchmail.server', 'user') or False,
'default_password': ir_values.get_default(cr, uid, 'fetchmail.server', 'password') or False,
}
def set_email_configurations(self, cr, uid, ids, context=None):
ir_values = self.pool.get('ir.values')
fetchmail_obj = self.pool.get('fetchmail.server')
config = self.browse(cr, uid, ids[0], context)
model_ids = self.pool.get('ir.model').search(cr, uid, [('model', '=', 'crm.lead')])
if config.fetchmail_crm and model_ids:
fetchmail_vals = {
'name': 'Incoming Leads',
'object_id': model_ids[0],
'server': config.default_server,
'port': config.default_port,
'is_ssl': config.default_is_ssl,
'type': config.default_type,
'user': config.default_user,
'password': config.default_password,
}
server_ids = fetchmail_obj.search(cr, uid, [('name','=','Incoming Leads'), ('state','=','done')])
if not server_ids:
server_ids = [fetchmail_obj.create(cr, uid, fetchmail_vals, context=context)]
else:
server_ids = fetchmail_obj.search(cr, uid, [('name','=','Incoming Leads')], context=context)
fetchmail_obj.write(cr, uid, server_ids, fetchmail_vals, context=context)
fetchmail_obj.button_confirm_login(cr, uid, server_ids, context=None)
ir_values.set_default(cr, uid, 'fetchmail.server', 'server', config.default_server)
ir_values.set_default(cr, uid, 'fetchmail.server', 'port', config.default_port)
ir_values.set_default(cr, uid, 'fetchmail.server', 'is_ssl', config.default_is_ssl)
ir_values.set_default(cr, uid, 'fetchmail.server', 'type', config.default_type)
ir_values.set_default(cr, uid, 'fetchmail.server', 'user', config.default_user)
ir_values.set_default(cr, uid, 'fetchmail.server', 'password', config.default_password)
else:
server_ids = fetchmail_obj.search(cr, uid, [('name','=','Incoming Leads'), ('state','=','done')])
fetchmail_obj.set_draft(cr, uid, server_ids, context=None)
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
+45
View File
@@ -0,0 +1,45 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
<record id="view_sales_config_crm" model="ir.ui.view">
<field name="name">Sales Application</field>
<field name="model">sale.config.settings</field>
<field name="type">form</field>
<field name="inherit_id" ref="mail.view_sales_config_plugin"/>
<field name="arch" type="xml">
<group name="config_emails" position="inside">
<separator string="Emails" colspan="4"/>
<field name="fetchmail_crm"/>
<group colspan="2" attrs="{'invisible': [('fetchmail_crm','=',False)]}">
<field name="default_server" attrs="{'required': [('fetchmail_crm','=',True)]}"/>
<field name="default_type" nolabel="1" on_change="onchange_server_type(default_type, default_is_ssl)" attrs="{'required': [('fetchmail_crm','=',True)]}"/>
<field name="default_port" attrs="{'required': [('fetchmail_crm','=',True)]}"/>
<field name="default_is_ssl" on_change="onchange_server_type(default_type, default_is_ssl)"/>
<newline/>
<field name="default_user" attrs="{'required': [('fetchmail_crm','=',True)]}"/>
<field name="default_password" password="True" attrs="{'required': [('fetchmail_crm','=',True)]}"/>
</group>
</group>
<group name="config_crm" position="inside">
<separator string="Import and Synchronize data from an other application" colspan="4"/>
<group colspan="2" col="2">
<field name="module_import_sugarcrm"/>
<field name="module_import_google"/>
</group>
<group colspan="2" col="2">
<field name="module_crm_caldav"/>
</group>
<separator string="Documents and Wiki" colspan="4"/>
<field name="module_wiki_sale_faq" />
<separator string="Customer Form" colspan="4"/>
<field name="module_base_contact"/>
<field name="module_google_map"/>
</group>
</field>
</record>
<menuitem id="base.menu_sale_config" name="Sales &amp; CRM" parent="base.menu_config" sequence="1" action="base.action_sale_config"/>
</data>
</openerp>
+1 -20
View File
@@ -106,7 +106,7 @@ class delivery_carrier(osv.osv):
# if using advanced pricing per destination: do not change
if record.use_detailed_pricelist:
continue
# not using advanced pricing per destination: override grid
grid_id = grid_pool.search(cr, uid, [('carrier_id', '=', record.id)], context=context)
@@ -250,23 +250,4 @@ class delivery_grid_line(osv.osv):
delivery_grid_line()
class define_delivery_steps(osv.osv_memory):
_name = 'delivery.define.delivery.steps.wizard'
_columns = {
'picking_policy' : fields.selection([('direct', 'Deliver each product when available'), ('one', 'Deliver all products at once')], 'Picking Policy'),
}
_defaults = {
'picking_policy': lambda s,c,u,ctx: s.pool.get('sale.order').default_get(c,u,['picking_policy'],context=ctx)['picking_policy']
}
def apply_cb(self, cr, uid, ids, context=None):
ir_values_obj = self.pool.get('ir.values')
wizard = self.browse(cr, uid, ids, context=context)[0]
ir_values_obj.set(cr, uid, 'default', False, 'picking_policy', ['sale.order'], wizard.picking_policy)
return {'type' : 'ir.actions.act_window_close'}
define_delivery_steps()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
-30
View File
@@ -337,35 +337,5 @@
<field name="sequence">10</field>
</record>
<record model="ir.ui.view" id="define_delivery_steps_form">
<field name="name">delivery.define_delivery_steps</field>
<field name="model">delivery.define.delivery.steps.wizard</field>
<field name="type">form</field>
<field name="arch" type="xml">
<form string="Setup Your Picking Policy">
<separator string="Choose Your Default Picking Policy" colspan="4"/>
<field name="picking_policy" />
<separator string="" colspan="4"/>
<group colspan="4">
<button string="Cancel" icon="gtk-cancel" special="cancel" />
<button string="Apply" icon="gtk-apply" name="apply_cb" type="object" />
</group>
</form>
</field>
</record>
<record model="ir.actions.act_window" id="action_define_delivery_steps">
<field name="name">Setup Your Picking Policy</field>
<field name="res_model">delivery.define.delivery.steps.wizard</field>
<field name="view_type">form</field>
<field name="view_mode">form</field>
<field name="target">new</field>
</record>
<record model="ir.actions.todo" id="todo_define_delivery_steps">
<field name="action_id" ref="action_define_delivery_steps" />
<field name="category_id" ref="base.category_sales_management_config"/>
<field name="type">once</field>
</record>
</data>
</openerp>
+3 -3
View File
@@ -67,9 +67,9 @@
-
I set default delivery policy.
-
!record {model: delivery.define.delivery.steps.wizard, id: default_delivery_policy}:
!record {model: sale.config.settings, id: default_delivery_policy}:
{}
-
!python {model: delivery.define.delivery.steps.wizard}: |
self.apply_cb(cr, uid, [ref('default_delivery_policy')], context=context)
!python {model: sale.config.settings}: |
self.execute(cr, uid, [ref('default_delivery_policy')], context=context)
@@ -11,7 +11,7 @@
<group colspan="2" col="2" name="invoice_data">
<separator colspan="2" string="Invoicing Data"/>
<field name="to_invoice" widget="selection"/>
<field name="pricelist_id" domain="[('type','=','sale')]" attrs="{'required':[('to_invoice','!=',False)]}"/>
<field name="pricelist_id" groups="product.group_sale_pricelist" domain="[('type','=','sale')]" attrs="{'required':[('to_invoice','!=',False)]}"/>
<field name="amount_max"/>
</group>
<group colspan="2" col="2" name="invoice_stats">
+1
View File
@@ -23,6 +23,7 @@ import mail_message
import mail_thread
import res_partner
import wizard
import res_config
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
+1
View File
@@ -62,6 +62,7 @@ The main features are:
"res_partner_view.xml",
'security/ir.model.access.csv',
'mail_data.xml',
'res_config_view.xml',
],
'installable': True,
'auto_install': False,
+43
View File
@@ -0,0 +1,43 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# OpenERP, Open Source Management Solution
# Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>).
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
from osv import fields, osv
class plugin_configuration(osv.osv_memory):
_inherit = 'sale.config.settings'
_columns = {
'module_plugin_thunderbird': fields.boolean('Thunderbird plugin',
help="""The plugin allows you archive email and its attachments to the selected
OpenERP objects. You can select a partner, a task, a project, an analytical
account, or any other object and attach the selected mail as a .eml file in
the attachment of a selected record. You can create documents for CRM Lead,
HR Applicant and Project Issue from the selected emails.
This installs the module plugin_thunderbird."""),
'module_plugin_outlook': fields.boolean('Outlook plugin',
help="""The Outlook plugin allows you to select an object that you would like to add
to your email and its attachments from MS Outlook. You can select a partner, a task,
a project, an analytical account, or any other object and archive a selected
email into an OpenERP mail message with attachments.
This installs the module plugin_outlook."""),
}
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
+20
View File
@@ -0,0 +1,20 @@
<openerp>
<data>
<record id="view_sales_config_plugin" model="ir.ui.view">
<field name="name">Sales Application</field>
<field name="model">sale.config.settings</field>
<field name="type">form</field>
<field name="inherit_id" ref="base.view_sale_config_settings"/>
<field name="arch" type="xml">
<group name="config_emails" position="after">
<separator string="Plugins" colspan="4"/>
<field name="module_plugin_thunderbird"/>
<newline/>
<field name="module_plugin_outlook"/>
</group>
</field>
</record>
</data>
</openerp>
+1 -1
View File
@@ -118,7 +118,7 @@
<page string="Invoicing">
<field name="invoice_method" colspan="4"/>
<field
name="pricelist_id" context="{'product_id':product_id}"
name="pricelist_id" groups="product.group_sale_pricelist" context="{'product_id':product_id}"
attrs="{'readonly':[('invoice_method','=', 'none')]}"/>
<field name="partner_invoice_id" attrs="{'readonly':[('invoice_method','=', 'none')]}"/>
<!-- <field name="invoice_id"/> -->
+11 -5
View File
@@ -48,11 +48,17 @@
<field name="target">new</field>
</record>
<record id="outlook_installer_todo" model="ir.actions.todo">
<field name="action_id" ref="action_outlook_installer"/>
<field name="category_id" ref="base.category_sales_management_config"/>
<field name="sequence">4</field>
<field name="type">automatic</field>
<!-- Sales Configuration -->
<record id="view_config_outlook_installer" model="ir.ui.view">
<field name="name">Sales Application</field>
<field name="model">sale.config.settings</field>
<field name="type">form</field>
<field name="inherit_id" ref="mail.view_sales_config_plugin"/>
<field name="arch" type="xml">
<field name="module_plugin_outlook" position="after">
<button name="%(action_outlook_installer)d" type="action" string="Configure" icon="gtk-execute"/>
</field>
</field>
</record>
<record id="action_outlook_wizard" model="ir.actions.act_window">
@@ -54,11 +54,18 @@
<field name="view_mode">form</field>
<field name="target">new</field>
</record>
<record id="thunderbird_installer_todo" model="ir.actions.todo">
<field name="action_id" ref="action_thunderbird_installer"/>
<field name="category_id" ref="base.category_sales_management_config"/>
<field name="sequence">3</field>
<field name="type">automatic</field>
<!-- Sales Configuration -->
<record id="view_config_thunderbird_installer" model="ir.ui.view">
<field name="name">Sales Application</field>
<field name="model">sale.config.settings</field>
<field name="type">form</field>
<field name="inherit_id" ref="mail.view_sales_config_plugin"/>
<field name="arch" type="xml">
<field name="module_plugin_thunderbird" position="after">
<button name="%(action_thunderbird_installer)d" type="action" string="Configure" icon="gtk-execute"/>
</field>
</field>
</record>
<menuitem id="base.menu_base_config_plugins" name="Plugins" parent="base.menu_base_config" sequence="10"/>
+1 -1
View File
@@ -80,7 +80,7 @@
<field name="company_id" groups="base.group_multi_company"/>
<field name="shop_id" widget="selection"/>
<field name="user_id"/>
<field name="pricelist_id" domain="[('type','=','sale')]"/>
<field name="pricelist_id" groups="product.group_sale_pricelist" domain="[('type','=','sale')]"/>
<field name="picking_id" readonly="1" groups="base.group_extended"/>
</group>
<group colspan="2" col="3">
+1
View File
@@ -23,5 +23,6 @@ import pricelist
import report
import partner
import wizard
import res_config
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
+1 -1
View File
@@ -9,7 +9,7 @@
<field name="arch" type="xml">
<page string="Sales &amp; Purchases" position="inside">
<newline/>
<group col="2" colspan="2" groups="base.group_extended">
<group col="2" colspan="2" groups="product.group_sale_pricelist">
<separator string="Sales Properties" colspan="2"/>
<field name="property_product_pricelist"/>
</group>
+3 -2
View File
@@ -4,7 +4,8 @@
<menuitem id="base.menu_sale_config_sales" name="Sales"
parent="base.menu_base_config" sequence="0" groups="base.group_extended"/>
<menuitem groups="base.group_extended" id="menu_product_pricelist_main" name="Pricelists" parent="base.menu_base_config" sequence="50"/>
<menuitem id="menu_product_pricelist_main" name="Pricelists"
parent="base.menu_base_config" groups="product.group_sale_pricelist" sequence="50"/>
<record id="product_pricelist_version_form_view" model="ir.ui.view">
<field name="name">product.pricelist.version.form</field>
@@ -195,7 +196,7 @@
</form>
</field>
</record>
<record id="product_price_type_action" model="ir.actions.act_window">
<field name="name">Price Types</field>
<field name="type">ir.actions.act_window</field>
+9 -9
View File
@@ -20,7 +20,7 @@
<field name="categ_id" widget="selection" operator="child_of" groups="base.group_extended"/>
<newline/>
<group expand="0" string="Context..." groups="base.group_extended">
<field name="pricelist_id" widget="selection" context="{'pricelist': self}" />
<field name="pricelist_id" widget="selection" context="{'pricelist': self}" groups="product.group_sale_pricelist"/>
<separator orientation="vertical" groups="base.group_multi_company" />
<field name="company_id" widget="selection" groups="base.group_multi_company" />
</group>
@@ -50,7 +50,7 @@
<field name="name"/>
<field name="categ_id" invisible="1"/>
<field name="variants" groups="product.group_product_variant"/>
<field name="uom_id" string="UoM"/>
<field name="uom_id" string="UoM" groups="product.group_uom"/>
<field name="type"/>
<field name="qty_available"/>
<field name="virtual_available"/>
@@ -87,7 +87,7 @@
</group>
<group colspan="1" col="1">
<field name="product_image" widget='image' nolabel="1"/>
</group>
</group>
</group>
<notebook colspan="4">
@@ -125,11 +125,11 @@
<group colspan="2" col="2" name="uom">
<separator string="Unit of Measure" colspan="2"/>
<field name="uom_id" on_change="onchange_uom(uom_id,uom_po_id)"/>
<field name="uom_id" on_change="onchange_uom(uom_id,uom_po_id)" groups="product.group_uom"/>
<field name="uom_po_id" groups="base.group_extended"/>
</group>
<group colspan="2" col="2" name="uos" groups="product.group_uos">
<group colspan="2" col="2" name="uos" groups="product.group_uom">
<separator string="Second UoM" colspan="2"/>
<field name="uos_id"/>
<field name="uos_coeff"/>
@@ -440,7 +440,7 @@
<field name="view_id" ref="product_uom_tree_view"/>
<field name="help">Create and manage the units of measure you want to be used in your system. You can define a conversion rate between several Units of Measure within the same category.</field>
</record>
<menuitem id="next_id_16" name="Units of Measure" parent="prod_config_main" sequence="65"/>
<menuitem id="next_id_16" name="Units of Measure" parent="prod_config_main" sequence="65" groups="product.group_uom"/>
<menuitem action="product_uom_form_action" id="menu_product_uom_form_action" parent="next_id_16"/>
<record id="product_uom_categ_form_view" model="ir.ui.view">
@@ -552,7 +552,7 @@
<field name="product_uom"/>
<field name="delay"/>
<field name="company_id" groups="base.group_multi_company" widget="selection"/>
<field colspan="4" groups="base.group_extended" name="pricelist_ids" nolabel="1" widget="one2many_list">
<field colspan="4" groups="product.group_sale_pricelist" name="pricelist_ids" nolabel="1" widget="one2many_list">
<tree editable="bottom" string="Pricelist">
<field name="min_quantity"/>
<field name="price"/>
@@ -674,11 +674,11 @@
<group colspan="2" col="2" name="uom">
<separator string="UOM" colspan="2"/>
<field name="uom_id" on_change="onchange_uom(uom_id,uom_po_id)"/>
<field name="uom_id" on_change="onchange_uom(uom_id,uom_po_id)" groups="product.group_uom"/>
<field name="uom_po_id" groups="base.group_extended"/>
</group>
<group colspan="2" col="2" name="uos" groups="product.group_uos">
<group colspan="2" col="2" name="uos" groups="product.group_uom">
<separator string="Second UoM" colspan="2"/>
<field name="uos_id"/>
<field name="uos_coeff"/>
+42
View File
@@ -0,0 +1,42 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# OpenERP, Open Source Management Solution
# Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>).
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
from osv import fields, osv
class sale_config_settings(osv.osv_memory):
_inherit = 'sale.config.settings'
_columns = {
'group_sale_pricelist':fields.boolean("Pricelist per Customer",
implied_group='product.group_sale_pricelist',
help="""Allows to manage different prices based on rules per category of customers.
Example: 10% for retailers, promotion of 5 EUR on this product, etc."""),
'group_purchase_pricelist':fields.boolean("Pricelist per Supplier",
implied_group='product.group_purchase_pricelist',
help="""Allows to manage different prices based on rules per category of Supplier.
Example: 10% for retailers, promotion of 5 EUR on this product, etc."""),
'group_sale_uom':fields.boolean("UOM per product",
implied_group='product.group_uom',
help="""Allows you to select and maintain different unit of measures per product."""),
'group_stock_packaging':fields.boolean("Manage packaging by products",
implied_group='product.group_packaging',
help=""" Allows you to create and manage your packaging dimensions and types you want to be maintained in your system."""),
}
@@ -19,6 +19,26 @@
<field name="category_id" ref="base.module_category_usability"/>
</record>
<record id="group_sale_pricelist" model="res.groups">
<field name="name">Sales Pricelists</field>
<field name="category_id" ref="base.module_category_hidden"/>
</record>
<record id="group_purchase_pricelist" model="res.groups">
<field name="name">Purchase Pricelists</field>
<field name="category_id" ref="base.module_category_hidden"/>
</record>
<record id="group_uom" model="res.groups">
<field name="name">Multiple UoM per Product</field>
<field name="category_id" ref="base.module_category_hidden"/>
</record>
<record id="group_packaging" model="res.groups">
<field name="name">Manage Product Packaging</field>
<field name="category_id" ref="base.module_category_hidden"/>
</record>
<record model="ir.rule" id="product_pricelist_comp_rule">
<field name="name">product pricelist company rule</field>
<field name="model_id" ref="model_product_pricelist"/>
@@ -31,6 +31,7 @@
name="Price List"
res_model="product.price_list"
src_model="product.product"
groups="product.group_sale_pricelist"
view_mode="form" target="new" view_type="form" />
</data>
@@ -10,7 +10,7 @@
<field name="warn_customer" position="after">
<group colspan="4" col="4">
<separator colspan="4" string="Invoicing Data"/>
<field name="pricelist_id" domain="[('type','=','sale')]" widget="selection"/>
<field name="pricelist_id" groups="product.group_sale_pricelist" domain="[('type','=','sale')]" widget="selection"/>
<field name="to_invoice" widget="selection" string="Invoice Task Work"/>
<field name="amount_max" groups="base.group_extended"/>
<field name="amount_invoiced" groups="base.group_extended"/>
+1
View File
@@ -29,5 +29,6 @@ import wizard
import report
import company
import edi
import res_config
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
+1
View File
@@ -85,6 +85,7 @@ Dashboard for Sales Manager that includes:
'process/sale_process.xml',
'board_sale_view.xml',
'edi/sale_order_action_data.xml',
'res_config_view.xml',
],
'demo_xml': ['sale_demo.xml'],
'test': [
+156
View File
@@ -0,0 +1,156 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# OpenERP, Open Source Management Solution
# Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>).
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
from osv import fields, osv
import pooler
from tools.translate import _
class sale_configuration(osv.osv_memory):
_inherit = 'sale.config.settings'
_columns = {
'group_invoice_so_lines': fields.boolean('Based on Sales Orders',
implied_group='sale.group_invoice_so_lines',
help="To allow your salesman to make invoices for sale order lines using the menu 'Lines to Invoice'."),
'group_invoice_deli_orders': fields.boolean('Based on Delivery Orders',
implied_group='sale.group_invoice_deli_orders',
help="To allow your salesman to make invoices for Delivery Orders using the menu 'Deliveries to Invoice'."),
'task_work': fields.boolean('Based on Tasks\' Work',
help="""Lets you transfer the entries under tasks defined for Project Management to
the Timesheet line entries for particular date and particular user with the effect of creating, editing and deleting either ways
and to automatically creates project tasks from procurement lines.
This installs the modules project_timesheet and project_mrp."""),
'module_account_analytic_analysis': fields.boolean('Based on Timesheet',
help = """For modifying account analytic view to show important data to project manager of services companies.
You can also view the report of account analytic summary user-wise as well as month wise.
This installs the module account_analytic_analysis."""),
'default_order_policy': fields.selection(
[('manual', 'Invoice Based on Sales Orders'), ('picking', 'Invoice Based on Deliveries')],
'Main Method Based On', required=True, default_model='sale.order',
help="You can generate invoices based on sales orders or based on shippings."),
'module_delivery': fields.boolean('Charge delivery costs',
help ="""Allows you to add delivery methods in sale orders and delivery orders.
You can define your own carrier and delivery grids for prices.
This installs the module delivery."""),
'time_unit': fields.many2one('product.uom', 'Working Time Unit'),
'default_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."),
'group_sale_delivery_address': fields.boolean("Specify delivery and invoice addresses",
implied_group='sale.group_delivery_invoice_address',
help="Allows you to specify different delivery and invoice addresses on a sale order."),
'group_discount_per_so_line': fields.boolean("Discount per sale order line",
implied_group='sale.group_discount_per_so_line',
help="Allows you to apply discount per sale order line."),
'module_sale_layout': fields.boolean("Notes & subtotals per line",
help="""Allows to format sale order lines using notes, separators, titles and subtotals.
This installs the module sale_layout."""),
'module_warning': fields.boolean("Alerts by products or customers",
help="""To raise user specific warning messages on different products used in Sales Orders, Purchase Orders, Invoices and Deliveries.
This installs the module warning."""),
'module_sale_margin': fields.boolean("Display Margins For Users",
help="""This adds the 'Margin' on sales order.
This gives the profitability by calculating the difference between the Unit Price and Cost Price.
This installs the module sale_margin."""),
'module_sale_journal': fields.boolean("Invoice Journal",
help="""Allows you to categorize your sales and deliveries (picking lists) between different journals.
This installs the module sale_journal."""),
'module_analytic_user_function': fields.boolean("User function by contracts",
help="""Allows you to define what is the default function of a specific user on a given account.
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.
This installs the module analytic_user_function."""),
'module_analytic_journal_billing_rate': fields.boolean("Billing rates by contracts",
help="""Allows you to define the default invoicing rate for a specific journal on a given account.
This installs the module analytic_journal_billing_rate."""),
'tax_policy': fields.selection(
[('no_tax', 'No Tax'), ('global_on_order', 'Global On Order'), ('on_order_line', 'On Order Lines')],
'Taxes', required=True,
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.""")
'group_sale_taxes_global_on_order': fields.boolean("Global on order",
implied_group='sale.group_taxes_global_on_order'),
'group_sale_taxes_on_order_line': fields.boolean("On order line",
implied_group='sale.group_taxes_on_order_line'),
'module_project_timesheet': fields.boolean("Project Timesheet"),
'module_project_mrp': fields.boolean("Project MRP"),
}
def default_get(self, cr, uid, fields, context=None):
ir_model_data = self.pool.get('ir.model.data')
res = super(sale_configuration, self).default_get(cr, uid, fields, context)
# task_work, time_unit and tax_policy depend on other fields
res['task_work'] = res.get('module_project_mrp') and res.get('module_project_timesheet')
if res.get('module_account_analytic_analysis'):
product = ir_model_data.get_object(cr, uid, 'product', 'product_consultant')
res['time_unit'] = product.uom_id.id
res['tax_policy'] = \
(res.get('group_sale_taxes_global_on_order') and 'global_on_order') or \
(res.get('group_sale_taxes_on_order_line') and 'on_order_line') or \
'no_tax'
return res
def get_default_sale_config(self, cr, uid, ids, context=None):
ir_values = self.pool.get('ir.values')
default_picking_policy = ir_values.get_default(cr, uid, 'sale.order', 'picking_policy')
return {
'default_picking_policy': default_picking_policy == 'one',
}
def _get_default_time_unit(self, cr, uid, context=None):
ids = self.pool.get('product.uom').search(cr, uid, [('name', '=', _('Hour'))], context=context)
return ids and ids[0] or False
_defaults = {
'default_order_policy': 'manual',
'time_unit': _get_default_time_unit,
'tax_policy': 'global_on_order',
}
def set_sale_defaults(self, cr, uid, ids, context=None):
ir_values = self.pool.get('ir.values')
ir_model_data = self.pool.get('ir.model.data')
wizard = self.browse(cr, uid, ids)[0]
default_picking_policy = 'one' if wizard.default_picking_policy else 'direct'
ir_values.set_default(cr, uid, 'sale.order', 'picking_policy', default_picking_policy)
if wizard.time_unit:
product = ir_model_data.get_object(cr, uid, 'product', 'product_consultant')
product.write({'uom_id': wizard.time_unit.id, 'uom_po_id': wizard.time_unit.id})
if wizard.task_work and wizard.time_unit:
user = self.pool.get('res.users').browse(cr, uid, uid, context)
user.company_id.write({'project_time_mode_id': wizard.time_unit.id})
return {}
def onchange_task_work(self, cr, uid, ids, task_work, context=None):
return {'value': {
'module_project_timesheet': task_work,
'module_project_mrp': task_work,
}}
def onchange_tax_policy(self, cr, uid, ids, tax_policy, context=None):
return {'value': {
'group_sale_taxes_global_on_order': tax_policy == 'global_on_order',
'group_sale_taxes_on_order_line': tax_policy == 'on_order_line',
}}
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
+52
View File
@@ -0,0 +1,52 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
<record id="view_sales_config" model="ir.ui.view">
<field name="name">Sales Application</field>
<field name="model">sale.config.settings</field>
<field name="type">form</field>
<field name="inherit_id" ref="base.view_sale_config_settings"/>
<field name="arch" type="xml">
<group name="config_sale" position="inside">
<separator string="Picking and Invoice Policy" colspan="4"/>
<group colspan="4">
<group colspan="2" col="2">
<field name="group_invoice_so_lines"/>
<field name="group_invoice_deli_orders"/>
<field name="task_work" on_change="onchange_task_work(task_work)"/>
<field name="module_project_timesheet" invisible="1"/>
<field name="module_project_mrp" invisible="1"/>
<field name="module_account_analytic_analysis"/>
</group>
<group colspan="2" col="2">
<field name="default_order_policy" attrs="{'invisible':['|',('group_invoice_so_lines','=',False),('group_invoice_deli_orders','=',False)]}"/>
<field name="module_delivery" attrs="{'invisible':[('group_invoice_so_lines','=',False), ('group_invoice_deli_orders','=',False)]}"/>
<field name="default_picking_policy" attrs="{'invisible':[('group_invoice_deli_orders','=',False)]}"/>
<field name="time_unit" domain="[('category_id.name','=','Working Time')]" attrs="{'invisible':[('task_work','=',False),('module_account_analytic_analysis','=',False)],'required': [('module_account_analytic_analysis','=',True)]}"/>
</group>
</group>
<separator string="Sale Order" colspan="4"/>
<group colspan="2" col="2">
<field name="group_sale_pricelist"/>
<field name="tax_policy" on_change="onchange_tax_policy(tax_policy)"/>
<field name="group_sale_taxes_global_on_order" invisible="1"/>
<field name="group_sale_taxes_on_order_line" invisible="1"/>
<field name="module_sale_margin"/>
<field name="module_warning"/>
</group>
<group colspan="2" col="2">
<field name="group_sale_uom"/>
<field name="group_sale_delivery_address"/>
<field name="group_discount_per_so_line"/>
<field name="module_sale_layout"/>
<field name="module_sale_journal"/>
</group>
</group>
</field>
</record>
<menuitem id="base.menu_sale_config" name="Sales &amp; CRM" parent="base.menu_config" sequence="1" action="base.action_sale_config"/>
</data>
</openerp>
-91
View File
@@ -1330,95 +1330,4 @@ class sale_order_line(osv.osv):
sale_order_line()
class sale_config_picking_policy(osv.osv_memory):
_name = 'sale.config.picking_policy'
_inherit = 'res.config'
_columns = {
'name': fields.char('Name', size=64),
'sale_orders': fields.boolean('Based on Sales Orders',),
'deli_orders': fields.boolean('Based on Delivery Orders'),
'task_work': fields.boolean('Based on Tasks\' Work'),
'timesheet': fields.boolean('Based on Timesheet'),
'order_policy': fields.selection([
('manual', 'Invoice Based on Sales Orders'),
('picking', 'Invoice Based on Deliveries'),
], 'Main Method Based On', required=True, help="You can generate invoices based on sales orders or based on shippings."),
'charge_delivery': fields.boolean('Do you charge the delivery?'),
'time_unit': fields.many2one('product.uom','Main Working Time Unit')
}
_defaults = {
'order_policy': 'manual',
'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,
}
def onchange_order(self, cr, uid, ids, sale, deli, context=None):
res = {}
if sale:
res.update({'order_policy': 'manual'})
elif deli:
res.update({'order_policy': 'picking'})
return {'value':res}
def execute(self, cr, uid, ids, context=None):
ir_values_obj = self.pool.get('ir.values')
data_obj = self.pool.get('ir.model.data')
menu_obj = self.pool.get('ir.ui.menu')
module_obj = self.pool.get('ir.module.module')
module_upgrade_obj = self.pool.get('base.module.upgrade')
module_name = []
group_id = data_obj.get_object(cr, uid, 'base', 'group_sale_salesman').id
wizard = self.browse(cr, uid, ids)[0]
if wizard.sale_orders:
menu_id = data_obj.get_object(cr, uid, 'sale', 'menu_invoicing_sales_order_lines').id
menu_obj.write(cr, uid, menu_id, {'groups_id':[(4,group_id)]})
if wizard.deli_orders:
menu_id = data_obj.get_object(cr, uid, 'sale', 'menu_action_picking_list_to_invoice').id
menu_obj.write(cr, uid, menu_id, {'groups_id':[(4,group_id)]})
if wizard.task_work:
module_name.append('project_timesheet')
module_name.append('project_mrp')
module_name.append('account_analytic_analysis')
if wizard.timesheet:
module_name.append('account_analytic_analysis')
if wizard.charge_delivery:
module_name.append('delivery')
if len(module_name):
module_ids = []
need_install = False
module_ids = []
for module in module_name:
data_id = module_obj.name_search(cr, uid , module, [], '=')
module_ids.append(data_id[0][0])
for module in module_obj.browse(cr, uid, module_ids):
if module.state == 'uninstalled':
module_obj.state_update(cr, uid, [module.id], 'to install', ['uninstalled'], context)
need_install = True
cr.commit()
if need_install:
pooler.restart_pool(cr.dbname, update_module=True)[1]
if wizard.time_unit:
prod_id = data_obj.get_object(cr, uid, 'product', 'product_consultant').id
product_obj = self.pool.get('product.product')
product_obj.write(cr, uid, prod_id, {'uom_id':wizard.time_unit.id, 'uom_po_id': wizard.time_unit.id})
ir_values_obj.set(cr, uid, 'default', False, 'order_policy', ['sale.order'], wizard.order_policy)
if wizard.task_work and wizard.time_unit:
company_id = self.pool.get('res.users').browse(cr, uid, uid).company_id.id
self.pool.get('res.company').write(cr, uid, [company_id], {
'project_time_mode_id': wizard.time_unit.id
}, context=context)
sale_config_picking_policy()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
+28 -88
View File
@@ -21,7 +21,7 @@
<field name="company_id" widget="selection" groups="base.group_multi_company"/>
<separator colspan="4" string="Accounting"/>
<field name="payment_default_id"/>
<field domain="[('type','=','sale')]" name="pricelist_id" select="1"/>
<field domain="[('type','=','sale')]" name="pricelist_id" groups="product.group_sale_pricelist" select="1"/>
<field name="project_id" select="1" groups="analytic.group_analytic_accounting"/>
</form>
</field>
@@ -34,7 +34,7 @@
<tree string="Sales Shop">
<field name="name"/>
<field name="warehouse_id"/>
<field name="pricelist_id"/>
<field name="pricelist_id" groups="product.group_sale_pricelist"/>
<field name="project_id" groups="analytic.group_analytic_accounting"/>
</tree>
</field>
@@ -117,9 +117,9 @@
<page string="Sales Order">
<field name="partner_id" options='{"quick_create": false}' on_change="onchange_partner_id(partner_id)" domain="[('customer','=',True)]" context="{'search_default_customer':1}" required="1"/>
<field domain="[('partner_id','=',partner_id)]" name="partner_order_id" on_change="onchange_partner_order_id(partner_order_id, partner_invoice_id, partner_shipping_id)" options='{"quick_create": false}'/>
<field domain="[('partner_id','=',partner_id)]" name="partner_invoice_id" groups="base.group_extended" options='{"quick_create": false}'/>
<field domain="[('partner_id','=',partner_id)]" name="partner_shipping_id" groups="base.group_extended" options='{"quick_create": false}'/>
<field domain="[('type','=','sale')]" name="pricelist_id" groups="base.group_extended" on_change="onchange_pricelist_id(pricelist_id,order_line)"/>
<field domain="[('partner_id','=',partner_id)]" name="partner_invoice_id" groups="group_delivery_invoice_address" options='{"quick_create": false}'/>
<field domain="[('partner_id','=',partner_id)]" name="partner_shipping_id" groups="group_delivery_invoice_address" options='{"quick_create": false}'/>
<field domain="[('type','=','sale')]" name="pricelist_id" groups="product.group_sale_pricelist" on_change="onchange_pricelist_id(pricelist_id,order_line)"/>
<field name="project_id" context="{'partner_id':partner_id, 'contact_id':partner_order_id, 'pricelist_id':pricelist_id, 'default_name':name}" groups="analytic.group_analytic_accounting" domain="[('parent_id','!=',False)]"/>
<newline/>
<field colspan="4" name="order_line" nolabel="1" widget="one2many_list">
@@ -139,7 +139,7 @@
on_change="product_id_change(parent.pricelist_id,product_id,product_uom_qty,product_uom,product_uos_qty,product_uos,name,parent.partner_id, False, False, parent.date_order, product_packaging, parent.fiscal_position, True, context)"/>
<field name="product_uom"
on_change="product_uom_change(parent.pricelist_id,product_id,product_uom_qty,product_uom,product_uos_qty,product_uos,name,parent.partner_id, False, False, parent.date_order, context)"
nolabel="1"/>
nolabel="1" groups="product.group_uom"/>
<field name="price_unit"/>
<field groups="product.group_uos" name="product_uos_qty"/>
@@ -149,11 +149,12 @@
context="{'partner_id':parent.partner_id, 'quantity':product_uom_qty, 'pricelist':parent.pricelist_id, 'shop':parent.shop_id, 'uom':product_uom}" on_change="product_packaging_change(parent.pricelist_id, product_id, product_uom_qty, product_uom, parent.partner_id, product_packaging, True, context)"
domain="[('product_id','=',product_id)]" groups="base.group_extended"
colspan="3"/>
<field name="discount"/>
<separator colspan="5" string="Notes"/>
<field colspan="5" name="notes" nolabel="1"/>
<separator colspan="5" string="Taxes"/>
<field colspan="5" name="tax_id" nolabel="1" domain="[('parent_id','=',False),('type_tax_use','&lt;&gt;','purchase')]"/>
<field name="discount" groups="group_discount_per_so_line"/>
<separator colspan="5" string="Notes" groups="base.group_sale_notes_subtotal"/>
<field colspan="5" name="notes" nolabel="1" groups="base.group_sale_notes_subtotal"/>
<separator colspan="5" string="Taxes" groups="group_taxes_on_order_line"/>
<field colspan="5" name="tax_id" nolabel="1" domain="[('parent_id','=',False),('type_tax_use','&lt;&gt;','purchase')]"
groups="group_taxes_on_order_line" />
<group colspan="5" col="5" groups="base.group_extended">
<separator colspan="5" string="States"/>
<field name="state" widget="statusbar" statusbar_visible="draft,confirmed,done" statusbar_colors='{"exception":"red","cancel":"red"}'/>
@@ -183,18 +184,19 @@
<tree string="Sales Order Lines">
<field colspan="4" name="name"/>
<field name="product_uom_qty" string="Qty(UoM)"/>
<field name="product_uom" string="UoM"/>
<field name="product_uom" string="UoM" groups="product.group_uom"/>
<field groups="product.group_uos" name="product_uos_qty" string="Qty(UoS)"/>
<field groups="product.group_uos" name="product_uos" string="UoS"/>
<field name="discount"/>
<field name="discount" groups="group_discount_per_so_line"/>
<field name="price_unit"/>
<field name="price_subtotal"/>
<field name="price_subtotal" groups="base.group_sale_notes_subtotal"/>
</tree>
</field>
<newline/>
<group col="13" colspan="10">
<field name="amount_untaxed" sum="Untaxed amount"/>
<field name="amount_tax"/>
<field name="tax_id" groups="group_taxes_global_on_order" on_change="onchange_taxes(tax_id)"/>
<field name="amount_untaxed" sum="Untaxed amount" groups="group_taxes_on_order_line,group_taxes_global_on_order"/>
<field name="amount_tax" groups="group_taxes_on_order_line,group_taxes_global_on_order"/>
<field name="amount_total"/>
<button name="button_dummy" states="draft" string="Compute" type="object" icon="gtk-execute"/>
<button name="%(action_view_sale_advance_payment_inv)d" string="Advance Invoice" type="action" icon="gtk-execute" states="draft,manual" groups="base.group_extended"/>
@@ -240,8 +242,8 @@
<field name="create_date"/>
<field name="date_confirm"/>
</group>
<separator colspan="4" string="Notes"/>
<field colspan="4" name="note" nolabel="1"/>
<separator colspan="4" string="Notes" groups="base.group_sale_notes_subtotal"/>
<field colspan="4" name="note" nolabel="1" groups="base.group_sale_notes_subtotal"/>
</page>
<page string="History" groups="base.group_extended">
<separator colspan="4" string="Invoices"/>
@@ -361,9 +363,9 @@
<field name="order_partner_id"/>
<field name="product_id"/>
<field name="product_uom_qty" string="Qty"/>
<field name="product_uom" string="UoM"/>
<field name="product_uom" string="UoM" groups="product.group_uom"/>
<field name="salesman_id"/>
<field name="price_subtotal" sum="Total"/>
<field name="price_subtotal" sum="Total" groups="base.group_sale_notes_subtotal"/>
<field name="state"/>
<field name="invoiced"/>
</tree>
@@ -382,7 +384,7 @@
<field name="product_id" readonly="1"/>
<field name="product_uom_qty" readonly="1"/>
<field name="product_uom"/>
<field name="product_uom" groups="product.group_uom"/>
<field colspan="4" name="name" groups="base.group_extended"/>
<field name="company_id" groups="base.group_multi_company" readonly="1"/>
@@ -390,11 +392,11 @@
<separator colspan="4" string="Price"/>
<group colspan="4" col="6">
<field name="price_unit"/>
<field name="discount"/>
<field name="price_subtotal"/>
<field name="discount" groups="group_discount_per_so_line"/>
<field name="price_subtotal" groups="base.group_sale_notes_subtotal"/>
</group>
<separator colspan="4" string="Notes"/>
<field colspan="4" name="notes" nolabel="1"/>
<separator colspan="4" string="Notes" groups="base.group_sale_notes_subtotal"/>
<field colspan="4" name="notes" nolabel="1" groups="base.group_sale_notes_subtotal"/>
<separator colspan="4"/>
<field name="state" widget="statusbar" statusbar_visible="draft,confirmed,done" statusbar_colors='{"exception":"red","cancel":"red"}'/>
<group col="3" colspan="2">
@@ -499,69 +501,7 @@
groups="base.group_sale_salesman"/>
<menuitem id="base.menu_invoiced" name="Invoicing" parent="base.menu_base_partner" sequence="5" groups="base.group_extended"/>
<menuitem id="menu_invoicing_sales_order_lines" parent="base.menu_invoiced" action="action_order_line_tree2" sequence="2" groups="base.group_no_one"/>
<!-- configartion view -->
<record id="view_config_picking_policy" model="ir.ui.view">
<field name="name">Setup Your Invoicing Method</field>
<field name="model">sale.config.picking_policy</field>
<field name="type">form</field>
<field name="inherit_id" ref="base.res_config_view_base"/>
<field name="arch" type="xml">
<data>
<form position="attributes">
<attribute name="string">Setup your Invoicing Method</attribute>
</form>
<xpath expr="//separator[@string=&quot;title&quot;]" position="attributes">
<attribute name="string">Setup your Invoicing Method</attribute>
</xpath>
<xpath expr="//label[@string='description']" position="attributes">
<attribute name="string">This tool will help you to install the right module and configure the system according to the method you use to invoice your customers.</attribute>
</xpath>
<xpath expr="//separator[@string=&quot;vsep&quot;]" position="attributes">
<attribute name="string"/>
<attribute name="rowspan">12</attribute>
</xpath>
<group string="res_config_contents" position="replace">
<group colspan="4" col="4">
<field name="sale_orders" on_change="onchange_order(sale_orders,deli_orders)"/>
<newline/>
<field name="deli_orders" on_change="onchange_order(sale_orders,deli_orders)"/>
<newline/>
<field name="task_work"/>
<newline/>
<field name="timesheet"/>
<newline/>
<separator string="Options" colspan="4"/>
<field name="order_policy" attrs="{'invisible':['|',('sale_orders','!=',True),('deli_orders','!=',True)]}"/>
<newline/>
<field name="charge_delivery" attrs="{'invisible':[('sale_orders','!=',True), ('deli_orders','!=',True)]}"/>
<newline/>
<field name="time_unit" widget="selection" domain="[('category_id','=',%(product.uom_categ_wtime)s)]" attrs="{'invisible':[('task_work','=',False),('timesheet','=',False)]}"/>
</group>
</group>
</data>
</field>
</record>
<record id="action_config_picking_policy" model="ir.actions.act_window">
<field name="name">Setup your Invoicing Method</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">sale.config.picking_policy</field>
<field name="view_id" ref="view_config_picking_policy"/>
<field name="view_type">form</field>
<field name="view_mode">form</field>
<field name="target">new</field>
</record>
<!-- register configuration wizard -->
<record id="config_wizard_step_sale_picking_policy" model="ir.actions.todo">
<field name="action_id" ref="action_config_picking_policy"/>
<field name="category_id" ref="base.category_sales_management_config"/>
<field name="type">once</field>
</record>
<menuitem id="menu_invoicing_sales_order_lines" parent="base.menu_invoiced" action="action_order_line_tree2" sequence="2" groups="group_invoice_so_lines"/>
</data>
</openerp>
+30
View File
@@ -20,6 +20,36 @@
<field name="users" eval="[(4, ref('base.user_root'))]"/>
</record>
<record id="group_invoice_so_lines" model="res.groups">
<field name="name">Enable Invoicing Sale order lines</field>
<field name="category_id" ref="base.module_category_hidden"/>
</record>
<record id="group_invoice_deli_orders" model="res.groups">
<field name="name">Enable Invoicing Delivery orders</field>
<field name="category_id" ref="base.module_category_hidden"/>
</record>
<record id="group_delivery_invoice_address" model="res.groups">
<field name="name">Addresses in Sale Orders</field>
<field name="category_id" ref="base.module_category_hidden"/>
</record>
<record id="group_discount_per_so_line" model="res.groups">
<field name="name">Discount on lines</field>
<field name="category_id" ref="base.module_category_hidden"/>
</record>
<record id="group_taxes_global_on_order" model="res.groups">
<field name="name">Sales Taxes Global on Order</field>
<field name="category_id" ref="base.module_category_hidden"/>
</record>
<record id="group_taxes_on_order_line" model="res.groups">
<field name="name">Sales Taxes on Order Lines</field>
<field name="category_id" ref="base.module_category_hidden"/>
</record>
<record model="res.users" id="base.user_admin">
<field eval="[(4,ref('base.group_partner_manager'))]" name="groups_id"/>
</record>
+1 -1
View File
@@ -74,7 +74,7 @@
<field name="context">{'default_type': 'out', 'contact_display': 'partner_address', 'search_default_to_invoice': 1, 'search_default_done': 1}</field>
<field name="search_view_id" ref="stock.view_picking_out_search"/>
</record>
<menuitem action="outgoing_picking_list_to_invoice" id="menu_action_picking_list_to_invoice" parent="base.menu_invoiced" groups="base.group_no_one" sequence="20"/>
<menuitem action="outgoing_picking_list_to_invoice" id="menu_action_picking_list_to_invoice" parent="base.menu_invoiced" groups="group_invoice_deli_orders" sequence="20"/>
</data>
</openerp>
+4 -4
View File
@@ -82,8 +82,8 @@
-
I set order policy "Deliver & invoice on demand" as default policy.
-
!record {model: sale.config.picking_policy, id: sale.config.picking_policy_0}:
order_policy: 'manual'
!record {model: sale.config.settings, id: sale_configuration_0}:
default_order_policy: 'manual'
-
!python {model: sale.config.picking_policy}: |
self.execute(cr, uid, [ref("sale.config.picking_policy_0")])
!python {model: sale.config.settings}: |
self.execute(cr, uid, [ref("sale_configuration_0")], context=context)
+2 -1
View File
@@ -37,6 +37,7 @@
on_change="product_id_change(parent.pricelist_id,product_id,product_uom_qty,product_uom,product_uos_qty,product_uos,name,parent.partner_id, False, False, parent.date_order, product_packaging, parent.fiscal_position, True, context)"/>
<field name="product_uom"
nolabel="1"
groups="product.group_uom"
required="0"
attrs="{'invisible':[('layout_type','!=','article')], 'required':[('layout_type','not in',['title','text','subtotal','line','break'])]}"
on_change="product_uom_change(parent.pricelist_id,product_id,product_uom_qty,product_uom,product_uos_qty,product_uos,name,parent.partner_id, False, False, parent.date_order, context)"/>
@@ -99,7 +100,7 @@
<tree string="Sales order lines">
<field colspan="4" name="name"/>
<field name="product_uom_qty" string="Qty"/>
<field name="product_uom" string="UoM"/>
<field name="product_uom" string="UoM" groups="product.group_uom"/>
<field name="discount"/>
<field name="price_unit"/>
<!-- field name="price_net"/-->