[MRG] merge with lp:openobject-addons
bzr revid: tpa@tinyerp.com-20121012055152-qyi3ev9bt0qwua44
This commit is contained in:
commit
96c8ffb701
|
@ -300,7 +300,6 @@ class account_account(osv.osv):
|
||||||
if aml_query.strip():
|
if aml_query.strip():
|
||||||
wheres.append(aml_query.strip())
|
wheres.append(aml_query.strip())
|
||||||
filters = " AND ".join(wheres)
|
filters = " AND ".join(wheres)
|
||||||
_logger.debug('Filters: %s',(filters))
|
|
||||||
# IN might not work ideally in case there are too many
|
# IN might not work ideally in case there are too many
|
||||||
# children_and_consolidated, in that case join on a
|
# children_and_consolidated, in that case join on a
|
||||||
# values() e.g.:
|
# values() e.g.:
|
||||||
|
@ -316,7 +315,6 @@ class account_account(osv.osv):
|
||||||
" GROUP BY l.account_id")
|
" GROUP BY l.account_id")
|
||||||
params = (tuple(children_and_consolidated),) + query_params
|
params = (tuple(children_and_consolidated),) + query_params
|
||||||
cr.execute(request, params)
|
cr.execute(request, params)
|
||||||
_logger.debug('Status: %s',(cr.statusmessage))
|
|
||||||
|
|
||||||
for row in cr.dictfetchall():
|
for row in cr.dictfetchall():
|
||||||
accounts[row['id']] = row
|
accounts[row['id']] = row
|
||||||
|
|
|
@ -14,8 +14,8 @@
|
||||||
<field name="taxes_id" colspan="2" attrs="{'readonly':[('sale_ok','=',0)]}" widget="many2many_tags"/>
|
<field name="taxes_id" colspan="2" attrs="{'readonly':[('sale_ok','=',0)]}" widget="many2many_tags"/>
|
||||||
</group>
|
</group>
|
||||||
<group>
|
<group>
|
||||||
<field name="property_account_expense" domain="[('type','<>','view'),('type','<>','consolidation')]" attrs="{'readonly':[('purchase_ok','=',0)]}"/>
|
<field name="property_account_expense" domain="[('type','<>','view'),('type','<>','consolidation')]" />
|
||||||
<field name="supplier_taxes_id" colspan="2" attrs="{'readonly':[('purchase_ok','=',0)]}" widget="many2many_tags"/>
|
<field name="supplier_taxes_id" colspan="2" widget="many2many_tags"/>
|
||||||
</group>
|
</group>
|
||||||
</group>
|
</group>
|
||||||
</page>
|
</page>
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
<field name="name">analytic.entries.report.tree</field>
|
<field name="name">analytic.entries.report.tree</field>
|
||||||
<field name="model">analytic.entries.report</field>
|
<field name="model">analytic.entries.report</field>
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<tree string="Analytic Entries Analysis">
|
<tree string="Analytic Entries Analysis" create="false">
|
||||||
<field name="date" invisible="1"/>
|
<field name="date" invisible="1"/>
|
||||||
<field name="year" invisible="1"/>
|
<field name="year" invisible="1"/>
|
||||||
<field name="day" invisible="1"/>
|
<field name="day" invisible="1"/>
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
<field name="name">account.entries.report.tree</field>
|
<field name="name">account.entries.report.tree</field>
|
||||||
<field name="model">account.entries.report</field>
|
<field name="model">account.entries.report</field>
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<tree colors="blue:move_state == 'draft';black:move_state == 'posted'" string="Entries Analysis">
|
<tree colors="blue:move_state == 'draft';black:move_state == 'posted'" create="false" string="Entries Analysis">
|
||||||
<field name="date" invisible="1"/>
|
<field name="date" invisible="1"/>
|
||||||
<field name="date_created" invisible="1"/>
|
<field name="date_created" invisible="1"/>
|
||||||
<field name="date_maturity" invisible="1"/>
|
<field name="date_maturity" invisible="1"/>
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
<field name="name">account.invoice.report.tree</field>
|
<field name="name">account.invoice.report.tree</field>
|
||||||
<field name="model">account.invoice.report</field>
|
<field name="model">account.invoice.report</field>
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<tree colors="blue:state == 'draft';gray:state in ('cancel','paid');black:state in ('proforma','proforma2')" string="Invoices Analysis">
|
<tree colors="blue:state == 'draft';gray:state in ('cancel','paid');black:state in ('proforma','proforma2')" create="false" string="Invoices Analysis">
|
||||||
<field name="date" invisible="1"/>
|
<field name="date" invisible="1"/>
|
||||||
<field name="user_id" invisible="1"/>
|
<field name="user_id" invisible="1"/>
|
||||||
<field name="year" invisible="1"/>
|
<field name="year" invisible="1"/>
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
<field name="name">account.treasury.report.tree</field>
|
<field name="name">account.treasury.report.tree</field>
|
||||||
<field name="model">account.treasury.report</field>
|
<field name="model">account.treasury.report</field>
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<tree string="Treasury Analysis">
|
<tree string="Treasury Analysis" create="false">
|
||||||
<field name="date" invisible="1"/>
|
<field name="date" invisible="1"/>
|
||||||
<field name="fiscalyear_id"/>
|
<field name="fiscalyear_id"/>
|
||||||
<field name="period_id"/>
|
<field name="period_id"/>
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
<field name="name">asset.asset.report.tree</field>
|
<field name="name">asset.asset.report.tree</field>
|
||||||
<field name="model">asset.asset.report</field>
|
<field name="model">asset.asset.report</field>
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<tree string="Assets">
|
<tree string="Assets" create="false">
|
||||||
<field name="name" invisible="1"/>
|
<field name="name" invisible="1"/>
|
||||||
<field name="asset_id" invisible="1"/>
|
<field name="asset_id" invisible="1"/>
|
||||||
<field name="asset_category_id" invisible="1"/>
|
<field name="asset_category_id" invisible="1"/>
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
<field name="name">sale.receipt.report.tree</field>
|
<field name="name">sale.receipt.report.tree</field>
|
||||||
<field name="model">sale.receipt.report</field>
|
<field name="model">sale.receipt.report</field>
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<tree colors="blue:state == 'draft';gray:state in ('cancel','paid');black:state in ('proforma','proforma2')" string="Sales Receipt Analysis">
|
<tree colors="blue:state == 'draft';gray:state in ('cancel','paid');black:state in ('proforma','proforma2')" create="false" string="Sales Receipt Analysis">
|
||||||
<field name="date" invisible="1"/>
|
<field name="date" invisible="1"/>
|
||||||
<field name="user_id" invisible="1"/>
|
<field name="user_id" invisible="1"/>
|
||||||
<field name="year" invisible="1"/>
|
<field name="year" invisible="1"/>
|
||||||
|
|
|
@ -145,7 +145,7 @@
|
||||||
<field name="name">audittrail.log.tree</field>
|
<field name="name">audittrail.log.tree</field>
|
||||||
<field name="model">audittrail.log</field>
|
<field name="model">audittrail.log</field>
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<tree string="AuditTrail Logs">
|
<tree string="AuditTrail Logs" create="false">
|
||||||
<field name="timestamp"/>
|
<field name="timestamp"/>
|
||||||
<field name="name"/>
|
<field name="name"/>
|
||||||
<field name="object_id"/>
|
<field name="object_id"/>
|
||||||
|
|
|
@ -21,7 +21,7 @@ class res_users(osv.Model):
|
||||||
}
|
}
|
||||||
|
|
||||||
_sql_constraints = [
|
_sql_constraints = [
|
||||||
('uniq_users_oauth_provider_oauht_uid', 'unique(oauth_provider_id, oauth_uid)', 'OAuth UID must be unique per provider'),
|
('uniq_users_oauth_provider_oauth_uid', 'unique(oauth_provider_id, oauth_uid)', 'OAuth UID must be unique per provider'),
|
||||||
]
|
]
|
||||||
|
|
||||||
def auth_oauth_rpc(self, cr, uid, endpoint, access_token, context=None):
|
def auth_oauth_rpc(self, cr, uid, endpoint, access_token, context=None):
|
||||||
|
|
|
@ -8,7 +8,7 @@
|
||||||
<field name="name">crm.lead.report.tree</field>
|
<field name="name">crm.lead.report.tree</field>
|
||||||
<field name="model">crm.lead.report</field>
|
<field name="model">crm.lead.report</field>
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<tree string="Leads Analysis">
|
<tree string="Leads Analysis" create="false">
|
||||||
<field name="creation_year" invisible="1"/>
|
<field name="creation_year" invisible="1"/>
|
||||||
<field name="creation_month" invisible="1"/>
|
<field name="creation_month" invisible="1"/>
|
||||||
<field name="creation_day" invisible="1"/>
|
<field name="creation_day" invisible="1"/>
|
||||||
|
@ -130,7 +130,7 @@
|
||||||
<field name="name">crm.lead.report.tree</field>
|
<field name="name">crm.lead.report.tree</field>
|
||||||
<field name="model">crm.lead.report</field>
|
<field name="model">crm.lead.report</field>
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<tree colors="blue:state == 'draft';black:state in ('open','pending','done');gray:state == 'cancel' " string="Opportunities Analysis">
|
<tree colors="blue:state == 'draft';black:state in ('open','pending','done');gray:state == 'cancel' " create="false" string="Opportunities Analysis">
|
||||||
<field name="creation_year" invisible="1"/>
|
<field name="creation_year" invisible="1"/>
|
||||||
<field name="creation_month" invisible="1"/>
|
<field name="creation_month" invisible="1"/>
|
||||||
<field name="creation_day" invisible="1"/>
|
<field name="creation_day" invisible="1"/>
|
||||||
|
|
|
@ -8,7 +8,7 @@
|
||||||
<field name="name">crm.phonecall.report.tree</field>
|
<field name="name">crm.phonecall.report.tree</field>
|
||||||
<field name="model">crm.phonecall.report</field>
|
<field name="model">crm.phonecall.report</field>
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<tree string="Phone calls">
|
<tree string="Phone calls" create="false">
|
||||||
<field name="name" invisible="1"/>
|
<field name="name" invisible="1"/>
|
||||||
<field name="month" invisible="1"/>
|
<field name="month" invisible="1"/>
|
||||||
<field name="section_id" invisible="1"/>
|
<field name="section_id" invisible="1"/>
|
||||||
|
|
|
@ -32,6 +32,13 @@ class crm_configuration(osv.osv_memory):
|
||||||
'group_fund_raising': fields.boolean("Manage Fund Raising",
|
'group_fund_raising': fields.boolean("Manage Fund Raising",
|
||||||
implied_group='crm.group_fund_raising',
|
implied_group='crm.group_fund_raising',
|
||||||
help="""Allows you to trace and manage your activities for fund raising."""),
|
help="""Allows you to trace and manage your activities for fund raising."""),
|
||||||
|
'module_crm_claim':fields.boolean("Manage Customer Claims",
|
||||||
|
help="""Allows you to track your customers/suppliers claims and grievances.
|
||||||
|
This installs the module crm_claim."""),
|
||||||
|
'module_crm_helpdesk':fields.boolean("Manage Helpdesk and Support",
|
||||||
|
help="""Allows you to communicate with Customer, process Customer query, and provide better help and support. This installs the module crm_helpdesk."""),
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
||||||
|
|
|
@ -7,6 +7,22 @@
|
||||||
<field name="model">sale.config.settings</field>
|
<field name="model">sale.config.settings</field>
|
||||||
<field name="inherit_id" ref="base_setup.view_sale_config_settings"/>
|
<field name="inherit_id" ref="base_setup.view_sale_config_settings"/>
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
|
<div name="config_sale" position="before">
|
||||||
|
<separator string="After-Sale Services"/>
|
||||||
|
<group>
|
||||||
|
<label for="id" string="Features"/>
|
||||||
|
<div>
|
||||||
|
<div>
|
||||||
|
<field name="module_crm_claim" class="oe_inline"/>
|
||||||
|
<label for="module_crm_claim"/>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<field name="module_crm_helpdesk" class="oe_inline"/>
|
||||||
|
<label for="module_crm_helpdesk"/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</group>
|
||||||
|
</div>
|
||||||
<group name="On Mail Client" version="7.0" position="after">
|
<group name="On Mail Client" version="7.0" position="after">
|
||||||
<group>
|
<group>
|
||||||
<label for="id" string="On Mail Server"/>
|
<label for="id" string="On Mail Server"/>
|
||||||
|
|
|
@ -25,8 +25,10 @@
|
||||||
'version': '1.0',
|
'version': '1.0',
|
||||||
'category': 'Customer Relationship Management',
|
'category': 'Customer Relationship Management',
|
||||||
'description': """
|
'description': """
|
||||||
This modules allows you to track your customers/suppliers claims and grievances.
|
|
||||||
|
Manage Customer Claims.
|
||||||
================================================================================
|
================================================================================
|
||||||
|
This application allows you to track your customers/suppliers claims and grievances.
|
||||||
|
|
||||||
It is fully integrated with the email gateway so that you can create
|
It is fully integrated with the email gateway so that you can create
|
||||||
automatically new claims based on incoming emails.
|
automatically new claims based on incoming emails.
|
||||||
|
|
|
@ -8,7 +8,7 @@
|
||||||
<field name="name">crm.claim.report.tree</field>
|
<field name="name">crm.claim.report.tree</field>
|
||||||
<field name="model">crm.claim.report</field>
|
<field name="model">crm.claim.report</field>
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<tree string="Claims">
|
<tree string="Claims" create="false">
|
||||||
<field name="name" invisible="1"/>
|
<field name="name" invisible="1"/>
|
||||||
<field name="month" invisible="1"/>
|
<field name="month" invisible="1"/>
|
||||||
<field name="section_id" invisible="1"/>
|
<field name="section_id" invisible="1"/>
|
||||||
|
|
|
@ -8,7 +8,7 @@
|
||||||
<field name="name">crm.helpdesk.report.tree</field>
|
<field name="name">crm.helpdesk.report.tree</field>
|
||||||
<field name="model">crm.helpdesk.report</field>
|
<field name="model">crm.helpdesk.report</field>
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<tree string="Helpdesk">
|
<tree string="Helpdesk" create="false">
|
||||||
<field name="name" invisible="1"/>
|
<field name="name" invisible="1"/>
|
||||||
<field name="month" invisible="1"/>
|
<field name="month" invisible="1"/>
|
||||||
<field name="section_id" invisible="1"/>
|
<field name="section_id" invisible="1"/>
|
||||||
|
|
|
@ -65,7 +65,7 @@
|
||||||
<field name="name">crm.lead.assign.report.tree</field>
|
<field name="name">crm.lead.assign.report.tree</field>
|
||||||
<field name="model">crm.lead.report.assign</field>
|
<field name="model">crm.lead.report.assign</field>
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<tree string="Opportunities Assignment Analysis">
|
<tree string="Opportunities Assignment Analysis" create="false">
|
||||||
<field name="year" invisible="1"/>
|
<field name="year" invisible="1"/>
|
||||||
<field name="month" invisible="1"/>
|
<field name="month" invisible="1"/>
|
||||||
<field name="date_assign" invisible="1"/>
|
<field name="date_assign" invisible="1"/>
|
||||||
|
|
|
@ -41,7 +41,7 @@
|
||||||
<field name="name">crm.partner.assign.report.tree</field>
|
<field name="name">crm.partner.assign.report.tree</field>
|
||||||
<field name="model">crm.partner.report.assign</field>
|
<field name="model">crm.partner.report.assign</field>
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<tree string="Opportunities Assignment Analysis">
|
<tree string="Opportunities Assignment Analysis" create="false">
|
||||||
<field name="partner_id" invisible="1"/>
|
<field name="partner_id" invisible="1"/>
|
||||||
<field name="country_id" invisible="1"/>
|
<field name="country_id" invisible="1"/>
|
||||||
<field name="grade_id" invisible="1"/>
|
<field name="grade_id" invisible="1"/>
|
||||||
|
|
|
@ -36,8 +36,7 @@ DMS_ROOT_PATH = tools.config.get('document_path', os.path.join(tools.config['roo
|
||||||
|
|
||||||
class document_file(osv.osv):
|
class document_file(osv.osv):
|
||||||
_inherit = 'ir.attachment'
|
_inherit = 'ir.attachment'
|
||||||
_rec_name = 'datas_fname'
|
_rec_name = 'name'
|
||||||
|
|
||||||
|
|
||||||
def _attach_parent_id(self, cr, uid, ids=None, context=None):
|
def _attach_parent_id(self, cr, uid, ids=None, context=None):
|
||||||
"""Migrate ir.attachments to the document module.
|
"""Migrate ir.attachments to the document module.
|
||||||
|
@ -149,29 +148,12 @@ class document_file(osv.osv):
|
||||||
_sql_constraints = [
|
_sql_constraints = [
|
||||||
# filename_uniq is not possible in pure SQL
|
# filename_uniq is not possible in pure SQL
|
||||||
]
|
]
|
||||||
def _check_duplication(self, cr, uid, vals, ids=None, op='create'):
|
|
||||||
name = vals.get('name', False)
|
def onchange_file(self, cr, uid, ids, datas_fname=False, context=None):
|
||||||
parent_id = vals.get('parent_id', False)
|
res = {'value':{}}
|
||||||
res_model = vals.get('res_model', False)
|
if datas_fname:
|
||||||
res_id = vals.get('res_id', 0)
|
res['value'].update({'name': datas_fname})
|
||||||
if op == 'write':
|
return res
|
||||||
for file in self.browse(cr, uid, ids): # FIXME fields_only
|
|
||||||
if not name:
|
|
||||||
name = file.name
|
|
||||||
if not parent_id:
|
|
||||||
parent_id = file.parent_id and file.parent_id.id or False
|
|
||||||
if not res_model:
|
|
||||||
res_model = file.res_model and file.res_model or False
|
|
||||||
if not res_id:
|
|
||||||
res_id = file.res_id and file.res_id or 0
|
|
||||||
res = self.search(cr, uid, [('id', '<>', file.id), ('name', '=', name), ('parent_id', '=', parent_id), ('res_model', '=', res_model), ('res_id', '=', res_id)])
|
|
||||||
if len(res):
|
|
||||||
return False
|
|
||||||
if op == 'create':
|
|
||||||
res = self.search(cr, uid, [('name', '=', name), ('parent_id', '=', parent_id), ('res_id', '=', res_id), ('res_model', '=', res_model)])
|
|
||||||
if len(res):
|
|
||||||
return False
|
|
||||||
return True
|
|
||||||
|
|
||||||
def check(self, cr, uid, ids, mode, context=None, values=None):
|
def check(self, cr, uid, ids, mode, context=None, values=None):
|
||||||
"""Check access wrt. res_model, relax the rule of ir.attachment parent
|
"""Check access wrt. res_model, relax the rule of ir.attachment parent
|
||||||
|
@ -219,8 +201,6 @@ class document_file(osv.osv):
|
||||||
res = self.search(cr, uid, [('id', 'in', ids)])
|
res = self.search(cr, uid, [('id', 'in', ids)])
|
||||||
if not len(res):
|
if not len(res):
|
||||||
return False
|
return False
|
||||||
if not self._check_duplication(cr, uid, vals, ids, 'write'):
|
|
||||||
raise osv.except_osv(_('ValidateError'), _('File name must be unique!'))
|
|
||||||
|
|
||||||
# if nodes call this write(), they must skip the code below
|
# if nodes call this write(), they must skip the code below
|
||||||
from_node = context and context.get('__from_node', False)
|
from_node = context and context.get('__from_node', False)
|
||||||
|
@ -286,22 +266,8 @@ class document_file(osv.osv):
|
||||||
else:
|
else:
|
||||||
if vals.get('file_size'):
|
if vals.get('file_size'):
|
||||||
del vals['file_size']
|
del vals['file_size']
|
||||||
result = self._check_duplication(cr, uid, vals)
|
|
||||||
if not result:
|
return super(document_file, self).create(cr, uid, vals, context)
|
||||||
domain = [
|
|
||||||
('res_id', '=', vals['res_id']),
|
|
||||||
('res_model', '=', vals['res_model']),
|
|
||||||
('datas_fname', '=', vals['datas_fname']),
|
|
||||||
]
|
|
||||||
attach_ids = self.search(cr, uid, domain, context=context)
|
|
||||||
super(document_file, self).write(cr, uid, attach_ids,
|
|
||||||
{'datas' : vals['datas']},
|
|
||||||
context=context)
|
|
||||||
result = attach_ids[0]
|
|
||||||
else:
|
|
||||||
#raise osv.except_osv(_('ValidateError'), _('File name must be unique!'))
|
|
||||||
result = super(document_file, self).create(cr, uid, vals, context)
|
|
||||||
return result
|
|
||||||
|
|
||||||
def __get_partner_id(self, cr, uid, res_model, res_id, context=None):
|
def __get_partner_id(self, cr, uid, res_model, res_id, context=None):
|
||||||
""" A helper to retrieve the associated partner from any res_model+id
|
""" A helper to retrieve the associated partner from any res_model+id
|
||||||
|
|
|
@ -228,6 +228,9 @@
|
||||||
<field name="priority" eval="1"/>
|
<field name="priority" eval="1"/>
|
||||||
<field name="inherit_id" ref="base.view_attachment_form"/>
|
<field name="inherit_id" ref="base.view_attachment_form"/>
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
|
<xpath expr="//field[@name='datas_fname']" position="replace">
|
||||||
|
<field name="datas_fname" invisible="1" on_change="onchange_file(datas_fname)"/>
|
||||||
|
</xpath>
|
||||||
<field name="url" position="after">
|
<field name="url" position="after">
|
||||||
<field name="user_id"/>
|
<field name="user_id"/>
|
||||||
</field>
|
</field>
|
||||||
|
@ -338,15 +341,6 @@
|
||||||
<field name="value" eval="'ir.actions.act_window,%d'%action_document_file_directory_form"/>
|
<field name="value" eval="'ir.actions.act_window,%d'%action_document_file_directory_form"/>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
<record model="ir.ui.view" id="view_attachment_form_inherit">
|
|
||||||
<field name="name">ir.attachment.view.inherit</field>
|
|
||||||
<field name="model">ir.attachment</field>
|
|
||||||
<field name="inherit_id" ref="base.view_attachment_form"/>
|
|
||||||
<field name="arch" type="xml">
|
|
||||||
<field name="datas_fname" position = "replace" >
|
|
||||||
</field>
|
|
||||||
</field>
|
|
||||||
</record>
|
|
||||||
|
|
||||||
<record model="ir.ui.view" id="view_process_node_form_inherit1">
|
<record model="ir.ui.view" id="view_process_node_form_inherit1">
|
||||||
<field name="name">process.node.form</field>
|
<field name="name">process.node.form</field>
|
||||||
|
|
|
@ -4,14 +4,8 @@ import textwrap
|
||||||
import simplejson
|
import simplejson
|
||||||
import werkzeug.wrappers
|
import werkzeug.wrappers
|
||||||
|
|
||||||
try:
|
import openerp.addons.web.http as openerpweb
|
||||||
# embedded
|
import openerp.addons.web.controllers.main as webmain
|
||||||
import openerp.addons.web.common.http as openerpweb
|
|
||||||
import openerp.addons.web.controllers.main as webmain
|
|
||||||
except ImportError:
|
|
||||||
# standalone
|
|
||||||
import web.common.http as openerpweb
|
|
||||||
import web.controllers.main as webmain
|
|
||||||
|
|
||||||
class EDI(openerpweb.Controller):
|
class EDI(openerpweb.Controller):
|
||||||
# http://hostname:8069/edi/view?db=XXXX&token=XXXXXXXXXXX
|
# http://hostname:8069/edi/view?db=XXXX&token=XXXXXXXXXXX
|
||||||
|
|
|
@ -39,7 +39,7 @@
|
||||||
attrs="{'invisible':[('use_template','=',False)]}"
|
attrs="{'invisible':[('use_template','=',False)]}"
|
||||||
on_change="onchange_template_id(use_template, template_id, composition_mode, model, res_id, context)"/>
|
on_change="onchange_template_id(use_template, template_id, composition_mode, model, res_id, context)"/>
|
||||||
</xpath>
|
</xpath>
|
||||||
<xpath expr="//button[@class='oe_mail_compose_message_attachment']" position="before">
|
<xpath expr="//button[@name='dummy']" position="before">
|
||||||
<button icon="/email_template/static/src/img/email_template.png"
|
<button icon="/email_template/static/src/img/email_template.png"
|
||||||
type="object" name="toggle_template" string=""
|
type="object" name="toggle_template" string=""
|
||||||
help="Use a message template"
|
help="Use a message template"
|
||||||
|
|
|
@ -267,25 +267,18 @@ class event_event(osv.osv):
|
||||||
return {'value': dic}
|
return {'value': dic}
|
||||||
|
|
||||||
def on_change_address_id(self, cr, uid, ids, address_id, context=None):
|
def on_change_address_id(self, cr, uid, ids, address_id, context=None):
|
||||||
values = {
|
values = {}
|
||||||
'street' : False,
|
if not address_id:
|
||||||
'street2' : False,
|
return values
|
||||||
'city' : False,
|
address = self.pool.get('res.partner').browse(cr, uid, address_id, context=context)
|
||||||
'zip' : False,
|
values.update({
|
||||||
'country_id' : False,
|
'street' : address.street,
|
||||||
'state_id' : False,
|
'street2' : address.street2,
|
||||||
}
|
'city' : address.city,
|
||||||
if isinstance(address_id, (long, int)):
|
'country_id' : address.country_id and address.country_id.id or False,
|
||||||
address = self.pool.get('res.partner').browse(cr, uid, address_id, context=context)
|
'state_id' : address.state_id and address.state_id.id or False,
|
||||||
values.update({
|
'zip' : address.zip,
|
||||||
'street' : address.street,
|
})
|
||||||
'street2' : address.street2,
|
|
||||||
'city' : address.city,
|
|
||||||
'country_id' : address.country_id and address.country_id.id,
|
|
||||||
'state_id' : address.state_id and address.state_id.id,
|
|
||||||
'zip' : address.zip,
|
|
||||||
})
|
|
||||||
|
|
||||||
return {'value' : values}
|
return {'value' : values}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -23,16 +23,16 @@ from osv import fields, osv
|
||||||
import tools
|
import tools
|
||||||
|
|
||||||
class report_event_registration(osv.osv):
|
class report_event_registration(osv.osv):
|
||||||
|
|
||||||
_name = "report.event.registration"
|
_name = "report.event.registration"
|
||||||
_description = "Events Analysis"
|
_description = "Events Analysis"
|
||||||
_auto = False
|
_auto = False
|
||||||
_columns = {
|
_columns = {
|
||||||
'event_date': fields.char('Event Start Date', size=64, readonly=True),
|
'event_date': fields.char('Event Start Date', size=64, readonly=True),
|
||||||
'year': fields.char('Year', size=4, readonly=True),
|
'year': fields.char('Year', size=4, readonly=True),
|
||||||
'month': fields.selection([('01','January'), ('02','February'), ('03','March'), ('04','April'),
|
'month': fields.selection([
|
||||||
('05','May'), ('06','June'), ('07','July'), ('08','August'), ('09','September'),
|
('01','January'), ('02','February'), ('03','March'), ('04','April'),
|
||||||
('10','October'), ('11','November'), ('12','December')], 'Month',readonly=True),
|
('05','May'), ('06','June'), ('07','July'), ('08','August'),
|
||||||
|
('09','September'), ('10','October'), ('11','November'), ('12','December')], 'Month',readonly=True),
|
||||||
'event_id': fields.many2one('event.event', 'Event', required=True),
|
'event_id': fields.many2one('event.event', 'Event', required=True),
|
||||||
'draft_state': fields.integer(' # No of Draft Registrations', size=20),
|
'draft_state': fields.integer(' # No of Draft Registrations', size=20),
|
||||||
'confirm_state': fields.integer(' # No of Confirmed Registrations', size=20),
|
'confirm_state': fields.integer(' # No of Confirmed Registrations', size=20),
|
||||||
|
@ -48,17 +48,18 @@ class report_event_registration(osv.osv):
|
||||||
'company_id': fields.many2one('res.company', 'Company', readonly=True),
|
'company_id': fields.many2one('res.company', 'Company', readonly=True),
|
||||||
}
|
}
|
||||||
_order = 'event_date desc'
|
_order = 'event_date desc'
|
||||||
|
|
||||||
def init(self, cr):
|
def init(self, cr):
|
||||||
"""
|
"""
|
||||||
initialize the sql view for the event registration
|
Initialize the sql view for the event registration
|
||||||
cr -- the cursor
|
|
||||||
"""
|
"""
|
||||||
tools.drop_view_if_exists(cr, 'report_event_registration')
|
tools.drop_view_if_exists(cr, 'report_event_registration')
|
||||||
cr.execute("""
|
|
||||||
CREATE OR REPLACE view report_event_registration AS (
|
# TOFIX this request won't select events that have no registration
|
||||||
SELECT
|
cr.execute(""" CREATE VIEW report_event_registration AS (
|
||||||
event_id,
|
SELECT
|
||||||
r.id,
|
e.id::char || '/' || coalesce(r.id::char,'') AS id,
|
||||||
|
e.id AS event_id,
|
||||||
e.user_id AS user_id,
|
e.user_id AS user_id,
|
||||||
r.user_id AS user_id_registration,
|
r.user_id AS user_id_registration,
|
||||||
r.name AS name_registration,
|
r.name AS name_registration,
|
||||||
|
@ -72,23 +73,21 @@ class report_event_registration(osv.osv):
|
||||||
CASE WHEN r.state IN ('open','done') THEN r.nb_register ELSE 0 END AS confirm_state,
|
CASE WHEN r.state IN ('open','done') THEN r.nb_register ELSE 0 END AS confirm_state,
|
||||||
e.type AS event_type,
|
e.type AS event_type,
|
||||||
e.register_max AS register_max,
|
e.register_max AS register_max,
|
||||||
e.state AS event_state,
|
e.state AS event_state,
|
||||||
r.state AS registration_state
|
r.state AS registration_state
|
||||||
FROM
|
FROM
|
||||||
event_event e
|
event_event e
|
||||||
|
LEFT JOIN event_registration r ON (e.id=r.event_id)
|
||||||
|
|
||||||
LEFT JOIN
|
GROUP BY
|
||||||
event_registration r ON (e.id=r.event_id)
|
|
||||||
|
|
||||||
GROUP BY
|
|
||||||
event_id,
|
event_id,
|
||||||
user_id_registration,
|
user_id_registration,
|
||||||
e.id,
|
|
||||||
r.id,
|
r.id,
|
||||||
registration_state,
|
registration_state,
|
||||||
r.nb_register,
|
r.nb_register,
|
||||||
event_type, e.id, e.date_begin, e.main_speaker_id,
|
event_type,
|
||||||
e.register_max,event_id, e.user_id,e.company_id,
|
e.id,
|
||||||
|
e.date_begin,
|
||||||
e.user_id,
|
e.user_id,
|
||||||
event_state,
|
event_state,
|
||||||
e.company_id,
|
e.company_id,
|
||||||
|
@ -97,9 +96,8 @@ class report_event_registration(osv.osv):
|
||||||
month,
|
month,
|
||||||
e.register_max,
|
e.register_max,
|
||||||
name_registration
|
name_registration
|
||||||
|
)
|
||||||
)
|
""")
|
||||||
""")
|
|
||||||
|
|
||||||
report_event_registration()
|
report_event_registration()
|
||||||
|
|
||||||
|
|
|
@ -1,13 +1,13 @@
|
||||||
<?xml version="1.0"?>
|
<?xml version="1.0"?>
|
||||||
<openerp>
|
<openerp>
|
||||||
<data>
|
<data>
|
||||||
|
|
||||||
<!-- report , event on registration... start -->
|
<!-- Report, event on registration -->
|
||||||
<record model="ir.ui.view" id="report_event_registration_tree">
|
<record model="ir.ui.view" id="report_event_registration_tree">
|
||||||
<field name="name">report.event.registration.tree</field>
|
<field name="name">report.event.registration.tree</field>
|
||||||
<field name="model">report.event.registration</field>
|
<field name="model">report.event.registration</field>
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<tree colors="blue:event_state == 'draft';black:event_state == 'confirm';gray:event_state in('done','cancel')" string="Events Analysis">
|
<tree colors="blue:event_state == 'draft';black:event_state == 'confirm';gray:event_state in('done','cancel')" create="false" string="Events Analysis">
|
||||||
<field name="event_date" invisible="1"/>
|
<field name="event_date" invisible="1"/>
|
||||||
<field name="user_id" invisible="1"/>
|
<field name="user_id" invisible="1"/>
|
||||||
<field name="speaker_id" invisible="1"/>
|
<field name="speaker_id" invisible="1"/>
|
||||||
|
@ -28,7 +28,6 @@
|
||||||
</field>
|
</field>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
|
|
||||||
<record model ="ir.ui.view" id="report_event_registration_graph">
|
<record model ="ir.ui.view" id="report_event_registration_graph">
|
||||||
<field name="name">report.event.registration.graph</field>
|
<field name="name">report.event.registration.graph</field>
|
||||||
<field name="model">report.event.registration</field>
|
<field name="model">report.event.registration</field>
|
||||||
|
@ -42,8 +41,7 @@
|
||||||
</field>
|
</field>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
<!-- Event on Registration search view -->
|
<!-- Event on Registration search view -->
|
||||||
|
|
||||||
<record model="ir.ui.view" id="view_report_event_registration_search">
|
<record model="ir.ui.view" id="view_report_event_registration_search">
|
||||||
<field name="name">report.event.registration.search</field>
|
<field name="name">report.event.registration.search</field>
|
||||||
<field name="model">report.event.registration</field>
|
<field name="model">report.event.registration</field>
|
||||||
|
@ -82,28 +80,28 @@
|
||||||
</field>
|
</field>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
<record model="ir.actions.act_window" id="action_report_event_registration">
|
<record model="ir.actions.act_window" id="action_report_event_registration">
|
||||||
<field name="name">Events Analysis</field>
|
<field name="name">Events Analysis</field>
|
||||||
<field name="res_model">report.event.registration</field>
|
<field name="res_model">report.event.registration</field>
|
||||||
<field name="view_type">form</field>
|
<field name="view_type">form</field>
|
||||||
<field name="view_mode">tree,graph</field>
|
<field name="view_mode">tree,graph</field>
|
||||||
<field name="search_view_id" ref="view_report_event_registration_search"/>
|
<field name="search_view_id" ref="view_report_event_registration_search"/>
|
||||||
<field name="context">{"search_default_year":1,"search_default_this_month":1,"search_default_365day":1, "search_default_invoiced":1, "search_default_event":1, 'group_by_no_leaf':1, 'group_by':[]}</field>
|
<field name="context">{"search_default_year":1,"search_default_this_month":1,"search_default_365day":1, "search_default_invoiced":1, "search_default_event":1, "group_by_no_leaf":1, "group_by":[]}</field>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
<record model="ir.actions.act_window.view" id="action_report_event_registration_tree">
|
<record model="ir.actions.act_window.view" id="action_report_event_registration_tree">
|
||||||
<field name="sequence" eval="1"/>
|
<field name="sequence" eval="1"/>
|
||||||
<field name="view_mode">tree</field>
|
<field name="view_mode">tree</field>
|
||||||
<field name="view_id" ref="report_event_registration_tree"/>
|
<field name="view_id" ref="report_event_registration_tree"/>
|
||||||
<field name="act_window_id" ref="action_report_event_registration"/>
|
<field name="act_window_id" ref="action_report_event_registration"/>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
<record model="ir.actions.act_window.view" id="action_report_event_registration_graph">
|
<record model="ir.actions.act_window.view" id="action_report_event_registration_graph">
|
||||||
<field name="sequence" eval="2"/>
|
<field name="sequence" eval="2"/>
|
||||||
<field name="view_mode">graph</field>
|
<field name="view_mode">graph</field>
|
||||||
<field name="view_id" ref="report_event_registration_graph"/>
|
<field name="view_id" ref="report_event_registration_graph"/>
|
||||||
<field name="act_window_id" ref="action_report_event_registration"/>
|
<field name="act_window_id" ref="action_report_event_registration"/>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
<menuitem parent="base.menu_reporting" id="menu_reporting_events" sequence="30" groups="event.group_event_manager" name="Events"/>
|
<menuitem parent="base.menu_reporting" id="menu_reporting_events" sequence="30" groups="event.group_event_manager" name="Events"/>
|
||||||
<menuitem parent="menu_reporting_events" action="action_report_event_registration" id="menu_report_event_registration" sequence="3" groups="event.group_event_manager"/>
|
<menuitem parent="menu_reporting_events" action="action_report_event_registration" id="menu_report_event_registration" sequence="3" groups="event.group_event_manager"/>
|
||||||
|
|
|
@ -6,10 +6,10 @@
|
||||||
<field name="model">product.product</field>
|
<field name="model">product.product</field>
|
||||||
<field name="inherit_id" ref="product.product_normal_form_view" />
|
<field name="inherit_id" ref="product.product_normal_form_view" />
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<field name="purchase_ok" position="before">
|
<div name="options" position="inside">
|
||||||
<field name="event_ok" on_change="onchange_event_ok(event_ok, context)"/>
|
<field name="event_ok" on_change="onchange_event_ok(event_ok, context)"/>
|
||||||
<label for="event_ok"/>
|
<label for="event_ok"/>
|
||||||
</field>
|
</div>
|
||||||
<field name='default_code' position='before'>
|
<field name='default_code' position='before'>
|
||||||
<field name="event_type_id" attrs="{'readonly': [('event_ok', '=', False)]}"/>
|
<field name="event_type_id" attrs="{'readonly': [('event_ok', '=', False)]}"/>
|
||||||
</field>
|
</field>
|
||||||
|
|
|
@ -27,7 +27,6 @@
|
||||||
'category': 'Tools',
|
'category': 'Tools',
|
||||||
'installable': True,
|
'installable': True,
|
||||||
'auto_install': False,
|
'auto_install': False,
|
||||||
'web': True,
|
|
||||||
'js': ['static/src/js/gdocs.js'],
|
'js': ['static/src/js/gdocs.js'],
|
||||||
'data': [
|
'data': [
|
||||||
'security/ir.model.access.csv',
|
'security/ir.model.access.csv',
|
||||||
|
|
|
@ -26,8 +26,11 @@ try:
|
||||||
from gdata.client import RequestError
|
from gdata.client import RequestError
|
||||||
from gdata.docs.service import DOCUMENT_LABEL
|
from gdata.docs.service import DOCUMENT_LABEL
|
||||||
import gdata.auth
|
import gdata.auth
|
||||||
|
from gdata.docs.data import Resource
|
||||||
except ImportError:
|
except ImportError:
|
||||||
raise osv.except_osv(_('Google Docs Error!'), _('Please install gdata-python-client from http://code.google.com/p/gdata-python-client/downloads/list.'))
|
import logging
|
||||||
|
_logger = logging.getLogger(__name__)
|
||||||
|
_logger.warning("Please install latest gdata-python-client from http://code.google.com/p/gdata-python-client/downloads/list")
|
||||||
|
|
||||||
class google_docs_ir_attachment(osv.osv):
|
class google_docs_ir_attachment(osv.osv):
|
||||||
_inherit = 'ir.attachment'
|
_inherit = 'ir.attachment'
|
||||||
|
|
|
@ -8,9 +8,10 @@
|
||||||
<field name="name">google_docs.config.tree</field>
|
<field name="name">google_docs.config.tree</field>
|
||||||
<field name="model">google.docs.config</field>
|
<field name="model">google.docs.config</field>
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<group name="default_filters" position="inside">
|
<tree string="Google Docs Configuration">
|
||||||
<field name="model_id"/>
|
<field name="model_id"/>
|
||||||
</group>
|
<field name="name_template"/>
|
||||||
|
</tree>
|
||||||
</field>
|
</field>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
|
@ -18,11 +19,25 @@
|
||||||
<field name="name">google_docs.config.form</field>
|
<field name="name">google_docs.config.form</field>
|
||||||
<field name="model">google.docs.config</field>
|
<field name="model">google.docs.config</field>
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<group colspan='4'>
|
<form string="Google Docs Configuration" version="7.0">
|
||||||
<field name="model_id"/>
|
<group>
|
||||||
<field name='gdocs_resource_id'/>
|
<field name="model_id"/>
|
||||||
<field name='name_template'/>
|
<label for='gdocs_resource_id'/>
|
||||||
</group>
|
<div>
|
||||||
|
<field name='gdocs_resource_id'/>
|
||||||
|
<p class="oe_grey">
|
||||||
|
This is the id of the template document, on google side. You can find it thanks to its URL:
|
||||||
|
<ul>
|
||||||
|
<li>for a text document with url like `https://docs.google.com/a/openerp.com/document/d/123456789/edit`, the ID is `document:123456789`</li>
|
||||||
|
<li>for a spreadsheet document with url like `https://docs.google.com/a/openerp.com/spreadsheet/ccc?key=123456789#gid=0`, the ID is `spreadsheet:123456789`</li>
|
||||||
|
<li>for a presentation (slide show) document with url like `https://docs.google.com/a/openerp.com/presentation/d/123456789/edit#slide=id.p`, the ID is `presentation:123456789`</li>
|
||||||
|
<li>for a drawing document with url like `https://docs.google.com/a/openerp.com/drawings/d/123456789/edit`, the ID is `drawings:123456789`</li>
|
||||||
|
</ul>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<field name='name_template'/>
|
||||||
|
</group>
|
||||||
|
</form>
|
||||||
</field>
|
</field>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
|
|
|
@ -334,13 +334,10 @@
|
||||||
<field name="state" widget="statusbar" statusbar_visible="recruit,open"/>
|
<field name="state" widget="statusbar" statusbar_visible="recruit,open"/>
|
||||||
</header>
|
</header>
|
||||||
<sheet>
|
<sheet>
|
||||||
<label for="name" class="oe_edit_only"/>
|
<div class="oe_title">
|
||||||
<h1>
|
<label for="name" class="oe_edit_only"/>
|
||||||
<field name="name" class="oe_inline"/>
|
<h1><field name="name" class="oe_inline"/></h1>
|
||||||
<label class="oe_inline" string="(" attrs="{'invisible': [('department_id', '=', False)]}"/>
|
</div>
|
||||||
<field name="department_id" class="oe_inline"/>
|
|
||||||
<label class="oe_inline" string=")" attrs="{'invisible': [('department_id', '=', False)]}"/>
|
|
||||||
</h1>
|
|
||||||
<group>
|
<group>
|
||||||
<group>
|
<group>
|
||||||
<field name="no_of_employee" groups="base.group_user"/>
|
<field name="no_of_employee" groups="base.group_user"/>
|
||||||
|
@ -349,7 +346,7 @@
|
||||||
</group>
|
</group>
|
||||||
<group>
|
<group>
|
||||||
<field name="company_id" widget="selection" groups="base.group_multi_company"/>
|
<field name="company_id" widget="selection" groups="base.group_multi_company"/>
|
||||||
</group>
|
<field name="department_id"/> </group>
|
||||||
</group>
|
</group>
|
||||||
<div>
|
<div>
|
||||||
<label for="description"/>
|
<label for="description"/>
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
<field name="name">hr.evaluation.report.tree</field>
|
<field name="name">hr.evaluation.report.tree</field>
|
||||||
<field name="model">hr.evaluation.report</field>
|
<field name="model">hr.evaluation.report</field>
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<tree colors="blue:state == 'draft';black:state in ('wait','progress');gray:state in('done','cancel')"
|
<tree colors="blue:state == 'draft';black:state in ('wait','progress');gray:state in('done','cancel')" create="false"
|
||||||
string="Appraisal Analysis">
|
string="Appraisal Analysis">
|
||||||
<field name="create_date" invisible="1"/>
|
<field name="create_date" invisible="1"/>
|
||||||
<field name="employee_id" invisible="1"/>
|
<field name="employee_id" invisible="1"/>
|
||||||
|
|
|
@ -243,7 +243,7 @@ class product_product(osv.osv):
|
||||||
data_obj = self.pool.get('ir.model.data')
|
data_obj = self.pool.get('ir.model.data')
|
||||||
cat_id = data_obj._get_id(cr, uid, 'hr_expense', 'cat_expense')
|
cat_id = data_obj._get_id(cr, uid, 'hr_expense', 'cat_expense')
|
||||||
categ_id = data_obj.browse(cr, uid, cat_id).res_id
|
categ_id = data_obj.browse(cr, uid, cat_id).res_id
|
||||||
res = {'value' : {'type':'service','procure_method':'make_to_stock','supply_method':'buy','purchase_ok':True,'sale_ok' :False,'categ_id':categ_id }}
|
res = {'value' : {'type':'service','sale_ok' :False,'categ_id':categ_id }}
|
||||||
return res
|
return res
|
||||||
|
|
||||||
product_product()
|
product_product()
|
||||||
|
|
|
@ -196,10 +196,10 @@
|
||||||
<field name="model">product.product</field>
|
<field name="model">product.product</field>
|
||||||
<field name="inherit_id" ref="product.product_normal_form_view"/>
|
<field name="inherit_id" ref="product.product_normal_form_view"/>
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<field name="purchase_ok" position="before">
|
<div name="options" position="inside">
|
||||||
<field name="hr_expense_ok" on_change="on_change_hr_expense_ok(hr_expense_ok)"/>
|
<field name="hr_expense_ok" on_change="on_change_hr_expense_ok(hr_expense_ok)"/>
|
||||||
<label for="hr_expense_ok"/>
|
<label for="hr_expense_ok"/>
|
||||||
</field>
|
</div>
|
||||||
</field>
|
</field>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
<field name="name">hr.expense.report.tree</field>
|
<field name="name">hr.expense.report.tree</field>
|
||||||
<field name="model">hr.expense.report</field>
|
<field name="model">hr.expense.report</field>
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<tree colors="blue:state == 'draft';black:state in ('confirm','accepted','done');gray:state == 'cancelled'" string="Expenses Analysis">
|
<tree colors="blue:state == 'draft';black:state in ('confirm','accepted','done');gray:state == 'cancelled'" create="false" string="Expenses Analysis">
|
||||||
<field name="employee_id" invisible="1"/>
|
<field name="employee_id" invisible="1"/>
|
||||||
<field name="user_id" invisible="1"/>
|
<field name="user_id" invisible="1"/>
|
||||||
<field name="year" invisible="1"/>
|
<field name="year" invisible="1"/>
|
||||||
|
|
|
@ -9,6 +9,7 @@ access_product_template_hr_expense_user,product.template.hr.expense.user,product
|
||||||
access_product_uom_hr_expense_user,product.uom.hr.expense.user,product.model_product_uom,base.group_hr_user,1,1,1,1
|
access_product_uom_hr_expense_user,product.uom.hr.expense.user,product.model_product_uom,base.group_hr_user,1,1,1,1
|
||||||
access_product_price_type_user,product.price.type.user,product.model_product_price_type,base.group_hr_user,1,1,1,1
|
access_product_price_type_user,product.price.type.user,product.model_product_price_type,base.group_hr_user,1,1,1,1
|
||||||
access_account_journal_user,account.journal.user,account.model_account_journal,base.group_hr_user,1,1,1,1
|
access_account_journal_user,account.journal.user,account.model_account_journal,base.group_hr_user,1,1,1,1
|
||||||
|
access_account_journal_employee,account.journal.employee,account.model_account_journal,base.group_user,1,0,0,0
|
||||||
access_account_invoice_user,account.invoice.user,account.model_account_invoice,base.group_hr_user,1,1,1,1
|
access_account_invoice_user,account.invoice.user,account.model_account_invoice,base.group_hr_user,1,1,1,1
|
||||||
access_account_invoice_line_user,account.invoice.line.user,account.model_account_invoice_line,base.group_hr_user,1,1,1,1
|
access_account_invoice_line_user,account.invoice.line.user,account.model_account_invoice_line,base.group_hr_user,1,1,1,1
|
||||||
access_account_analytic_journal_user,account.ianalytic.journal.user,account.model_account_analytic_journal,base.group_hr_user,1,1,1,1
|
access_account_analytic_journal_user,account.ianalytic.journal.user,account.model_account_analytic_journal,base.group_hr_user,1,1,1,1
|
||||||
|
|
|
|
@ -353,6 +353,32 @@
|
||||||
|
|
||||||
<menuitem name="My Allocation Requests" parent="menu_open_ask_holidays" id="menu_open_allocation_holidays" action="open_allocation_holidays"/>
|
<menuitem name="My Allocation Requests" parent="menu_open_ask_holidays" id="menu_open_allocation_holidays" action="open_allocation_holidays"/>
|
||||||
|
|
||||||
|
<record model="ir.actions.act_window" id="request_approve_allocation">
|
||||||
|
<field name="name">Allocation Requests to Approve</field>
|
||||||
|
<field name="res_model">hr.holidays</field>
|
||||||
|
<field name="view_type">form</field>
|
||||||
|
<field name="context">{'default_type': 'add', 'search_default_approve':1}</field>
|
||||||
|
<field name="domain">[('type','=','add')]</field>
|
||||||
|
<field name="view_id" ref="allocation_leave_new"/>
|
||||||
|
<field name="search_view_id" ref="view_hr_holidays_filter"/>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record model="ir.actions.act_window.view" id="action_request_approve_allocation_tree">
|
||||||
|
<field name="sequence" eval="1"/>
|
||||||
|
<field name="view_mode">tree</field>
|
||||||
|
<field name="view_id" ref="view_holiday_allocation_tree"/>
|
||||||
|
<field name="act_window_id" ref="request_approve_allocation"/>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record model="ir.actions.act_window.view" id="action_request_approve_allocation_form">
|
||||||
|
<field name="sequence" eval="2"/>
|
||||||
|
<field name="view_mode">form</field>
|
||||||
|
<field name="view_id" ref="allocation_leave_new"/>
|
||||||
|
<field name="act_window_id" ref="request_approve_allocation"/>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<menuitem parent="menu_open_ask_holidays" id="menu_request_approve_allocation" action="request_approve_allocation" groups="base.group_hr_manager"/>
|
||||||
|
|
||||||
<record model="ir.actions.act_window" id="open_company_allocation">
|
<record model="ir.actions.act_window" id="open_company_allocation">
|
||||||
<field name="name">Leaves Summary</field>
|
<field name="name">Leaves Summary</field>
|
||||||
<field name="res_model">hr.holidays</field>
|
<field name="res_model">hr.holidays</field>
|
||||||
|
|
|
@ -342,8 +342,8 @@
|
||||||
attrs="{'invisible':[('survey_id','=',False)]}"/>
|
attrs="{'invisible':[('survey_id','=',False)]}"/>
|
||||||
</div>
|
</div>
|
||||||
</field>
|
</field>
|
||||||
<xpath expr="/form/sheet/h1" version="7.0" position="after">
|
<xpath expr="//div[@class='oe_title']" version="7.0" position="after">
|
||||||
<div colspan="4" attrs="{'invisible': [('alias_domain', '=', False)]}">
|
<div attrs="{'invisible': [('alias_domain', '=', False)]}">
|
||||||
<field name="alias_id" invisible="1" required="0"/>
|
<field name="alias_id" invisible="1" required="0"/>
|
||||||
<label for="alias_name" class="oe_edit_only"/>
|
<label for="alias_name" class="oe_edit_only"/>
|
||||||
<field name="alias_name" nolabel="1" class="oe_inline" attrs="{'required': [('alias_id', '!=', False)]}"/>@<field name="alias_domain" nolabel="1" class="oe_inline"/>
|
<field name="alias_name" nolabel="1" class="oe_inline" attrs="{'required': [('alias_id', '!=', False)]}"/>@<field name="alias_domain" nolabel="1" class="oe_inline"/>
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
<field name="name">hr.recruitment.report.tree</field>
|
<field name="name">hr.recruitment.report.tree</field>
|
||||||
<field name="model">hr.recruitment.report</field>
|
<field name="model">hr.recruitment.report</field>
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<tree string="Recruitment Analysis">
|
<tree string="Recruitment Analysis" create="false">
|
||||||
<field name="date" invisible="1"/>
|
<field name="date" invisible="1"/>
|
||||||
<field name="user_id" invisible="1"/>
|
<field name="user_id" invisible="1"/>
|
||||||
<field name="job_id"/>
|
<field name="job_id"/>
|
||||||
|
|
|
@ -135,6 +135,8 @@ class account_analytic_line(osv.osv):
|
||||||
def _default_general_account(self, cr, uid, context=None):
|
def _default_general_account(self, cr, uid, context=None):
|
||||||
proxy = self.pool.get('hr.employee')
|
proxy = self.pool.get('hr.employee')
|
||||||
record_ids = proxy.search(cr, uid, [('user_id', '=', uid)], context=context)
|
record_ids = proxy.search(cr, uid, [('user_id', '=', uid)], context=context)
|
||||||
|
if not record_ids:
|
||||||
|
raise osv.except_osv(_('Error!'), _('Please create an employee associated to this user.'))
|
||||||
employee = proxy.browse(cr, uid, record_ids[0], context=context)
|
employee = proxy.browse(cr, uid, record_ids[0], context=context)
|
||||||
if employee.product_id and employee.product_id.property_account_income:
|
if employee.product_id and employee.product_id.property_account_income:
|
||||||
return employee.product_id.property_account_income.id
|
return employee.product_id.property_account_income.id
|
||||||
|
|
|
@ -15,7 +15,7 @@
|
||||||
<field name="name">hr.timesheet.report.tree</field>
|
<field name="name">hr.timesheet.report.tree</field>
|
||||||
<field name="model">hr.timesheet.report</field>
|
<field name="model">hr.timesheet.report</field>
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<tree string="Timesheet Analysis">
|
<tree string="Timesheet Analysis" create="false">
|
||||||
<field name="year" invisible="1"/>
|
<field name="year" invisible="1"/>
|
||||||
<field name="month" invisible="1"/>
|
<field name="month" invisible="1"/>
|
||||||
<field name="date" invisible="1"/>
|
<field name="date" invisible="1"/>
|
||||||
|
|
|
@ -35,7 +35,7 @@ class hr_timesheet_current_open(osv.osv_memory):
|
||||||
|
|
||||||
user_ids = self.pool.get('hr.employee').search(cr, uid, [('user_id','=',uid)], context=context)
|
user_ids = self.pool.get('hr.employee').search(cr, uid, [('user_id','=',uid)], context=context)
|
||||||
if not len(user_ids):
|
if not len(user_ids):
|
||||||
raise osv.except_osv(_('Error!'), _('Please define employee for your user!'))
|
raise osv.except_osv(_('Error!'), _('Please create an employee and associate it with this user.'))
|
||||||
ids = ts.search(cr, uid, [('user_id','=',uid),('state','=','draft'),('date_from','<=',time.strftime('%Y-%m-%d')), ('date_to','>=',time.strftime('%Y-%m-%d'))], context=context)
|
ids = ts.search(cr, uid, [('user_id','=',uid),('state','=','draft'),('date_from','<=',time.strftime('%Y-%m-%d')), ('date_to','>=',time.strftime('%Y-%m-%d'))], context=context)
|
||||||
|
|
||||||
if len(ids) > 1:
|
if len(ids) > 1:
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
<field name="name">payment.advice.report.tree</field>
|
<field name="name">payment.advice.report.tree</field>
|
||||||
<field name="model">payment.advice.report</field>
|
<field name="model">payment.advice.report</field>
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<tree colors="blue:state == 'draft';black:state == 'confirm';gray:state == 'cancel' " string="Advices Analysis">
|
<tree colors="blue:state == 'draft';black:state == 'confirm';gray:state == 'cancel' " create="false" string="Advices Analysis">
|
||||||
<field name="nbr" sum="# Payment Lines"/>
|
<field name="nbr" sum="# Payment Lines"/>
|
||||||
<field name="name" invisible="1"/>
|
<field name="name" invisible="1"/>
|
||||||
<field name="employee_id" invisible="1"/>
|
<field name="employee_id" invisible="1"/>
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
<field name="name">payslip.report.tree</field>
|
<field name="name">payslip.report.tree</field>
|
||||||
<field name="model">payslip.report</field>
|
<field name="model">payslip.report</field>
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<tree colors="blue:state == 'draft';black:state == 'done';gray:state == 'cancel' " string="Payslip Analysis">
|
<tree colors="blue:state == 'draft';black:state == 'done';gray:state == 'cancel' " create="false" string="Payslip Analysis">
|
||||||
<field name="nbr" sum="# Payslip Lines"/>
|
<field name="nbr" sum="# Payslip Lines"/>
|
||||||
<field name="name"/>
|
<field name="name"/>
|
||||||
<field name="employee_id" invisible="1"/>
|
<field name="employee_id" invisible="1"/>
|
||||||
|
|
|
@ -134,6 +134,7 @@ class mail_message(osv.Model):
|
||||||
'subtype_id': fields.many2one('mail.message.subtype', 'Subtype'),
|
'subtype_id': fields.many2one('mail.message.subtype', 'Subtype'),
|
||||||
'vote_user_ids': fields.many2many('res.users', 'mail_vote', 'message_id', 'user_id', string='Votes',
|
'vote_user_ids': fields.many2many('res.users', 'mail_vote', 'message_id', 'user_id', string='Votes',
|
||||||
help='Users that voted for this message'),
|
help='Users that voted for this message'),
|
||||||
|
'is_private': fields.boolean('Private message'),
|
||||||
}
|
}
|
||||||
|
|
||||||
def _needaction_domain_get(self, cr, uid, context=None):
|
def _needaction_domain_get(self, cr, uid, context=None):
|
||||||
|
@ -150,6 +151,7 @@ class mail_message(osv.Model):
|
||||||
'date': lambda *a: fields.datetime.now(),
|
'date': lambda *a: fields.datetime.now(),
|
||||||
'author_id': lambda self, cr, uid, ctx={}: self._get_default_author(cr, uid, ctx),
|
'author_id': lambda self, cr, uid, ctx={}: self._get_default_author(cr, uid, ctx),
|
||||||
'body': '',
|
'body': '',
|
||||||
|
'is_private': True,
|
||||||
}
|
}
|
||||||
|
|
||||||
#------------------------------------------------------
|
#------------------------------------------------------
|
||||||
|
@ -220,127 +222,12 @@ class mail_message(osv.Model):
|
||||||
'unread': msg.unread and msg.unread['unread'] or False
|
'unread': msg.unread and msg.unread['unread'] or False
|
||||||
}
|
}
|
||||||
|
|
||||||
def message_read_tree_get_expandable(self, cr, uid, parent_message, last_message, domain=[], current_level=0, level=0, context=None):
|
def _message_read_expandable(self, cr, uid, tree, result, message_loaded, domain, context, parent_id, limit):
|
||||||
""" . """
|
|
||||||
base_domain = [('id', '<', last_message['id'])]
|
|
||||||
if parent_message and current_level < level:
|
|
||||||
base_domain += [('parent_id', '=', parent_message['id'])]
|
|
||||||
elif parent_message:
|
|
||||||
base_domain += [('id', 'child_of', parent_message['id']), ('id', '!=', parent_message['id'])]
|
|
||||||
if domain:
|
|
||||||
base_domain += domain
|
|
||||||
extension = { 'type': 'expandable',
|
|
||||||
'domain': base_domain,
|
|
||||||
'thread_level': current_level,
|
|
||||||
'context': context,
|
|
||||||
'id': -1,
|
|
||||||
}
|
|
||||||
return extension
|
|
||||||
|
|
||||||
def message_read_tree_flatten(self, cr, uid, parent_message, messages, domain=[], level=0, current_level=0, context=None, limit=None, add_expandable=True):
|
|
||||||
""" Given a tree with several roots of following structure :
|
|
||||||
[ {'id': 1, 'child_ids': [
|
|
||||||
{'id': 11, 'child_ids': [...] },],
|
|
||||||
{...} ]
|
|
||||||
Flatten it to have a maximum number of levels, 0 being flat and
|
|
||||||
sort messages in a level according to a key of the messages.
|
|
||||||
Perform the flattening at leafs if above the maximum depth, then get
|
|
||||||
back in the tree.
|
|
||||||
:param context: ``sort_key``: key for sorting (id by default)
|
|
||||||
:param context: ``sort_reverse``: reverser order for sorting (True by default)
|
|
||||||
"""
|
"""
|
||||||
def _flatten(msg_dict):
|
create the expandable message for all parent message read
|
||||||
""" from {'id': x, 'child_ids': [{child1}, {child2}]}
|
this function is used by message_read
|
||||||
get [{'id': x, 'child_ids': []}, {child1}, {child2}]
|
|
||||||
"""
|
|
||||||
child_ids = msg_dict.pop('child_ids', [])
|
|
||||||
msg_dict['child_ids'] = []
|
|
||||||
return [msg_dict] + child_ids
|
|
||||||
|
|
||||||
context = context or {}
|
|
||||||
limit = limit or self._message_read_limit
|
|
||||||
|
|
||||||
# Depth-first flattening
|
|
||||||
for message in messages:
|
|
||||||
if message.get('type') == 'expandable':
|
|
||||||
continue
|
|
||||||
message['child_ids'] = self.message_read_tree_flatten(cr, uid, message, message['child_ids'], domain, level, current_level + 1, context=context, limit=limit)
|
|
||||||
for child in message['child_ids']:
|
|
||||||
if child.get('type') == 'expandable':
|
|
||||||
continue
|
|
||||||
message['child_nbr'] += child['child_nbr']
|
|
||||||
# Flatten if above maximum depth
|
|
||||||
if current_level < level:
|
|
||||||
return_list = messages
|
|
||||||
else:
|
|
||||||
return_list = [flat_message for message in messages for flat_message in _flatten(message)]
|
|
||||||
|
|
||||||
# Add expandable
|
|
||||||
return_list = sorted(return_list, key=itemgetter(context.get('sort_key', 'id')), reverse=context.get('sort_reverse', True))
|
|
||||||
if return_list and current_level == 0 and add_expandable:
|
|
||||||
expandable = self.message_read_tree_get_expandable(cr, uid, parent_message, return_list and return_list[-1] or parent_message, domain, current_level, level, context=context)
|
|
||||||
return_list.append(expandable)
|
|
||||||
elif return_list and current_level <= level and add_expandable:
|
|
||||||
expandable = self.message_read_tree_get_expandable(cr, uid, parent_message, return_list and return_list[-1] or parent_message, domain, current_level, level, context=context)
|
|
||||||
return_list.append(expandable)
|
|
||||||
return return_list
|
|
||||||
|
|
||||||
def message_read(self, cr, uid, ids=False, domain=[], level=0, context=None, parent_id=False, limit=None):
|
|
||||||
""" Read messages from mail.message, and get back a structured tree
|
|
||||||
of messages to be displayed as discussion threads. If IDs is set,
|
|
||||||
fetch these records. Otherwise use the domain to fetch messages.
|
|
||||||
After having fetch messages, their parents will be added to obtain
|
|
||||||
well formed threads.
|
|
||||||
|
|
||||||
:param domain: optional domain for searching ids
|
|
||||||
:param level: level of threads to display, 0 being flat
|
|
||||||
:param limit: number of messages to fetch
|
|
||||||
:param parent_id: if parent_id reached, stop searching for
|
|
||||||
further parents
|
|
||||||
:return list: list of trees of messages
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
message_loaded = context and context.get('message_loaded') or [0]
|
|
||||||
|
|
||||||
# don't read the message display by .js, in context message_loaded list
|
|
||||||
if context and context.get('message_loaded'):
|
|
||||||
domain += [ ['id','not in',message_loaded] ];
|
|
||||||
|
|
||||||
limit = limit or self._message_read_limit
|
|
||||||
context = context or {}
|
|
||||||
|
|
||||||
tree = []
|
|
||||||
result = []
|
|
||||||
record = None
|
|
||||||
|
|
||||||
# select ids
|
|
||||||
if ids:
|
|
||||||
for msg in self.browse(cr, uid, ids, context=context):
|
|
||||||
result.append(self._message_dict_get(cr, uid, msg, context=context))
|
|
||||||
return result
|
|
||||||
|
|
||||||
# key: ID, value: record
|
|
||||||
ids = self.search(cr, SUPERUSER_ID, domain, context=context, limit=limit)
|
|
||||||
for msg in self.browse(cr, uid, ids, context=context):
|
|
||||||
# if not in record and not in message_loded list
|
|
||||||
if msg.id not in tree and msg.id not in message_loaded :
|
|
||||||
record = self._message_dict_get(cr, uid, msg, context=context)
|
|
||||||
tree.append(msg.id)
|
|
||||||
result.append(record)
|
|
||||||
|
|
||||||
while msg.parent_id and msg.parent_id.id != parent_id:
|
|
||||||
parent_id = msg.parent_id.id
|
|
||||||
if msg.parent_id.id not in tree:
|
|
||||||
msg = msg.parent_id
|
|
||||||
tree.append(msg.id)
|
|
||||||
# if not in record and not in message_loded list
|
|
||||||
if msg.id not in message_loaded :
|
|
||||||
record = self._message_dict_get(cr, uid, msg, context=context)
|
|
||||||
result.append(record)
|
|
||||||
|
|
||||||
result = sorted(result, key=lambda k: k['id'])
|
|
||||||
|
|
||||||
|
|
||||||
tree_not = []
|
tree_not = []
|
||||||
# expandable for not show message
|
# expandable for not show message
|
||||||
for id_msg in tree:
|
for id_msg in tree:
|
||||||
|
@ -367,10 +254,12 @@ class mail_message(osv.Model):
|
||||||
'parent_id': id_msg,
|
'parent_id': id_msg,
|
||||||
'id': id_min
|
'id': id_min
|
||||||
})
|
})
|
||||||
|
id_min=None
|
||||||
|
id_max=None
|
||||||
nb=0
|
nb=0
|
||||||
if nb>0:
|
if nb>0:
|
||||||
result.append({
|
result.append({
|
||||||
'domain': [['id','>=',id_min],['parent_id','=',id_msg]],
|
'domain': [['id','>=',id_min],['id','<=',id_max],['parent_id','=',id_msg]],
|
||||||
'nb_messages': nb,
|
'nb_messages': nb,
|
||||||
'type': 'expandable',
|
'type': 'expandable',
|
||||||
'parent_id': id_msg,
|
'parent_id': id_msg,
|
||||||
|
@ -395,6 +284,73 @@ class mail_message(osv.Model):
|
||||||
|
|
||||||
return result
|
return result
|
||||||
|
|
||||||
|
def message_read(self, cr, uid, ids=False, domain=[], level=0, context=None, parent_id=False, limit=None):
|
||||||
|
""" Read messages from mail.message, and get back a structured tree
|
||||||
|
of messages to be displayed as discussion threads. If IDs is set,
|
||||||
|
fetch these records. Otherwise use the domain to fetch messages.
|
||||||
|
After having fetch messages, their parents will be added to obtain
|
||||||
|
well formed threads.
|
||||||
|
|
||||||
|
:param domain: optional domain for searching ids
|
||||||
|
:param limit: number of messages to fetch
|
||||||
|
:param parent_id: if parent_id reached, stop searching for
|
||||||
|
further parents
|
||||||
|
:return list: list of trees of messages
|
||||||
|
"""
|
||||||
|
message_loaded = context and context.get('message_loaded') or [0]
|
||||||
|
|
||||||
|
# don't read the message display by .js, in context message_loaded list
|
||||||
|
if context and context.get('message_loaded'):
|
||||||
|
domain += [ ['id','not in',message_loaded] ];
|
||||||
|
|
||||||
|
limit = limit or self._message_read_limit
|
||||||
|
context = context or {}
|
||||||
|
|
||||||
|
tree = []
|
||||||
|
result = []
|
||||||
|
record = None
|
||||||
|
|
||||||
|
# select ids
|
||||||
|
if ids and ids!=[None]:
|
||||||
|
for msg in self.browse(cr, uid, ids, context=context):
|
||||||
|
result.append(self._message_dict_get(cr, uid, msg, context=context))
|
||||||
|
return result
|
||||||
|
|
||||||
|
# key: ID, value: record
|
||||||
|
ids = self.search(cr, SUPERUSER_ID, domain, context=context, limit=limit)
|
||||||
|
for msg in self.browse(cr, uid, ids, context=context):
|
||||||
|
# if not in record and not in message_loded list
|
||||||
|
if msg.id not in tree and msg.id not in message_loaded :
|
||||||
|
record = self._message_dict_get(cr, uid, msg, context=context)
|
||||||
|
tree.append(msg.id)
|
||||||
|
result.append(record)
|
||||||
|
|
||||||
|
while msg.parent_id and msg.parent_id.id != parent_id:
|
||||||
|
parent_id = msg.parent_id.id
|
||||||
|
if msg.parent_id.id not in tree:
|
||||||
|
msg = msg.parent_id
|
||||||
|
tree.append(msg.id)
|
||||||
|
# if not in record and not in message_loded list
|
||||||
|
if msg.id not in message_loaded :
|
||||||
|
record = self._message_dict_get(cr, uid, msg, context=context)
|
||||||
|
result.append(record)
|
||||||
|
|
||||||
|
result = sorted(result, key=lambda k: k['id'])
|
||||||
|
|
||||||
|
result = self._message_read_expandable(cr, uid, tree, result, message_loaded, domain, context, parent_id, limit)
|
||||||
|
|
||||||
|
return result
|
||||||
|
|
||||||
|
def user_free_attachment(self, cr, uid, context=None):
|
||||||
|
attachment_list = []
|
||||||
|
|
||||||
|
attachment = self.pool.get('ir.attachment')
|
||||||
|
attachment_ids = attachment.search(cr, uid, [('res_model','=',''),('create_uid','=',uid)])
|
||||||
|
if len(attachment_ids):
|
||||||
|
attachment_list = [{'id': attach.id, 'name': attach.name, 'date': attach.create_date} for attach in attachment.browse(cr, uid, attachment_ids, context=context)]
|
||||||
|
|
||||||
|
return attachment_list
|
||||||
|
|
||||||
#------------------------------------------------------
|
#------------------------------------------------------
|
||||||
# Email api
|
# Email api
|
||||||
#------------------------------------------------------
|
#------------------------------------------------------
|
||||||
|
@ -525,11 +481,9 @@ class mail_message(osv.Model):
|
||||||
self.pool.get('ir.attachment').unlink(cr, uid, attachments_to_delete, context=context)
|
self.pool.get('ir.attachment').unlink(cr, uid, attachments_to_delete, context=context)
|
||||||
return super(mail_message, self).unlink(cr, uid, ids, context=context)
|
return super(mail_message, self).unlink(cr, uid, ids, context=context)
|
||||||
|
|
||||||
def _notify(self, cr, uid, newid, context=None):
|
def _notify_followers(self, cr, uid, newid, message, context=None):
|
||||||
""" Add the related record followers to the destination partner_ids.
|
""" Add the related record followers to the destination partner_ids.
|
||||||
Call mail_notification.notify to manage the email sending
|
|
||||||
"""
|
"""
|
||||||
message = self.browse(cr, uid, newid, context=context)
|
|
||||||
partners_to_notify = set([])
|
partners_to_notify = set([])
|
||||||
# message has no subtype_id: pure log message -> no partners, no one notified
|
# message has no subtype_id: pure log message -> no partners, no one notified
|
||||||
if not message.subtype_id:
|
if not message.subtype_id:
|
||||||
|
@ -550,6 +504,14 @@ class mail_message(osv.Model):
|
||||||
self.write(cr, SUPERUSER_ID, [newid], {'partner_ids': [(4, p_id) for p_id in missing_notified]}, context=context)
|
self.write(cr, SUPERUSER_ID, [newid], {'partner_ids': [(4, p_id) for p_id in missing_notified]}, context=context)
|
||||||
partners_to_notify |= extra_notified
|
partners_to_notify |= extra_notified
|
||||||
|
|
||||||
|
def _notify(self, cr, uid, newid, context=None):
|
||||||
|
""" Add the related record followers to the destination partner_ids if is not a private message.
|
||||||
|
Call mail_notification.notify to manage the email sending
|
||||||
|
"""
|
||||||
|
message = self.browse(cr, uid, newid, context=context)
|
||||||
|
if message and (message.is_private!=False and message.is_private!=None):
|
||||||
|
self._notify_followers(cr, uid, newid, message, context=context)
|
||||||
|
|
||||||
# add myself if I wrote on my wall,
|
# add myself if I wrote on my wall,
|
||||||
# unless remove myself author
|
# unless remove myself author
|
||||||
if ((message.model=="res.partner" and message.res_id==message.author_id.id)):
|
if ((message.model=="res.partner" and message.res_id==message.author_id.id)):
|
||||||
|
|
|
@ -88,21 +88,21 @@
|
||||||
<field name="name">Inbox</field>
|
<field name="name">Inbox</field>
|
||||||
<field name="tag">mail.wall</field>
|
<field name="tag">mail.wall</field>
|
||||||
<field name="params" eval=""{'domain': [('notification_ids.partner_id.user_ids', 'in', [uid]),('unread', '=', True)],
|
<field name="params" eval=""{'domain': [('notification_ids.partner_id.user_ids', 'in', [uid]),('unread', '=', True)],
|
||||||
'context': {'default_model': 'res.users', 'default_res_id': uid} }""/>
|
'context': {'default_model': 'res.partner'} }""/>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
<record id="action_mail_archives_feeds" model="ir.actions.client">
|
<record id="action_mail_archives_feeds" model="ir.actions.client">
|
||||||
<field name="name">Archives</field>
|
<field name="name">Archives</field>
|
||||||
<field name="tag">mail.wall</field>
|
<field name="tag">mail.wall</field>
|
||||||
<field name="params" eval=""{'domain': [('notification_ids.partner_id.user_ids', 'in', [uid]),('unread', '=', False)],
|
<field name="params" eval=""{'domain': [('notification_ids.partner_id.user_ids', 'in', [uid]),('unread', '=', False)],
|
||||||
'context': {'default_model': 'res.users', 'default_res_id': uid} }""/>
|
'context': {'default_model': 'res.partner'} }""/>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
<record id="action_mail_sent_feeds" model="ir.actions.client">
|
<record id="action_mail_sent_feeds" model="ir.actions.client">
|
||||||
<field name="name">Sent</field>
|
<field name="name">Sent</field>
|
||||||
<field name="tag">mail.wall</field>
|
<field name="tag">mail.wall</field>
|
||||||
<field name="params" eval=""{'domain': [('author_id.user_ids', 'in', [uid])],
|
<field name="params" eval=""{'domain': [('author_id.user_ids', 'in', [uid])],
|
||||||
'context': {'default_model': 'res.users', 'default_res_id': uid} }""/>
|
'context': {'default_model': 'res.partner'} }""/>
|
||||||
</record>
|
</record>
|
||||||
</data>
|
</data>
|
||||||
</openerp>
|
</openerp>
|
||||||
|
|
|
@ -623,11 +623,10 @@ class mail_thread(osv.AbstractModel):
|
||||||
:param str subject: optional subject
|
:param str subject: optional subject
|
||||||
:param str type: mail_message.type
|
:param str type: mail_message.type
|
||||||
:param int parent_id: optional ID of parent message in this thread
|
:param int parent_id: optional ID of parent message in this thread
|
||||||
:param tuple(str,str) attachments: list of attachment tuples in the form
|
:param tuple(str,str) attachments or list id: list of attachment tuples in the form
|
||||||
``(name,content)``, where content is NOT base64 encoded
|
``(name,content)``, where content is NOT base64 encoded
|
||||||
:return: ID of newly created mail.message
|
:return: ID of newly created mail.message
|
||||||
"""
|
"""
|
||||||
|
|
||||||
context = context or {}
|
context = context or {}
|
||||||
attachments = attachments or []
|
attachments = attachments or []
|
||||||
assert (not thread_id) or isinstance(thread_id, (int, long)) or \
|
assert (not thread_id) or isinstance(thread_id, (int, long)) or \
|
||||||
|
@ -635,7 +634,7 @@ class mail_thread(osv.AbstractModel):
|
||||||
if isinstance(thread_id, (list, tuple)):
|
if isinstance(thread_id, (list, tuple)):
|
||||||
thread_id = thread_id and thread_id[0]
|
thread_id = thread_id and thread_id[0]
|
||||||
|
|
||||||
attachment_ids = []
|
attachment_ids=[]
|
||||||
for name, content in attachments:
|
for name, content in attachments:
|
||||||
if isinstance(content, unicode):
|
if isinstance(content, unicode):
|
||||||
content = content.encode('utf-8')
|
content = content.encode('utf-8')
|
||||||
|
@ -679,6 +678,13 @@ class mail_thread(osv.AbstractModel):
|
||||||
'attachment_ids': attachment_ids,
|
'attachment_ids': attachment_ids,
|
||||||
'subtype_id': subtype_id,
|
'subtype_id': subtype_id,
|
||||||
})
|
})
|
||||||
|
|
||||||
|
# if the parent is private, the message must be private
|
||||||
|
if parent_id:
|
||||||
|
msg = messages.browse(cr, uid, parent_id, context=context)
|
||||||
|
if msg.is_private:
|
||||||
|
values["is_private"] = msg.is_private
|
||||||
|
|
||||||
# Avoid warnings about non-existing fields
|
# Avoid warnings about non-existing fields
|
||||||
for x in ('from', 'to', 'cc'):
|
for x in ('from', 'to', 'cc'):
|
||||||
values.pop(x, None)
|
values.pop(x, None)
|
||||||
|
@ -691,10 +697,23 @@ class mail_thread(osv.AbstractModel):
|
||||||
|
|
||||||
def message_post_api(self, cr, uid, thread_id, body='', subject=False, type='notification',
|
def message_post_api(self, cr, uid, thread_id, body='', subject=False, type='notification',
|
||||||
subtype=None, parent_id=False, attachments=None, context=None, **kwargs):
|
subtype=None, parent_id=False, attachments=None, context=None, **kwargs):
|
||||||
added_message_id = self.message_post(cr, uid, thread_id=thread_id, body=body, subject=subject, type=type,
|
# if the user write on his wall
|
||||||
subtype=subtype, parent_id=parent_id, attachments=attachments, context=context)
|
if self._name=='res.partner' and not thread_id:
|
||||||
added_message = self.pool.get('mail.message').message_read(cr, uid, [added_message_id])
|
user = self.pool.get('res.users').browse(cr, uid, uid, context=context)
|
||||||
|
thread_id = user.partner_id.id
|
||||||
|
|
||||||
|
added_message_id = self.message_post(cr, uid, thread_id=thread_id, body=body, subject=subject, type=type,
|
||||||
|
subtype=subtype, parent_id=parent_id, context=context)
|
||||||
|
|
||||||
|
attachment_ids=[]
|
||||||
|
if attachments:
|
||||||
|
ir_attachment = self.pool.get('ir.attachment')
|
||||||
|
attachment_ids = ir_attachment.search(cr, 1, [('res_model', '=', ""), ('res_id', '=', ""), ('user_id', '=', uid), ('id', 'in', attachments)], context=context)
|
||||||
|
if attachment_ids:
|
||||||
|
self.pool.get('ir.attachment').write(cr, 1, attachment_ids, { 'res_model': self._name, 'res_id': thread_id }, context=context)
|
||||||
|
self.pool.get('mail.message').write(cr, 1, [added_message_id], {'attachment_ids': [(6, 0, [pid for pid in attachment_ids])]} )
|
||||||
|
|
||||||
|
added_message = self.pool.get('mail.message').message_read(cr, uid, [added_message_id])
|
||||||
return added_message
|
return added_message
|
||||||
|
|
||||||
def get_message_subtypes(self, cr, uid, ids, context=None):
|
def get_message_subtypes(self, cr, uid, ids, context=None):
|
||||||
|
|
|
@ -20,13 +20,13 @@
|
||||||
</record>
|
</record>
|
||||||
<record id="mail_archivesfeeds" model="ir.ui.menu">
|
<record id="mail_archivesfeeds" model="ir.ui.menu">
|
||||||
<field name="name">Archives</field>
|
<field name="name">Archives</field>
|
||||||
<field name="sequence" eval="11"/>
|
<field name="sequence" eval="12"/>
|
||||||
<field name="action" ref="action_mail_archives_feeds"/>
|
<field name="action" ref="action_mail_archives_feeds"/>
|
||||||
<field name="parent_id" ref="mail_feeds"/>
|
<field name="parent_id" ref="mail_feeds"/>
|
||||||
</record>
|
</record>
|
||||||
<record id="mail_sentfeeds" model="ir.ui.menu">
|
<record id="mail_sentfeeds" model="ir.ui.menu">
|
||||||
<field name="name">Sent</field>
|
<field name="name">Sent</field>
|
||||||
<field name="sequence" eval="12"/>
|
<field name="sequence" eval="13"/>
|
||||||
<field name="action" ref="action_mail_sent_feeds"/>
|
<field name="action" ref="action_mail_sent_feeds"/>
|
||||||
<field name="parent_id" ref="mail_feeds"/>
|
<field name="parent_id" ref="mail_feeds"/>
|
||||||
</record>
|
</record>
|
||||||
|
|
|
@ -82,9 +82,13 @@
|
||||||
overflow: auto;
|
overflow: auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.openerp .oe_mail_record_wall {
|
||||||
|
margin: auto;
|
||||||
|
width: 560px;
|
||||||
|
}
|
||||||
|
|
||||||
.openerp .oe_mail_record_wall > .oe_mail_wall_threads {
|
.openerp .oe_mail_record_wall > .oe_mail_wall_threads {
|
||||||
float: left;
|
float: left;
|
||||||
width: 560px;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.openerp div.oe_mail_recthread_aside {
|
.openerp div.oe_mail_recthread_aside {
|
||||||
|
@ -145,6 +149,10 @@
|
||||||
z-index: 5;
|
z-index: 5;
|
||||||
}
|
}
|
||||||
.openerp .oe_mouse_subtypes .oe_recthread_subtypes {
|
.openerp .oe_mouse_subtypes .oe_recthread_subtypes {
|
||||||
|
background: #fff;
|
||||||
|
padding: 2px;
|
||||||
|
border: 1px solid #aaaaaa;
|
||||||
|
border-top: 0px;
|
||||||
position: absolute;
|
position: absolute;
|
||||||
z-index: 2;
|
z-index: 2;
|
||||||
}
|
}
|
||||||
|
@ -160,7 +168,6 @@
|
||||||
/* ------------------------------------------------------------ */
|
/* ------------------------------------------------------------ */
|
||||||
|
|
||||||
.openerp div.oe_mail_thread_action {
|
.openerp div.oe_mail_thread_action {
|
||||||
display: none;
|
|
||||||
white-space: normal;
|
white-space: normal;
|
||||||
padding: 8px;
|
padding: 8px;
|
||||||
z-index:5;
|
z-index:5;
|
||||||
|
@ -173,16 +180,6 @@
|
||||||
clear: both;
|
clear: both;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* default textarea (oe_mail_compose_textarea), and body textarea for compose form view */
|
|
||||||
.openerp .oe_mail_msg_content textarea.oe_mail_compose_textarea,
|
|
||||||
.openerp .oe_mail_msg_content div.oe_mail_compose_message_body textarea {
|
|
||||||
width: 474px;
|
|
||||||
height: 60px;
|
|
||||||
padding: 4px;
|
|
||||||
font-size: 12px;
|
|
||||||
border: 1px solid #cccccc;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* default textarea (oe_mail_compose_textarea), and body textarea for compose form view */
|
/* default textarea (oe_mail_compose_textarea), and body textarea for compose form view */
|
||||||
.openerp .oe_mail_msg_content textarea.oe_mail_compose_textarea:focus,
|
.openerp .oe_mail_msg_content textarea.oe_mail_compose_textarea:focus,
|
||||||
.openerp .oe_mail_msg_content div.oe_mail_compose_message_body textarea:focus {
|
.openerp .oe_mail_msg_content div.oe_mail_compose_message_body textarea:focus {
|
||||||
|
@ -206,6 +203,10 @@
|
||||||
margin-left: 66px;
|
margin-left: 66px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.openerp li.oe_mail_thread_msg {
|
||||||
|
width: 560px;
|
||||||
|
}
|
||||||
|
|
||||||
.openerp div.oe_thread_placeholder li.oe_mail_thread_msg:last-child {
|
.openerp div.oe_thread_placeholder li.oe_mail_thread_msg:last-child {
|
||||||
margin-bottom: 8px;
|
margin-bottom: 8px;
|
||||||
}
|
}
|
||||||
|
@ -223,13 +224,18 @@
|
||||||
|
|
||||||
.openerp li.oe_mail_thread_msg.oe_mail_read,
|
.openerp li.oe_mail_thread_msg.oe_mail_read,
|
||||||
.openerp li.oe_mail_thread_msg.oe_mail_read div {
|
.openerp li.oe_mail_thread_msg.oe_mail_read div {
|
||||||
background-color: #F0F0F0;
|
border-left: #F0F0F0;
|
||||||
}
|
}
|
||||||
.openerp li.oe_mail_thread_msg.oe_mail_read li.oe_mail_thread_msg.oe_mail_unread,
|
.openerp li.oe_mail_thread_msg.oe_mail_read li.oe_mail_thread_msg.oe_mail_unread,
|
||||||
.openerp li.oe_mail_thread_msg.oe_mail_read li.oe_mail_thread_msg.oe_mail_unread div {
|
.openerp li.oe_mail_thread_msg.oe_mail_read li.oe_mail_thread_msg.oe_mail_unread div {
|
||||||
background-color: #F6F6F6;
|
background-color: #F6F6F6;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.openerp li.oe_mail_thread_msg.oe_mail_unread>div>ul>li.oe_unread,
|
||||||
|
.openerp li.oe_mail_thread_msg.oe_mail_read>div>ul>li.oe_read {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
.openerp li.oe_mail_thread_msg > div:after {
|
.openerp li.oe_mail_thread_msg > div:after {
|
||||||
content: "";
|
content: "";
|
||||||
display: block;
|
display: block;
|
||||||
|
@ -247,7 +253,7 @@
|
||||||
.openerp .oe_mail_msg_email {
|
.openerp .oe_mail_msg_email {
|
||||||
padding: 8px;
|
padding: 8px;
|
||||||
background: white;
|
background: white;
|
||||||
border-top: 1px solid #ebebeb;
|
position: relative;
|
||||||
}
|
}
|
||||||
|
|
||||||
.openerp .oe_mail_msg_notification:after,
|
.openerp .oe_mail_msg_notification:after,
|
||||||
|
@ -259,7 +265,7 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
.openerp div.oe_mail_msg_content {
|
.openerp div.oe_mail_msg_content {
|
||||||
float: right;
|
float: left;
|
||||||
position: relative;
|
position: relative;
|
||||||
width: 486px;
|
width: 486px;
|
||||||
}
|
}
|
||||||
|
@ -309,76 +315,6 @@
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ------------------------------------------------------------ */
|
|
||||||
/* mail.compose.message form view & OpenERP hacks
|
|
||||||
/* ------------------------------------------------------------ */
|
|
||||||
|
|
||||||
/* form_view: delete white background */
|
|
||||||
.openerp .oe_mail_msg_content div.oe_formview {
|
|
||||||
background-color: transparent;
|
|
||||||
}
|
|
||||||
|
|
||||||
.openerp .oe_mail_msg_content div.oe_form_nosheet {
|
|
||||||
margin: 0px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.openerp .oe_mail_msg_content table.oe_form_group {
|
|
||||||
margin: 0px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.openerp .oe_mail_msg_content table.oe_form_field,
|
|
||||||
.openerp .oe_mail_msg_content div.oe_form_field {
|
|
||||||
padding: 0px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.openerp .oe_mail_msg_content td.oe_form_group_cell {
|
|
||||||
vertical-align: bottom;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* subject: change width */
|
|
||||||
.openerp .oe_mail_msg_content .oe_form .oe_form_field input {
|
|
||||||
width: 472px;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* body_html: cleditor */
|
|
||||||
.openerp .oe_mail_msg_content div.cleditorMain {
|
|
||||||
border: 1px solid #cccccc;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* destination_partner_ids */
|
|
||||||
.openerp .oe_mail_msg_content div.text-core {
|
|
||||||
height: 22px !important;
|
|
||||||
width: 472px;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* buttons */
|
|
||||||
.openerp .oe_mail_msg_content .oe_mail_compose_message_icons button.oe_form_button {
|
|
||||||
padding: 1px;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* attachment button: override of openerp values */
|
|
||||||
.openerp .oe_mail_msg_content .oe_mail_compose_message_icons div.oe_hidden_input_file {
|
|
||||||
display: inline-block;
|
|
||||||
width: 24px;
|
|
||||||
height: 24px;
|
|
||||||
margin: 2px;
|
|
||||||
}
|
|
||||||
.openerp .oe_mail_msg_content .oe_mail_compose_message_icons div.oe_hidden_input_file button {
|
|
||||||
margin: 0px;
|
|
||||||
}
|
|
||||||
.openerp .oe_mail_msg_content .oe_mail_compose_message_icons input.oe_form_binary_file {
|
|
||||||
bottom: 0px;
|
|
||||||
top: auto;
|
|
||||||
left: auto;
|
|
||||||
right: 28px;
|
|
||||||
height: 26px;
|
|
||||||
width: 26px;
|
|
||||||
min-width: 22px;
|
|
||||||
font-size: 0px;
|
|
||||||
margin: 0px;
|
|
||||||
padding: 0px;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ------------------------------------------------------------ */
|
/* ------------------------------------------------------------ */
|
||||||
/* Messages layout
|
/* Messages layout
|
||||||
/* ------------------------------------------------------------ */
|
/* ------------------------------------------------------------ */
|
||||||
|
@ -413,39 +349,27 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Dropdown menu */
|
/* Dropdown menu */
|
||||||
/*.openerp .oe_mail_msg_content .oe_dropdown_toggle {
|
|
||||||
position: absolute;
|
|
||||||
top: 0px;
|
|
||||||
right: 3px;
|
|
||||||
}*/
|
|
||||||
|
|
||||||
.openerp .oe_mail .oe_semantic_html_override {
|
.openerp .oe_mail ul.oe_mail_thread_display ul.oe_mail_thread_display {
|
||||||
position: relative;
|
position: relative;
|
||||||
|
border-left: 1px #DDD dashed;
|
||||||
}
|
}
|
||||||
|
|
||||||
.openerp .oe_mail ul.oe_header {
|
.openerp .oe_mail ul.oe_header {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
right: 3px;
|
right: 3px;
|
||||||
top: -6px;
|
top: -6px;
|
||||||
display: none;
|
|
||||||
z-index: 10;
|
z-index: 10;
|
||||||
height: 18px;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.openerp .oe_mail ul.oe_header a {
|
.openerp .oe_mail ul.oe_header a {
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
.openerp .oe_mail .oe_semantic_html_override:hover > ul.oe_header {
|
|
||||||
display: block;
|
|
||||||
}
|
|
||||||
|
|
||||||
.openerp .oe_mail ul.oe_header>li {
|
.openerp .oe_mail ul.oe_header>li {
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
}
|
height: 20px;
|
||||||
|
text-align: right;
|
||||||
.openerp .oe_mail_msg_content .oe_dropdown_arrow:after {
|
|
||||||
border-top: 4px solid #404040;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Message footer */
|
/* Message footer */
|
||||||
|
@ -465,16 +389,36 @@
|
||||||
|
|
||||||
/* Attachments list */
|
/* Attachments list */
|
||||||
.openerp .oe_mail_msg_content ul.oe_mail_msg_attachments {
|
.openerp .oe_mail_msg_content ul.oe_mail_msg_attachments {
|
||||||
display: none;
|
|
||||||
width: 100%;
|
width: 100%;
|
||||||
border-top: 1px solid #CCC;
|
|
||||||
margin: .5em 0 0 0;
|
margin: .5em 0 0 0;
|
||||||
padding: .5em 0;
|
padding: .5em 0;
|
||||||
list-style-position: inside;
|
list-style-position: inside;
|
||||||
}
|
}
|
||||||
|
.openerp .oe_mail_msg_content ul.oe_mail_msg_attachments.oe_hidden {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
.openerp .oe_mail_msg_content ul.oe_mail_msg_attachments li {
|
.openerp .oe_mail_msg_content ul.oe_mail_msg_attachments li {
|
||||||
float: none;
|
float: none;
|
||||||
|
height: 20px;
|
||||||
|
line-height: 20px;
|
||||||
margin: 0;
|
margin: 0;
|
||||||
padding: 0;
|
padding: 0;
|
||||||
list-style-type: square;
|
list-style-type: square;
|
||||||
}
|
}
|
||||||
|
.openerp .oe_mail_msg_content ul.oe_mail_msg_attachments .oe_upload_in_process {
|
||||||
|
float: right;
|
||||||
|
width: 200px;
|
||||||
|
height: 16px;
|
||||||
|
}
|
||||||
|
.openerp .oe_mail_msg_content ul.oe_mail_msg_attachments .oe_upload_in_process div {
|
||||||
|
float: left;
|
||||||
|
width: 38px;
|
||||||
|
height: 16px;
|
||||||
|
margin-right: 2px;
|
||||||
|
background: #66FF66;
|
||||||
|
}
|
||||||
|
.openerp .oe_mail_msg_content ul.oe_mail_msg_attachments .oe_upload_in_process span {
|
||||||
|
color: #aaaaaa;
|
||||||
|
position: absolute;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,12 +1,166 @@
|
||||||
/* ------------------------------ */
|
/* ------------------------------ */
|
||||||
/* Compose Message Wizard Form */
|
/* Compose Message */
|
||||||
/* ------------------------------ */
|
/* ------------------------------ */
|
||||||
|
|
||||||
.openerp .oe_mail_compose_message_icons {
|
.openerp .oe_mail_msg_content .oe_mail_compose_message_footer {
|
||||||
text-align: right;
|
height: 24px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.openerp .oe_mail_compose_message_icons img {
|
.openerp .oe_mail_msg_content .oe_mail_compose_message_footer button.oe_mail_compose_message_button_send {
|
||||||
width: 20px;
|
float: left;
|
||||||
height: 20px;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.openerp .oe_mail .oe_mail_compose_textarea
|
||||||
|
{
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.openerp .oe_mail .oe_mail_compose_textarea .oe_mail_post_header,
|
||||||
|
.openerp .oe_mail .oe_mail_compose_textarea .oe_mail_post_footer,
|
||||||
|
{
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
|
||||||
|
.openerp .oe_mail .oe_mail_compose_textarea a.oe_cancel {
|
||||||
|
position: absolute;
|
||||||
|
right: -8px;
|
||||||
|
top: -8px;
|
||||||
|
}
|
||||||
|
.openerp .oe_mail .oe_mail_compose_textarea a.oe_cancel:first-of-type {
|
||||||
|
display:none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.openerp .oe_mail .oe_mail_compose_textarea button.oe_full {
|
||||||
|
float: right;
|
||||||
|
position: relative;
|
||||||
|
right: -10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ------------------------------------------------------------ */
|
||||||
|
/* mail.compose.message : list_recipients
|
||||||
|
/* ------------------------------------------------------------ */
|
||||||
|
|
||||||
|
.openerp .oe_mail .oe_mail_list_recipients {
|
||||||
|
display: inline;
|
||||||
|
}
|
||||||
|
.openerp .oe_mail .oe_mail_list_recipients .oe_all_follower {
|
||||||
|
color: blue;
|
||||||
|
}
|
||||||
|
.openerp .oe_mail .oe_mail_list_recipients .oe_partner_follower a {
|
||||||
|
color: red;
|
||||||
|
}
|
||||||
|
.openerp .oe_mail .oe_mail_list_recipients .oe_hidden,
|
||||||
|
.openerp .oe_mail .oe_mail_list_recipients .oe_more_hidden {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ------------------------------------------------------------ */
|
||||||
|
/* mail.compose.message : attachment
|
||||||
|
/* ------------------------------------------------------------ */
|
||||||
|
|
||||||
|
.openerp .oe_mail .oe_attachment_file {
|
||||||
|
display: inline-block;
|
||||||
|
}
|
||||||
|
|
||||||
|
.openerp .oe_mail .oe_attachment_file .oe_add {
|
||||||
|
float: left;
|
||||||
|
width: 24px;
|
||||||
|
height: 24px;
|
||||||
|
position: relative;
|
||||||
|
z-index: 10;
|
||||||
|
left: +2px;
|
||||||
|
top: +7px;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* attachment button: override of openerp values */
|
||||||
|
.openerp .oe_mail .oe_attachment_file .oe_add button,
|
||||||
|
.openerp .oe_mail .oe_attachment_file .oe_add input.oe_insert_file {
|
||||||
|
position: absolute;
|
||||||
|
bottom: +0px;
|
||||||
|
left: +0px;
|
||||||
|
height: 24px;
|
||||||
|
width: 24px;
|
||||||
|
margin: 0px;
|
||||||
|
padding: 0px;
|
||||||
|
}
|
||||||
|
.openerp .oe_mail .oe_attachment_file .oe_add input.oe_insert_file {
|
||||||
|
z-index:2;
|
||||||
|
width: 300px;
|
||||||
|
left: -100px;
|
||||||
|
background: transparent;
|
||||||
|
border: 0;
|
||||||
|
color: transparent;
|
||||||
|
}
|
||||||
|
.openerp .oe_mail .oe_attachment_file .oe_add button span {
|
||||||
|
position: relative;
|
||||||
|
bottom: +4px;
|
||||||
|
font-size: 30px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.openerp .oe_mail .oe_mail_msg_attachments input {
|
||||||
|
visibility: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
.openerp .oe_mail .oe_mail_compose_attachment_list {
|
||||||
|
clear: both;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ------------------------------------------------------------ */
|
||||||
|
/* mail.compose.message
|
||||||
|
/* ------------------------------------------------------------ */
|
||||||
|
|
||||||
|
|
||||||
|
/* default textarea (oe_mail_compose_textarea), and body textarea for compose form view */
|
||||||
|
.openerp .oe_mail.oe_semantic_html_override .oe_mail_compose_textarea textarea.field_text,
|
||||||
|
.openerp .oe_mail div.oe_mail_compose_message_body textarea.field_text {
|
||||||
|
width: 100%;
|
||||||
|
min-height: 120px;
|
||||||
|
height: auto;
|
||||||
|
padding: 4px;
|
||||||
|
font-size: 12px;
|
||||||
|
border: 1px solid #cccccc;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* not top textarea */
|
||||||
|
.openerp .oe_mail.oe_semantic_html_override .oe_semantic_html_override .oe_mail_compose_textarea textarea.field_text {
|
||||||
|
height: 60px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* form_view: delete white background */
|
||||||
|
.openerp .oe_mail_msg_content div.oe_formview {
|
||||||
|
background-color: transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
.openerp .oe_mail_msg_content div.oe_form_nosheet {
|
||||||
|
margin: 0px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.openerp .oe_mail_msg_content table.oe_form_group {
|
||||||
|
margin: 0px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.openerp .oe_mail_msg_content table.oe_form_field,
|
||||||
|
.openerp .oe_mail_msg_content div.oe_form_field {
|
||||||
|
padding: 0px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.openerp .oe_mail_msg_content td.oe_form_group_cell {
|
||||||
|
vertical-align: bottom;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* subject: change width */
|
||||||
|
.openerp .oe_mail_msg_content .oe_form .oe_form_field input[type='text'] {
|
||||||
|
width: 472px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* body_html: cleditor */
|
||||||
|
.openerp .oe_mail_msg_content div.cleditorMain {
|
||||||
|
border: 1px solid #cccccc;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* destination_partner_ids */
|
||||||
|
.openerp .oe_mail_msg_content div.text-core {
|
||||||
|
height: 22px !important;
|
||||||
|
width: 472px;
|
||||||
|
}
|
File diff suppressed because it is too large
Load Diff
|
@ -40,6 +40,7 @@ openerp_mail_followers = function(session, mail) {
|
||||||
this._check_visibility();
|
this._check_visibility();
|
||||||
this.reinit();
|
this.reinit();
|
||||||
this.bind_events();
|
this.bind_events();
|
||||||
|
this.display_subtypes();
|
||||||
},
|
},
|
||||||
|
|
||||||
_check_visibility: function() {
|
_check_visibility: function() {
|
||||||
|
@ -53,31 +54,15 @@ openerp_mail_followers = function(session, mail) {
|
||||||
|
|
||||||
bind_events: function() {
|
bind_events: function() {
|
||||||
var self = this;
|
var self = this;
|
||||||
this.$('div.oe_mouse_subtypes')
|
|
||||||
.on('mouseover', function () {
|
|
||||||
$(this).removeClass('oe_mouseout').addClass('oe_mouseover');
|
|
||||||
self.display_subtypes();
|
|
||||||
})
|
|
||||||
.on('mouseleave', function () {
|
|
||||||
$(this).removeClass('oe_mouseover').addClass('oe_mouseout');
|
|
||||||
self.display_subtypes();
|
|
||||||
});
|
|
||||||
|
|
||||||
this.$('button.oe_follower')
|
this.$('button.oe_follower')
|
||||||
.on('click', function () {
|
.on('click', function () {
|
||||||
if($(this).hasClass('oe_notfollow'))
|
if($(this).hasClass('oe_notfollow'))
|
||||||
self.do_follow();
|
self.do_follow();
|
||||||
else
|
else
|
||||||
self.do_unfollow();
|
self.do_unfollow();
|
||||||
})
|
|
||||||
.on('mouseover', function () {
|
|
||||||
$(this).removeClass('oe_mouseout').addClass('oe_mouseover');
|
|
||||||
})
|
|
||||||
.on('mouseleave', function () {
|
|
||||||
$(this).removeClass('oe_mouseover').addClass('oe_mouseout');
|
|
||||||
});
|
});
|
||||||
|
|
||||||
this.$el.on('click', 'ul.oe_subtypes input', function () { self.do_update_subscription(); })
|
this.$el.on('click', 'ul.oe_subtypes input', self.do_update_subscription );
|
||||||
|
|
||||||
this.$el.on('click', 'button.oe_invite', function(event) {
|
this.$el.on('click', 'button.oe_invite', function(event) {
|
||||||
action = {
|
action = {
|
||||||
|
@ -173,7 +158,8 @@ openerp_mail_followers = function(session, mail) {
|
||||||
|
|
||||||
set_subtypes:function(data){
|
set_subtypes:function(data){
|
||||||
var self = this;
|
var self = this;
|
||||||
var records = data[this.view.datarecord.id].message_subtype_data;
|
var records = (data[this.view.datarecord.id] || data[null]).message_subtype_data;
|
||||||
|
|
||||||
_(records).each(function (record, record_name) {
|
_(records).each(function (record, record_name) {
|
||||||
record.name = record_name;
|
record.name = record_name;
|
||||||
record.followed = record.followed || undefined;
|
record.followed = record.followed || undefined;
|
||||||
|
@ -194,16 +180,10 @@ openerp_mail_followers = function(session, mail) {
|
||||||
},
|
},
|
||||||
|
|
||||||
do_follow: function () {
|
do_follow: function () {
|
||||||
var self =this;
|
|
||||||
_(this.$('.oe_msg_subtype_check')).each(function(record){
|
_(this.$('.oe_msg_subtype_check')).each(function(record){
|
||||||
$(record).attr('checked','checked');
|
$(record).attr('checked','checked');
|
||||||
});
|
});
|
||||||
var context = new session.web.CompoundContext(this.build_context(), {});
|
this.do_update_subscription();
|
||||||
return this.ds_model.call('message_subscribe_users', [[this.view.datarecord.id], undefined, undefined, context]).pipe(function(value_){
|
|
||||||
self.read_value(value_);
|
|
||||||
if(!self.$('.oe_recthread_subtypes').is(":visible"))
|
|
||||||
self.display_subtypes(true);
|
|
||||||
});
|
|
||||||
},
|
},
|
||||||
|
|
||||||
do_unfollow: function () {
|
do_unfollow: function () {
|
||||||
|
@ -211,23 +191,28 @@ openerp_mail_followers = function(session, mail) {
|
||||||
$(record).attr('checked',false);
|
$(record).attr('checked',false);
|
||||||
});
|
});
|
||||||
var context = new session.web.CompoundContext(this.build_context(), {});
|
var context = new session.web.CompoundContext(this.build_context(), {});
|
||||||
return this.ds_model.call('message_unsubscribe_users', [[this.view.datarecord.id], undefined, context]).pipe(this.proxy('read_value'));
|
return this.ds_model.call('message_unsubscribe_users', [[this.view.datarecord.id], [this.session.uid], context]).pipe(this.proxy('read_value'));
|
||||||
},
|
},
|
||||||
|
|
||||||
do_update_subscription: function () {
|
do_update_subscription: function (event) {
|
||||||
var context = new session.web.CompoundContext(this.build_context(), {});
|
|
||||||
var self = this;
|
var self = this;
|
||||||
|
|
||||||
var checklist = new Array();
|
var checklist = new Array();
|
||||||
_(this.$('.oe_msg_subtype_check')).each(function(record){
|
_(this.$('.oe_mail_recthread_actions input[type="checkbox"]')).each(function(record){
|
||||||
if($(record).is(':checked')) {
|
if($(record).is(':checked')) {
|
||||||
checklist.push(parseInt($(record).data('id')))}
|
checklist.push(parseInt($(record).data('id')))}
|
||||||
});
|
});
|
||||||
|
|
||||||
if(!checklist.length)
|
if(!checklist.length)
|
||||||
return this.do_unfollow();
|
return this.do_unfollow();
|
||||||
else
|
else{
|
||||||
return this.ds_model.call('message_subscribe_users',[[self.view.datarecord.id], undefined, checklist, context]).pipe(this.proxy('read_value'));
|
var context = new session.web.CompoundContext(this.build_context(), {});
|
||||||
|
return this.ds_model.call('message_subscribe_users', [[this.view.datarecord.id], [this.session.uid], undefined, context]).pipe(function(value_){
|
||||||
|
self.read_value(value_);
|
||||||
|
self.display_subtypes(true);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
},
|
},
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
|
@ -1,11 +1,118 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<template>
|
<template>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
mail.compose_message template
|
||||||
|
This template holds the composition form to write a note or send
|
||||||
|
an e-mail. It contains by default a textarea, that will be replaced
|
||||||
|
by another composition form in the main wall composition form, or
|
||||||
|
for main thread composition form in document form view.
|
||||||
|
-->
|
||||||
|
<t t-name="mail.compose_message">
|
||||||
|
<div class="oe_mail_compose_textarea">
|
||||||
|
<img class="oe_mail_icon oe_mail_frame oe_left" alt="User img"/>
|
||||||
|
<div class="oe_mail_msg_content">
|
||||||
|
<!-- contains the composition form -->
|
||||||
|
<!-- default content: old basic textarea -->
|
||||||
|
<div class="oe_mail_post_header">
|
||||||
|
<t t-call="mail.thread.list_recipients"/>
|
||||||
|
<a class="oe_cancel oe_e">X</a>
|
||||||
|
</div>
|
||||||
|
<textarea class="field_text" placeholder="Add your comment here..."/>
|
||||||
|
<div class="oe_mail_post_footer">
|
||||||
|
<div class="oe_mail_compose_attachment_list"/>
|
||||||
|
<button class="oe_full">Full mail message</button>
|
||||||
|
<button class="oe_post">Post message</button>
|
||||||
|
<t t-call="mail.compose_message.add_attachment"/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="oe_clear"/>
|
||||||
|
</div>
|
||||||
|
</t>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
mail.compose_message.add_attachment template
|
||||||
|
Small template to be inserted in the composition for add attachments
|
||||||
|
-->
|
||||||
|
<t t-name="mail.compose_message.add_attachment">
|
||||||
|
<div class="oe_attachment_file">
|
||||||
|
<div class="oe_add">
|
||||||
|
<!-- uploader of file -->
|
||||||
|
<button><span class="oe_e">p</span></button>
|
||||||
|
<t t-call="HiddenInputFile">
|
||||||
|
<t t-set="fileupload_id" t-value="widget.fileupload_id"/>
|
||||||
|
<t t-set="fileupload_action">/web/binary/upload_attachment</t>
|
||||||
|
<input type="hidden" name="model" value=""/>
|
||||||
|
<input type="hidden" name="id" value="0"/>
|
||||||
|
<input type="hidden" name="session_id" t-att-value="widget.session.session_id"/>
|
||||||
|
</t>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</t>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
mail.thread.message.attachments template
|
||||||
|
Template used to display attachments in a mail.message
|
||||||
|
-->
|
||||||
|
<t t-name="mail.thread.message.attachments">
|
||||||
|
<ul t-attf-class="oe_mail_msg_attachments #{widget.attachment_ids[0] and widget.options.thread.show_attachment_link?'':'oe_hidden'}">
|
||||||
|
<t t-foreach="widget.attachment_ids" t-as="attachment">
|
||||||
|
<li>
|
||||||
|
<span t-if="(attachment.upload or attachment.percent_loaded<100)" t-attf-title="{(attachment.name || attachment.filename) + (attachment.date?' \n('+attachment.date+')':'' )}" t-attf-name="{attachment.name || attachment.filename}">
|
||||||
|
<div class="oe_upload_in_process">
|
||||||
|
<span>Upload in progress...</span>
|
||||||
|
<div t-attf-style="{attachment.percent_loaded>0?'':'display:none;'}"/>
|
||||||
|
<div t-attf-style="{attachment.percent_loaded>20?'':'display:none;'}"/>
|
||||||
|
<div t-attf-style="{attachment.percent_loaded>40?'':'display:none;'}"/>
|
||||||
|
<div t-attf-style="{attachment.percent_loaded>60?'':'display:none;'}"/>
|
||||||
|
<div t-attf-style="{attachment.percent_loaded>80?'':'display:none;'}"/>
|
||||||
|
</div>
|
||||||
|
<t t-raw="attachment.name || attachment.filename"/>
|
||||||
|
</span>
|
||||||
|
<a t-if="(!attachment.upload or attachment.percent_loaded>=100)" t-att-href="attachment.url" t-attf-title="{(attachment.name || attachment.filename) + (attachment.date?' \n('+attachment.date+')':'' )}">
|
||||||
|
<t t-raw="attachment.name || attachment.filename"/>
|
||||||
|
</a>
|
||||||
|
<t t-if="widget.options.thread.show_attachment_delete and (!attachment.upload or attachment.percent_loaded>=100)">
|
||||||
|
<a class="oe_right oe_mail_attachment_delete" title="Delete this attachment" t-attf-data-id="{attachment.id}">x</a>
|
||||||
|
</t>
|
||||||
|
|
||||||
|
</li>
|
||||||
|
</t>
|
||||||
|
</ul>
|
||||||
|
</t>
|
||||||
|
|
||||||
|
<t t-name="mail.thread.message.private">
|
||||||
|
<div>
|
||||||
|
<span class="oe_placeholder_checkbox_private"/>
|
||||||
|
<span class="oe_send_private">This email is private.</span>
|
||||||
|
<span class="oe_send_public">I wrote for contacts and all my followers.</span>
|
||||||
|
</div>
|
||||||
|
</t>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
template to the recipients list
|
||||||
|
-->
|
||||||
|
<t t-name="mail.thread.list_recipients">
|
||||||
|
<div class="oe_mail_list_recipients">
|
||||||
|
Post to:
|
||||||
|
<span t-if="!widget.is_private" class="oe_all_follower">All Followers</span>
|
||||||
|
<t t-if="!widget.is_private and widget.partner_ids.length"> and </t>
|
||||||
|
<t t-set="inc" t-value="0"/>
|
||||||
|
<t t-if="widget.partner_ids.length" t-foreach="widget.partner_ids" t-as="partner"><span t-attf-class="oe_partner_follower #{inc>=3?'oe_hidden':''}"><t t-if="inc" t-raw="', '"/><a t-attf-href="#model=res.partner&id=#{partner[0]}"><t t-raw="partner[1]"/></a></span><t t-set="inc" t-value="inc+1"/>
|
||||||
|
</t>
|
||||||
|
<t t-if="widget.partner_ids.length>=3">
|
||||||
|
<span class="oe_more">, <a><t t-raw="widget.partner_ids.length-3"/> others...</a></span>
|
||||||
|
<a class="oe_more_hidden"><<<</a>
|
||||||
|
</t>
|
||||||
|
</div>
|
||||||
|
</t>
|
||||||
|
|
||||||
<!--
|
<!--
|
||||||
wall main template
|
wall main template
|
||||||
Template used to display the communication history in the wall.
|
Template used to display the communication history in the wall.
|
||||||
-->
|
-->
|
||||||
<div t-name="mail.wall" class="oe_view_manager oe_mail_wall oe_view_manager_current">
|
<div t-name="mail.wall" class="oe_view_manager oe_mail_wall oe_view_manag
|
||||||
|
er_current">
|
||||||
<table class="oe_view_manager_header">
|
<table class="oe_view_manager_header">
|
||||||
<colgroup>
|
<colgroup>
|
||||||
<col width="33%"/>
|
<col width="33%"/>
|
||||||
|
@ -25,21 +132,30 @@
|
||||||
</td>
|
</td>
|
||||||
<td><div class="oe_view_manager_view_search" t-opentag="true"/></td>
|
<td><div class="oe_view_manager_view_search" t-opentag="true"/></td>
|
||||||
</tr>
|
</tr>
|
||||||
|
<tr class="oe_header_row">
|
||||||
|
<td colspan="2">
|
||||||
|
<button type="button" class="oe_write_full oe_highlight">
|
||||||
|
Compose a new message
|
||||||
|
</button>
|
||||||
|
<button type="button" class="oe_write_onwall" help="Your followers can read this message">
|
||||||
|
Write to your followers
|
||||||
|
</button>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
<ul class="oe_mail_wall_threads">
|
<!-- placeholder for the wall threads -->
|
||||||
<!-- contains threads -->
|
<div class="oe_mail_wall_threads"/>
|
||||||
</ul>
|
|
||||||
<div class="oe_mail_wall_aside">
|
<div class="oe_mail_wall_aside">
|
||||||
<!-- contains currently nothing -->
|
<!-- contains currently nothing -->
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!--
|
<!--
|
||||||
wall_thread_container template for the wall
|
display message on the wall when there are no message
|
||||||
Each discussion thread is contained inside this template
|
|
||||||
-->
|
-->
|
||||||
<li t-name="mail.wall_thread_container" class="oe_mail_wall_thread">
|
<li t-name="mail.wall_no_message" class="oe_wall_no_message">
|
||||||
|
You have no messages
|
||||||
</li>
|
</li>
|
||||||
|
|
||||||
<!--
|
<!--
|
||||||
|
@ -54,39 +170,6 @@
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!--
|
|
||||||
mail.compose_message template
|
|
||||||
This template holds the composition form to write a note or send
|
|
||||||
an e-mail. It contains by default a textarea, that will be replaced
|
|
||||||
by another composition form in the main wall composition form, or
|
|
||||||
for main thread composition form in document form view.
|
|
||||||
-->
|
|
||||||
<t t-name="mail.compose_message">
|
|
||||||
<div class="oe_mail_compose_textarea">
|
|
||||||
<img class="oe_mail_icon oe_mail_frame oe_left" alt="User img"/>
|
|
||||||
<div class="oe_mail_msg_content">
|
|
||||||
<!-- contains the composition form -->
|
|
||||||
<!-- default content: old basic textarea -->
|
|
||||||
<textarea placeholder="Add your comment here..."/>
|
|
||||||
</div>
|
|
||||||
<div class="oe_clear"/>
|
|
||||||
</div>
|
|
||||||
</t>
|
|
||||||
|
|
||||||
<!--
|
|
||||||
mail.compose_message.add_attachment template
|
|
||||||
Small template to be inserted in the composition form to add attachments
|
|
||||||
-->
|
|
||||||
<t t-name="mail.compose_message.add_attachment">
|
|
||||||
<t t-call="HiddenInputFile">
|
|
||||||
<t t-set="fileupload_id" t-value="widget.fileupload_id"/>
|
|
||||||
<t t-set="fileupload_action">/web/binary/upload_attachment</t>
|
|
||||||
<input type="hidden" name="model" t-att-value="widget.form_view.model"/>
|
|
||||||
<input type="hidden" name="id" t-att-value="widget.form_view.datarecord.id || 0"/>
|
|
||||||
<input type="hidden" name="session_id" t-att-value="widget.session.session_id"/>
|
|
||||||
</t>
|
|
||||||
</t>
|
|
||||||
|
|
||||||
<!--
|
<!--
|
||||||
thread template
|
thread template
|
||||||
This template holds a thread of comments. It begins with an actions
|
This template holds a thread of comments. It begins with an actions
|
||||||
|
@ -96,7 +179,6 @@
|
||||||
<div t-name="mail.thread" class="oe_mail oe_mail_thread oe_semantic_html_override">
|
<div t-name="mail.thread" class="oe_mail oe_mail_thread oe_semantic_html_override">
|
||||||
<div class="oe_mail_thread_action">
|
<div class="oe_mail_thread_action">
|
||||||
<!-- contains the composition box (form + image) -->
|
<!-- contains the composition box (form + image) -->
|
||||||
<t t-call="mail.compose_message"/>
|
|
||||||
</div>
|
</div>
|
||||||
<ul class="oe_mail_thread_display">
|
<ul class="oe_mail_thread_display">
|
||||||
<!-- contains the threads -->
|
<!-- contains the threads -->
|
||||||
|
@ -104,16 +186,15 @@
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- default layout -->
|
<!-- default layout -->
|
||||||
<li t-name="mail.thread.message" t-attf-class="oe_mail oe_mail_thread_msg #{widget.unread?'oe_mail_unread':'oe_mail_read'}" t-attf-data-msg_id="{widget.id}">
|
<li t-name="mail.thread.message" t-attf-class="oe_mail oe_mail_thread_msg #{widget.unread?'oe_mail_unread':'oe_mail_read'}">
|
||||||
<div t-attf-class="oe_mail_msg_#{widget.type} oe_semantic_html_override">
|
<div t-attf-class="oe_mail_msg_#{widget.type} oe_semantic_html_override">
|
||||||
<!-- message actions (read/unread, reply, delete...) -->
|
<!-- message actions (read/unread, reply, delete...) -->
|
||||||
<ul class="oe_header">
|
<ul class="oe_header">
|
||||||
<li class="placeholder-mail-vote"><t t-call="mail.thread.message.vote"/></li>
|
<li class="placeholder-mail-vote"><t t-call="mail.thread.message.vote"/></li>
|
||||||
<li t-if="!widget.options.thread.display_on_flat and widget.unread" title="Read"><a class="oe_read oe_e">W</a></li>
|
<li t-if="!widget.options.thread.display_on_flat" title="Read" class="oe_read"><a class="oe_read oe_e">W</a></li>
|
||||||
<li t-if="!widget.options.thread.display_on_flat and !widget.unread" title="Set back to unread"><a class="oe_unread oe_e">h</a></li>
|
<li t-if="!widget.options.thread.display_on_flat" title="Set back to unread" class="oe_unread"><a class="oe_unread oe_e">h</a></li>
|
||||||
<li t-if="!widget.options.message.show_reply_by_email" title="Reply"><a class="oe_reply oe_e">)</a></li>
|
<li title="Quick reply"><a class="oe_reply oe_e">)</a></li>
|
||||||
<li t-if="widget.options.message.show_reply_by_email"><a class="oe_reply_by_email oe_e" title="Reply by mail">)</a></li>
|
<t t-if="(widget.is_author and widget.options.message.show_dd_delete) or widget.type == 'email'">
|
||||||
<t t-if="(widget.options.message.show_reply || widget.options.message.show_reply_by_email || (widget.is_author and widget.options.message.show_dd_delete) || widget.type == 'email')">
|
|
||||||
<li>
|
<li>
|
||||||
<span class="oe_dropdown_toggle">
|
<span class="oe_dropdown_toggle">
|
||||||
<a class="oe_e" title="More options">í</a>
|
<a class="oe_e" title="More options">í</a>
|
||||||
|
@ -123,8 +204,6 @@
|
||||||
<li t-if="display['show_hide']">
|
<li t-if="display['show_hide']">
|
||||||
<a href="#" class="oe_mail_msg_hide_type" t-attf-data-subtype='{widget.subtype}'>Hide '<t t-esc="widget.subtype"/>' for this document</a>
|
<a href="#" class="oe_mail_msg_hide_type" t-attf-data-subtype='{widget.subtype}'>Hide '<t t-esc="widget.subtype"/>' for this document</a>
|
||||||
</li> -->
|
</li> -->
|
||||||
<li t-if="widget.options.message.show_reply" title="Reply"><a class="oe_reply oe_full_reply">Full reply</a></li>
|
|
||||||
<li t-if="widget.options.message.show_reply_by_email"><a class="oe_reply_by_email oe_full_reply" title="Reply by mail">Full reply</a></li>
|
|
||||||
<li t-if="widget.type == 'email'"><a class="oe_mail_msg_details" t-attf-href="#model=mail.message&id=#{widget.id}" >Details</a></li>
|
<li t-if="widget.type == 'email'"><a class="oe_mail_msg_details" t-attf-href="#model=mail.message&id=#{widget.id}" >Details</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</span>
|
</span>
|
||||||
|
@ -145,7 +224,6 @@
|
||||||
<ul class="oe_mail_msg_footer">
|
<ul class="oe_mail_msg_footer">
|
||||||
<li t-if="widget.author_id"><a t-attf-href="#model=res.partner&id=#{widget.author_id[0]}"><t t-raw="widget.author_id[1]"/></a></li>
|
<li t-if="widget.author_id"><a t-attf-href="#model=res.partner&id=#{widget.author_id[0]}"><t t-raw="widget.author_id[1]"/></a></li>
|
||||||
<li><span t-att-title="widget.date"><t t-raw="widget.timerelative"/></span></li>
|
<li><span t-att-title="widget.date"><t t-raw="widget.timerelative"/></span></li>
|
||||||
|
|
||||||
<li t-if="widget.attachment_ids.length > 0">
|
<li t-if="widget.attachment_ids.length > 0">
|
||||||
<a class="oe_mail_msg_view_attachments">
|
<a class="oe_mail_msg_view_attachments">
|
||||||
<t t-if="widget.attachment_ids.length == 1">1 Attachment</t>
|
<t t-if="widget.attachment_ids.length == 1">1 Attachment</t>
|
||||||
|
@ -155,7 +233,7 @@
|
||||||
</ul>
|
</ul>
|
||||||
<div class="oe_clear"/>
|
<div class="oe_clear"/>
|
||||||
<div class="oe_mail_msg_body">
|
<div class="oe_mail_msg_body">
|
||||||
<t t-if="widget.options.message.show_record_name and widget.record_name and (!widget.subject) and widget.options.thread._parents.length<=widget.options.thread.thread_level and widget.model!='res.partner'">
|
<t t-if="widget.options.message.show_record_name and widget.record_name and (!widget.subject) and !widget.options.thread.thread_level and !widget.options.thread.display_on_flat and widget.model!='res.partner'">
|
||||||
<a class="oe_mail_action_model" t-attf-href="#model=#{widget.model}&id=#{widget.res_id}"><t t-raw="widget.record_name"/></a>
|
<a class="oe_mail_action_model" t-attf-href="#model=#{widget.model}&id=#{widget.res_id}"><t t-raw="widget.record_name"/></a>
|
||||||
</t>
|
</t>
|
||||||
<t t-raw="widget.body"/>
|
<t t-raw="widget.body"/>
|
||||||
|
@ -171,7 +249,7 @@
|
||||||
</li>
|
</li>
|
||||||
|
|
||||||
<!-- expandable message layout -->
|
<!-- expandable message layout -->
|
||||||
<li t-name="mail.thread.expandable" t-attf-class="oe_mail oe_mail_thread_msg oe_mail_unread" t-attf-data-thread_id="{widget.id}">
|
<li t-name="mail.thread.expandable" class="oe_mail oe_mail_thread_msg oe_mail_unread">
|
||||||
<div t-attf-class="oe_mail_msg_#{widget.type} oe_semantic_html_override">
|
<div t-attf-class="oe_mail_msg_#{widget.type} oe_semantic_html_override">
|
||||||
<div class="oe_mail_msg_content oe_mail_msg_more_message">
|
<div class="oe_mail_msg_content oe_mail_msg_more_message">
|
||||||
<a class="oe_mail_fetch_more">Load more messages <span t-if="widget.nb_messages>0">(<t t-raw="widget.nb_messages"/> messages not display)</span>...</a>
|
<a class="oe_mail_fetch_more">Load more messages <span t-if="widget.nb_messages>0">(<t t-raw="widget.nb_messages"/> messages not display)</span>...</a>
|
||||||
|
@ -179,23 +257,6 @@
|
||||||
</div>
|
</div>
|
||||||
</li>
|
</li>
|
||||||
|
|
||||||
<!--
|
|
||||||
mail.thread.message.attachments template
|
|
||||||
Template used to display attachments in a mail.message
|
|
||||||
-->
|
|
||||||
<t t-name="mail.thread.message.attachments">
|
|
||||||
<ul class="oe_mail_msg_attachments">
|
|
||||||
<t t-foreach="record.attachment_ids" t-as="attachment">
|
|
||||||
<li>
|
|
||||||
<a t-att-href="attachment.url"><t t-raw="attachment.name || attachment.filename"/></a>
|
|
||||||
<t t-if="record.show_attachment_delete">
|
|
||||||
<a class="oe_right oe_mail_attachment_delete" title="Delete this attachmentt" t-attf-data-id="{attachment.id}">x</a>
|
|
||||||
</t>
|
|
||||||
</li>
|
|
||||||
</t>
|
|
||||||
</ul>
|
|
||||||
</t>
|
|
||||||
|
|
||||||
<!-- mail.thread.message.vote
|
<!-- mail.thread.message.vote
|
||||||
Template used to display Like/Unlike in a mail.message
|
Template used to display Like/Unlike in a mail.message
|
||||||
-->
|
-->
|
||||||
|
@ -215,7 +276,7 @@
|
||||||
<button t-attf-class="oe_mail_msg_vote oe_tag">
|
<button t-attf-class="oe_mail_msg_vote oe_tag">
|
||||||
<span>
|
<span>
|
||||||
<t t-if="!widget.has_voted">Agree</t>
|
<t t-if="!widget.has_voted">Agree</t>
|
||||||
<t t-if="widget.has_voted">Unagree</t>
|
<t t-if="widget.has_voted">Undo</t>
|
||||||
</span>
|
</span>
|
||||||
</button>
|
</button>
|
||||||
</span>
|
</span>
|
||||||
|
|
|
@ -13,9 +13,9 @@
|
||||||
<span class="oe_unfollow">Unfollow</span>
|
<span class="oe_unfollow">Unfollow</span>
|
||||||
<span class="oe_following">Following</span>
|
<span class="oe_following">Following</span>
|
||||||
</button>
|
</button>
|
||||||
<div class="oe_recthread_subtypes">
|
</div>
|
||||||
<ul class="oe_subtypes"></ul>
|
<div class="oe_recthread_subtypes">
|
||||||
</div>
|
<ul class="oe_subtypes"></ul>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="oe_grey">
|
<div class="oe_grey">
|
||||||
|
|
|
@ -529,109 +529,6 @@ class test_mail(TestMailMockups):
|
||||||
self.assertEqual(message2.subject, _subject, 'mail.message subject incorrect')
|
self.assertEqual(message2.subject, _subject, 'mail.message subject incorrect')
|
||||||
self.assertEqual(message2.body, group_bird.description, 'mail.message body incorrect')
|
self.assertEqual(message2.body, group_bird.description, 'mail.message body incorrect')
|
||||||
|
|
||||||
# FP Note: to be reviewed to be more generic, not depending on the algorythm of
|
|
||||||
# message_read
|
|
||||||
#def test_30_message_read(self):
|
|
||||||
# """ Tests designed for message_read. """
|
|
||||||
# # TDE NOTE: this test is not finished, as the message_read method is not fully specified.
|
|
||||||
# # It will be updated as soon as we have fixed specs !
|
|
||||||
# cr, uid = self.cr, self.uid
|
|
||||||
# group_pigs = self.mail_group.browse(cr, uid, self.group_pigs_id)
|
|
||||||
|
|
||||||
# def _compare_structures(struct1, struct2, n=0):
|
|
||||||
# # print '%scompare structure' % ('\t' * n)
|
|
||||||
# # self.assertEqual(len(struct1), len(struct2), 'message_read structure number of childs incorrect')
|
|
||||||
|
|
||||||
# for x in range(len(struct1)):
|
|
||||||
# if struct1[x].get('type') == 'expandable':
|
|
||||||
# continue
|
|
||||||
# # print '%s' % ('\t' * n), struct1[x]['id'], struct1[x]['child_nbr'], struct2[x]['id'], struct2[x].get('child_nbr', 'XX'), struct1[x].get('subject') or ''
|
|
||||||
# self.assertEqual(struct1[x]['id'], struct2[x]['id'], 'message_read failure %s' % struct1[x].get('subject'))
|
|
||||||
# _compare_structures(struct1[x]['child_ids'], struct2[x]['child_ids'], n + 1)
|
|
||||||
# # print '%send compare' % ('\t' * n)
|
|
||||||
|
|
||||||
# # ----------------------------------------
|
|
||||||
# # CASE1: Flattening test
|
|
||||||
# # ----------------------------------------
|
|
||||||
|
|
||||||
# # Create dummy message structure
|
|
||||||
# import copy
|
|
||||||
# tree = [{'id': 2, 'child_nbr': 1, 'child_ids': [
|
|
||||||
# {'id': 6, 'child_nbr': 1, 'child_ids': [
|
|
||||||
# {'id': 8, 'child_nbr': 0, 'child_ids': []},
|
|
||||||
# ]},
|
|
||||||
# ]},
|
|
||||||
# {'id': 1, 'child_nbr': 3, 'child_ids':[
|
|
||||||
# {'id': 7, 'child_nbr': 1, 'child_ids': [
|
|
||||||
# {'id': 9, 'child_nbr': 0, 'child_ids': []},
|
|
||||||
# ]},
|
|
||||||
# {'id': 4, 'child_nbr': 2, 'child_ids': [
|
|
||||||
# {'id': 10, 'child_nbr': 0, 'child_ids': []},
|
|
||||||
# {'id': 5, 'child_nbr': 0, 'child_ids': []},
|
|
||||||
# ]},
|
|
||||||
# {'id': 3, 'child_nbr': 0, 'child_ids': []},
|
|
||||||
# ]},
|
|
||||||
# ]
|
|
||||||
# # Test: completely flat
|
|
||||||
# new_tree = self.mail_message.message_read_tree_flatten(cr, uid, None, copy.deepcopy(tree), [('type', 'in', 'borderlands')], 0, limit=15, add_expandable=False)
|
|
||||||
# _compare_structures(new_tree, new_tree)
|
|
||||||
# self.assertEqual(len(new_tree), 10, 'message_read_tree_flatten wrong in flat')
|
|
||||||
# # Test: 1 thread level
|
|
||||||
# tree_test = [{'id': 2, 'child_ids': [
|
|
||||||
# {'id': 8, 'child_ids': []}, {'id': 6, 'child_ids': []},
|
|
||||||
# ]},
|
|
||||||
# {'id': 1, 'child_ids': [
|
|
||||||
# {'id': 10, 'child_ids': []}, {'id': 9, 'child_ids': []},
|
|
||||||
# {'id': 7, 'child_ids': []}, {'id': 5, 'child_ids': []},
|
|
||||||
# {'id': 4, 'child_ids': []}, {'id': 3, 'child_ids': []},
|
|
||||||
# ]},
|
|
||||||
# ]
|
|
||||||
# new_tree = self.mail_message.message_read_tree_flatten(cr, uid, None, copy.deepcopy(tree), [('type', 'in', 'borderlands')], 1, limit=15, add_expandable=False)
|
|
||||||
# _compare_structures(new_tree, tree_test)
|
|
||||||
# # Test: 2 thread levels
|
|
||||||
# new_tree = self.mail_message.message_read_tree_flatten(cr, uid, None, copy.deepcopy(tree), [('type', 'in', 'borderlands')], 2, limit=15, add_expandable=False)
|
|
||||||
# _compare_structures(new_tree, tree)
|
|
||||||
|
|
||||||
# # ----------------------------------------
|
|
||||||
# # CASE2: message_read test
|
|
||||||
# # ----------------------------------------
|
|
||||||
|
|
||||||
# # 1. Add a few messages to pigs group
|
|
||||||
# msgid1 = group_pigs.message_post(body='1', subject='1', parent_id=False)
|
|
||||||
# msgid2 = group_pigs.message_post(body='2', subject='1-1', parent_id=msgid1)
|
|
||||||
# msgid3 = group_pigs.message_post(body='3', subject='1-2', parent_id=msgid1)
|
|
||||||
# msgid4 = group_pigs.message_post(body='4', subject='2', parent_id=False)
|
|
||||||
# msgid5 = group_pigs.message_post(body='5', subject='1-1-1', parent_id=msgid2)
|
|
||||||
# msgid6 = group_pigs.message_post(body='6', subject='2-1', parent_id=msgid4)
|
|
||||||
|
|
||||||
# # Test: read all messages flat
|
|
||||||
# tree_test = [{'id': msgid6, 'child_ids': []}, {'id': msgid5, 'child_ids': []},
|
|
||||||
# {'id': msgid4, 'child_ids': []}, {'id': msgid3, 'child_ids': []},
|
|
||||||
# {'id': msgid2, 'child_ids': []}, {'id': msgid1, 'child_ids': []}]
|
|
||||||
# tree = self.mail_message.message_read(cr, uid, ids=False, domain=[('model', '=', 'mail.group'), ('res_id', '=', self.group_pigs_id)], level=0, limit=15)
|
|
||||||
# _compare_structures(tree, tree_test)
|
|
||||||
# # Test: read with 1 level of thread
|
|
||||||
# tree_test = [{'id': msgid4, 'child_ids': [{'id': msgid6, 'child_ids': []}, ]},
|
|
||||||
# {'id': msgid1, 'child_ids': [
|
|
||||||
# {'id': msgid5, 'child_ids': []}, {'id': msgid3, 'child_ids': []},
|
|
||||||
# {'id': msgid2, 'child_ids': []},
|
|
||||||
# ]},
|
|
||||||
# ]
|
|
||||||
# tree = self.mail_message.message_read(cr, uid, ids=False, domain=[('model', '=', 'mail.group'), ('res_id', '=', self.group_pigs_id)], level=1, limit=15)
|
|
||||||
# _compare_structures(tree, tree_test)
|
|
||||||
# # Test: read with 2 levels of thread
|
|
||||||
# tree_test = [{'id': msgid4, 'child_ids': [{'id': msgid6, 'child_ids': []}, ]},
|
|
||||||
# {'id': msgid1, 'child_ids': [
|
|
||||||
# {'id': msgid3, 'child_ids': []},
|
|
||||||
# {'id': msgid2, 'child_ids': [{'id': msgid5, 'child_ids': []}, ]},
|
|
||||||
# ]},
|
|
||||||
# ]
|
|
||||||
# tree = self.mail_message.message_read(cr, uid, ids=False, domain=[('model', '=', 'mail.group'), ('res_id', '=', self.group_pigs_id)], level=2, limit=15)
|
|
||||||
# _compare_structures(tree, tree_test)
|
|
||||||
|
|
||||||
# # 2. Test expandables
|
|
||||||
# # TDE FIXME: add those tests when expandables are specified and implemented
|
|
||||||
|
|
||||||
def test_40_needaction(self):
|
def test_40_needaction(self):
|
||||||
""" Tests for mail.message needaction. """
|
""" Tests for mail.message needaction. """
|
||||||
cr, uid = self.cr, self.uid
|
cr, uid = self.cr, self.uid
|
||||||
|
|
|
@ -223,7 +223,6 @@ class mail_compose_message(osv.TransientModel):
|
||||||
email(s), rendering any template patterns on the fly if needed. """
|
email(s), rendering any template patterns on the fly if needed. """
|
||||||
if context is None:
|
if context is None:
|
||||||
context = {}
|
context = {}
|
||||||
print '**', context
|
|
||||||
active_ids = context.get('active_ids')
|
active_ids = context.get('active_ids')
|
||||||
|
|
||||||
for wizard in self.browse(cr, uid, ids, context=context):
|
for wizard in self.browse(cr, uid, ids, context=context):
|
||||||
|
|
|
@ -16,13 +16,11 @@
|
||||||
<field name="partner_ids" widget="many2many_tags" placeholder="Add contacts to notify..."
|
<field name="partner_ids" widget="many2many_tags" placeholder="Add contacts to notify..."
|
||||||
context="{'force_email':True}"
|
context="{'force_email':True}"
|
||||||
on_change="onchange_partner_ids(partner_ids)"/>
|
on_change="onchange_partner_ids(partner_ids)"/>
|
||||||
|
<field name="is_private" help="If this message is not private, this message will send to all your followers or all followers of the parented message."/>
|
||||||
</group>
|
</group>
|
||||||
<notebook>
|
<notebook>
|
||||||
<page string="Body">
|
<page string="Body">
|
||||||
<field name="body_text" nolabel="1"
|
<field name="body" nolabel="1"/>
|
||||||
attrs="{'invisible':[('content_subtype', '=', 'html')]}"/>
|
|
||||||
<field name="body" nolabel="1"
|
|
||||||
attrs="{'invisible':[('content_subtype', '=', 'plain')]}"/>
|
|
||||||
</page>
|
</page>
|
||||||
<page string="Attachments">
|
<page string="Attachments">
|
||||||
<field name="attachment_ids" colspan="4" nolabel="1"/>
|
<field name="attachment_ids" colspan="4" nolabel="1"/>
|
||||||
|
@ -32,10 +30,10 @@
|
||||||
<button string="Send" name="send_mail" type="object" class="oe_highlight" />
|
<button string="Send" name="send_mail" type="object" class="oe_highlight" />
|
||||||
or
|
or
|
||||||
<button string="Cancel" class="oe_link" special="cancel" />
|
<button string="Cancel" class="oe_link" special="cancel" />
|
||||||
<div class="oe_right">
|
<!--div class="oe_right">
|
||||||
<button string="" name="toggle_content_subtype" type="object" icon="/mail/static/src/img/formatting.png"
|
<button string="" name="toggle_content_subtype" type="object" icon="/mail/static/src/img/formatting.png"
|
||||||
help="Toggle advanced formatting mode"/>
|
help="Toggle advanced formatting mode"/>
|
||||||
</div>
|
</div-->
|
||||||
</footer>
|
</footer>
|
||||||
</form>
|
</form>
|
||||||
</field>
|
</field>
|
||||||
|
@ -68,6 +66,7 @@
|
||||||
context="{'force_email':True}"
|
context="{'force_email':True}"
|
||||||
on_change="onchange_partner_ids(partner_ids)"
|
on_change="onchange_partner_ids(partner_ids)"
|
||||||
class="oe_mail_compose_message_partner_ids"/>
|
class="oe_mail_compose_message_partner_ids"/>
|
||||||
|
<!--field name="is_private" help="If this message is not private, this message will send to all your followers or all followers of the parented message."/-->
|
||||||
<field name="attachment_ids" colspan="2" nolabel="1" widget="many2many_tags"
|
<field name="attachment_ids" colspan="2" nolabel="1" widget="many2many_tags"
|
||||||
placeholder="Add attachments..." invisible="1"
|
placeholder="Add attachments..." invisible="1"
|
||||||
class="oe_mail_compose_message_attachment_ids"/>
|
class="oe_mail_compose_message_attachment_ids"/>
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
<field name="name">campaign.analysis.tree</field>
|
<field name="name">campaign.analysis.tree</field>
|
||||||
<field name="model">campaign.analysis</field>
|
<field name="model">campaign.analysis</field>
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<tree string="Marketing Reports">
|
<tree string="Marketing Reports" create="false">
|
||||||
<field name="year" invisible="1"/>
|
<field name="year" invisible="1"/>
|
||||||
<field name="month" invisible="1"/>
|
<field name="month" invisible="1"/>
|
||||||
<field name="day" invisible="1"/>
|
<field name="day" invisible="1"/>
|
||||||
|
|
|
@ -8,7 +8,7 @@
|
||||||
<field name="name">report.membership.tree</field>
|
<field name="name">report.membership.tree</field>
|
||||||
<field name="model">report.membership</field>
|
<field name="model">report.membership</field>
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<tree colors="blue:membership_state == 'draft';black:membership_state in ('open','free');gray:membership_state in ('done','cancel') " string="Membership">
|
<tree colors="blue:membership_state == 'draft';black:membership_state in ('open','free');gray:membership_state in ('done','cancel') " create="false" string="Membership">
|
||||||
<field name="partner_id"/>
|
<field name="partner_id"/>
|
||||||
<field name="membership_state"/>
|
<field name="membership_state"/>
|
||||||
<field name="associate_member_id" invisible="1"/>
|
<field name="associate_member_id" invisible="1"/>
|
||||||
|
|
|
@ -29,7 +29,7 @@
|
||||||
'sequence': 18,
|
'sequence': 18,
|
||||||
'summary': 'Manufacturing Orders, Bill of Materials, Routing',
|
'summary': 'Manufacturing Orders, Bill of Materials, Routing',
|
||||||
'images': ['images/bill_of_materials.jpeg', 'images/manufacturing_order.jpeg', 'images/planning_manufacturing_order.jpeg', 'images/production_analysis.jpeg', 'images/production_dashboard.jpeg','images/routings.jpeg','images/work_centers.jpeg'],
|
'images': ['images/bill_of_materials.jpeg', 'images/manufacturing_order.jpeg', 'images/planning_manufacturing_order.jpeg', 'images/production_analysis.jpeg', 'images/production_dashboard.jpeg','images/routings.jpeg','images/work_centers.jpeg'],
|
||||||
'depends': ['procurement', 'stock', 'resource', 'purchase', 'product','process'],
|
'depends': ['product','procurement', 'stock', 'resource', 'purchase','process'],
|
||||||
'description': """
|
'description': """
|
||||||
Manage the Manufacturing process in OpenERP
|
Manage the Manufacturing process in OpenERP
|
||||||
===========================================
|
===========================================
|
||||||
|
|
|
@ -952,6 +952,7 @@
|
||||||
<data>
|
<data>
|
||||||
<xpath expr="//field[@name='move_id']" position="before">
|
<xpath expr="//field[@name='move_id']" position="before">
|
||||||
<field name="bom_id" domain="[('product_id','=',product_id),('bom_id','=',False)]"/>
|
<field name="bom_id" domain="[('product_id','=',product_id),('bom_id','=',False)]"/>
|
||||||
|
<field name="production_id" attrs="{'invisible': [('production_id','=',False)]}"/>
|
||||||
</xpath>
|
</xpath>
|
||||||
<xpath expr="//field[@name='close_move']" position="after">
|
<xpath expr="//field[@name='close_move']" position="after">
|
||||||
<group colspan="4" groups="product.group_mrp_properties">
|
<group colspan="4" groups="product.group_mrp_properties">
|
||||||
|
@ -961,10 +962,10 @@
|
||||||
</data>
|
</data>
|
||||||
</field>
|
</field>
|
||||||
</record>
|
</record>
|
||||||
<record id="product.product_normal_form_supply_view" model="ir.ui.view">
|
<record id="product_product_normal_form_supply_view" model="ir.ui.view">
|
||||||
<field name="name">product.normal.form.mrp.inherit</field>
|
<field name="name">product.normal.form.mrp.inherit</field>
|
||||||
<field name="model">product.product</field>
|
<field name="model">product.product</field>
|
||||||
<field name="inherit_id" ref="product.product_normal_form_view"/>
|
<field name="inherit_id" ref="procurement.product_form_view_procurement_button"/>
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<xpath expr="//field[@name='supply_method']" position="attributes">
|
<xpath expr="//field[@name='supply_method']" position="attributes">
|
||||||
<attribute name="invisible">False</attribute>
|
<attribute name="invisible">False</attribute>
|
||||||
|
@ -975,7 +976,7 @@
|
||||||
order</b> using the bill of materials assigned to this product.
|
order</b> using the bill of materials assigned to this product.
|
||||||
The delivery order will be ready once the production is done.
|
The delivery order will be ready once the production is done.
|
||||||
</p>
|
</p>
|
||||||
</group>
|
</group>
|
||||||
</field>
|
</field>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
|
@ -1050,7 +1051,5 @@
|
||||||
</xpath>
|
</xpath>
|
||||||
</field>
|
</field>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
|
|
||||||
</data>
|
</data>
|
||||||
</openerp>
|
</openerp>
|
||||||
|
|
|
@ -31,6 +31,7 @@ class procurement_order(osv.osv):
|
||||||
_columns = {
|
_columns = {
|
||||||
'bom_id': fields.many2one('mrp.bom', 'BoM', ondelete='cascade', select=True),
|
'bom_id': fields.many2one('mrp.bom', 'BoM', ondelete='cascade', select=True),
|
||||||
'property_ids': fields.many2many('mrp.property', 'procurement_property_rel', 'procurement_id','property_id', 'Properties'),
|
'property_ids': fields.many2many('mrp.property', 'procurement_property_rel', 'procurement_id','property_id', 'Properties'),
|
||||||
|
'production_id': fields.many2one('mrp.production', 'Manufacturing Order'),
|
||||||
}
|
}
|
||||||
|
|
||||||
def check_produce_product(self, cr, uid, procurement, context=None):
|
def check_produce_product(self, cr, uid, procurement, context=None):
|
||||||
|
@ -95,16 +96,22 @@ class procurement_order(osv.osv):
|
||||||
'move_prod_id': res_id,
|
'move_prod_id': res_id,
|
||||||
'company_id': procurement.company_id.id,
|
'company_id': procurement.company_id.id,
|
||||||
})
|
})
|
||||||
|
|
||||||
res[procurement.id] = produce_id
|
res[procurement.id] = produce_id
|
||||||
self.write(cr, uid, [procurement.id], {'state': 'running'})
|
self.write(cr, uid, [procurement.id], {'state': 'running', 'production_id': produce_id})
|
||||||
self.running_send_note(cr, uid, ids, context=context)
|
|
||||||
bom_result = production_obj.action_compute(cr, uid,
|
bom_result = production_obj.action_compute(cr, uid,
|
||||||
[produce_id], properties=[x.id for x in procurement.property_ids])
|
[produce_id], properties=[x.id for x in procurement.property_ids])
|
||||||
wf_service.trg_validate(uid, 'mrp.production', produce_id, 'button_confirm', cr)
|
wf_service.trg_validate(uid, 'mrp.production', produce_id, 'button_confirm', cr)
|
||||||
if res_id:
|
if res_id:
|
||||||
move_obj.write(cr, uid, [res_id],
|
move_obj.write(cr, uid, [res_id],
|
||||||
{'location_id': procurement.location_id.id})
|
{'location_id': procurement.location_id.id})
|
||||||
|
self.production_order_create_note(cr, uid, ids, context=context)
|
||||||
return res
|
return res
|
||||||
|
|
||||||
|
def production_order_create_note(self, cr, uid, ids, context=None):
|
||||||
|
for procurement in self.browse(cr, uid, ids, context=context):
|
||||||
|
body = _("Manufacturing Order created.")
|
||||||
|
self.message_post(cr, uid, [procurement.id], body=body, context=context)
|
||||||
|
|
||||||
procurement_order()
|
procurement_order()
|
||||||
|
|
||||||
|
|
|
@ -9,7 +9,7 @@
|
||||||
<field name="name">mrp.workorder.tree</field>
|
<field name="name">mrp.workorder.tree</field>
|
||||||
<field name="model">mrp.workorder</field>
|
<field name="model">mrp.workorder</field>
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<tree string="Work Orders">
|
<tree string="Work Orders" create="false">
|
||||||
<field name="date" invisible="1"/>
|
<field name="date" invisible="1"/>
|
||||||
<field name="product_id" invisible="1"/>
|
<field name="product_id" invisible="1"/>
|
||||||
<field name="product_qty" sum="Product Qty"/>
|
<field name="product_qty" sum="Product Qty"/>
|
||||||
|
|
|
@ -1300,7 +1300,7 @@ class product_product(osv.osv):
|
||||||
'expense_pdt': fields.boolean('Point of Sale Cash Out', help="This is a product you can use to take cash from a statement for the point of sale backend, exemple: money lost, transfer to bank, etc."),
|
'expense_pdt': fields.boolean('Point of Sale Cash Out', help="This is a product you can use to take cash from a statement for the point of sale backend, exemple: money lost, transfer to bank, etc."),
|
||||||
'pos_categ_id': fields.many2one('pos.category','Point of Sale Category',
|
'pos_categ_id': fields.many2one('pos.category','Point of Sale Category',
|
||||||
help="If you want to sell this product through the point of sale, select the category it belongs to."),
|
help="If you want to sell this product through the point of sale, select the category it belongs to."),
|
||||||
'to_weight' : fields.boolean('To Weight', help="This category contains products that should be weighted, mainly used for the self-checkout interface"),
|
'to_weight' : fields.boolean('To Weigh', help="This category contains products that should to be weighed, mainly used for the self-checkout interface"),
|
||||||
}
|
}
|
||||||
|
|
||||||
def _default_pos_categ_id(self, cr, uid, context=None):
|
def _default_pos_categ_id(self, cr, uid, context=None):
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
<field name="name">report.pos.order.tree</field>
|
<field name="name">report.pos.order.tree</field>
|
||||||
<field name="model">report.pos.order</field>
|
<field name="model">report.pos.order</field>
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<tree string="Point of Sale Analysis">
|
<tree string="Point of Sale Analysis" create="false">
|
||||||
<field name="date" invisible="1"/>
|
<field name="date" invisible="1"/>
|
||||||
<field name="user_id" invisible="1"/>
|
<field name="user_id" invisible="1"/>
|
||||||
<field name="year" invisible="1"/>
|
<field name="year" invisible="1"/>
|
||||||
|
|
|
@ -57,7 +57,7 @@ depending on the product's configuration.
|
||||||
'company_view.xml',
|
'company_view.xml',
|
||||||
'board_mrp_procurement_view.xml',
|
'board_mrp_procurement_view.xml',
|
||||||
],
|
],
|
||||||
'demo': ['stock_orderpoint.xml'],
|
'demo': ['stock_orderpoint.xml','procurement_demo.xml'],
|
||||||
'test': ['test/procurement.yml'],
|
'test': ['test/procurement.yml'],
|
||||||
'installable': True,
|
'installable': True,
|
||||||
'auto_install': True,
|
'auto_install': True,
|
||||||
|
|
|
@ -102,7 +102,6 @@ class procurement_order(osv.osv):
|
||||||
'procure_method': fields.selection([('make_to_stock','Make to Stock'),('make_to_order','Make to Order')], 'Procurement Method', states={'draft':[('readonly',False)], 'confirmed':[('readonly',False)]},
|
'procure_method': fields.selection([('make_to_stock','Make to Stock'),('make_to_order','Make to Order')], 'Procurement Method', states={'draft':[('readonly',False)], 'confirmed':[('readonly',False)]},
|
||||||
readonly=True, required=True, help="If you encode manually a Procurement, you probably want to use" \
|
readonly=True, required=True, help="If you encode manually a Procurement, you probably want to use" \
|
||||||
" a make to order method."),
|
" a make to order method."),
|
||||||
|
|
||||||
'note': fields.text('Note'),
|
'note': fields.text('Note'),
|
||||||
'message': fields.char('Latest error', size=124, help="Exception occurred while computing procurement orders."),
|
'message': fields.char('Latest error', size=124, help="Exception occurred while computing procurement orders."),
|
||||||
'state': fields.selection([
|
'state': fields.selection([
|
||||||
|
@ -362,11 +361,10 @@ class procurement_order(osv.osv):
|
||||||
""" Changes procurement state to Running and writes message.
|
""" Changes procurement state to Running and writes message.
|
||||||
@return: True
|
@return: True
|
||||||
"""
|
"""
|
||||||
message = _('From stock: products assigned.')
|
message = _('Products reserved from stock.')
|
||||||
self.write(cr, uid, ids, {'state': 'running',
|
self.write(cr, uid, ids, {'state': 'running',
|
||||||
'message': message}, context=context)
|
'message': message}, context=context)
|
||||||
self.message_post(cr, uid, ids, body=message, context=context)
|
self.message_post(cr, uid, ids, body=message, context=context)
|
||||||
self.running_send_note(cr, uid, ids, context=context)
|
|
||||||
return True
|
return True
|
||||||
|
|
||||||
def _check_make_to_stock_service(self, cr, uid, procurement, context=None):
|
def _check_make_to_stock_service(self, cr, uid, procurement, context=None):
|
||||||
|
@ -390,8 +388,6 @@ class procurement_order(osv.osv):
|
||||||
order_point_id = self.pool.get('stock.warehouse.orderpoint').search(cr, uid, [('product_id', '=', procurement.product_id.id)], context=context)
|
order_point_id = self.pool.get('stock.warehouse.orderpoint').search(cr, uid, [('product_id', '=', procurement.product_id.id)], context=context)
|
||||||
if not order_point_id and not ok:
|
if not order_point_id and not ok:
|
||||||
message = _("Not enough stock and no minimum orderpoint rule defined.")
|
message = _("Not enough stock and no minimum orderpoint rule defined.")
|
||||||
elif not order_point_id:
|
|
||||||
message = _("No minimum orderpoint rule defined.")
|
|
||||||
elif not ok:
|
elif not ok:
|
||||||
message = _("Not enough stock.")
|
message = _("Not enough stock.")
|
||||||
|
|
||||||
|
@ -407,7 +403,6 @@ class procurement_order(osv.osv):
|
||||||
"""
|
"""
|
||||||
for procurement in self.browse(cr, uid, ids, context=context):
|
for procurement in self.browse(cr, uid, ids, context=context):
|
||||||
self.write(cr, uid, [procurement.id], {'state': 'running'})
|
self.write(cr, uid, [procurement.id], {'state': 'running'})
|
||||||
self.running_send_note(cr, uid, ids, context=None)
|
|
||||||
return True
|
return True
|
||||||
|
|
||||||
def action_produce_assign_product(self, cr, uid, ids, context=None):
|
def action_produce_assign_product(self, cr, uid, ids, context=None):
|
||||||
|
@ -469,7 +464,6 @@ class procurement_order(osv.osv):
|
||||||
@return: True
|
@return: True
|
||||||
"""
|
"""
|
||||||
res = self.write(cr, uid, ids, {'state': 'ready'})
|
res = self.write(cr, uid, ids, {'state': 'ready'})
|
||||||
self.ready_send_note(cr, uid, ids, context=None)
|
|
||||||
return res
|
return res
|
||||||
|
|
||||||
def action_done(self, cr, uid, ids):
|
def action_done(self, cr, uid, ids):
|
||||||
|
@ -503,12 +497,6 @@ class procurement_order(osv.osv):
|
||||||
def confirm_send_note(self, cr, uid, ids, context=None):
|
def confirm_send_note(self, cr, uid, ids, context=None):
|
||||||
self.message_post(cr, uid, ids, body=_("Procurement <b>confirmed</b>."), context=context)
|
self.message_post(cr, uid, ids, body=_("Procurement <b>confirmed</b>."), context=context)
|
||||||
|
|
||||||
def running_send_note(self, cr, uid, ids, context=None):
|
|
||||||
self.message_post(cr, uid, ids, body=_("Procurement set to <b>running</b>."), context=context)
|
|
||||||
|
|
||||||
def ready_send_note(self, cr, uid, ids, context=None):
|
|
||||||
self.message_post(cr, uid, ids, body=_("Procurement set to <b>ready</b>."), context=context)
|
|
||||||
|
|
||||||
def cancel_send_note(self, cr, uid, ids, context=None):
|
def cancel_send_note(self, cr, uid, ids, context=None):
|
||||||
self.message_post(cr, uid, ids, body=_("Procurement <b>cancelled</b>."), context=context)
|
self.message_post(cr, uid, ids, body=_("Procurement <b>cancelled</b>."), context=context)
|
||||||
|
|
||||||
|
@ -641,7 +629,18 @@ class stock_warehouse_orderpoint(osv.osv):
|
||||||
})
|
})
|
||||||
return super(stock_warehouse_orderpoint, self).copy(cr, uid, id, default, context=context)
|
return super(stock_warehouse_orderpoint, self).copy(cr, uid, id, default, context=context)
|
||||||
|
|
||||||
stock_warehouse_orderpoint()
|
class product_template(osv.osv):
|
||||||
|
_inherit="product.template"
|
||||||
|
|
||||||
|
_columns = {
|
||||||
|
'type': fields.selection([('product','Stockable Product'),('consu', 'Consumable'),('service','Service')], 'Product Type', required=True, help="Will change the way procurements are processed. Consumable are product where you don't manage stock, a service is a non-material product provided by a company or an individual."),
|
||||||
|
'procure_method': fields.selection([('make_to_stock','Make to Stock'),('make_to_order','Make to Order')], 'Procurement Method', required=True, help="'Make to Stock': When needed, take from the stock or wait until re-supplying. 'Make to Order': When needed, purchase or produce for the procurement request."),
|
||||||
|
'supply_method': fields.selection([('produce','Manufacture'),('buy','Buy')], 'Supply Method', required=True, help="Produce will generate production order or tasks, according to the product type. Buy will trigger purchase orders when requested."),
|
||||||
|
}
|
||||||
|
_defaults = {
|
||||||
|
'procure_method': 'make_to_stock',
|
||||||
|
'supply_method': 'buy',
|
||||||
|
}
|
||||||
|
|
||||||
class product_product(osv.osv):
|
class product_product(osv.osv):
|
||||||
_inherit="product.product"
|
_inherit="product.product"
|
||||||
|
@ -649,6 +648,6 @@ class product_product(osv.osv):
|
||||||
'orderpoint_ids': fields.one2many('stock.warehouse.orderpoint', 'product_id', 'Minimum Stock Rules'),
|
'orderpoint_ids': fields.one2many('stock.warehouse.orderpoint', 'product_id', 'Minimum Stock Rules'),
|
||||||
}
|
}
|
||||||
|
|
||||||
product_product()
|
|
||||||
|
|
||||||
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
||||||
|
|
|
@ -0,0 +1,204 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<openerp>
|
||||||
|
<data noupdate="1">
|
||||||
|
|
||||||
|
<record id="product.product_product_1" model="product.product">
|
||||||
|
<field name="procure_method">make_to_order</field>
|
||||||
|
<field name="supply_method">produce</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="product.product_product_2" model="product.product">
|
||||||
|
<field name="procure_method">make_to_order</field>
|
||||||
|
<field name="supply_method">produce</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="product.product_product_3" model="product.product">
|
||||||
|
<field name="type">product</field>
|
||||||
|
<field name="procure_method">make_to_order</field>
|
||||||
|
<field name="supply_method">produce</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="product.product_product_4" model="product.product">
|
||||||
|
<field name="type">product</field>
|
||||||
|
<field name="procure_method">make_to_order</field>
|
||||||
|
<field name="supply_method">produce</field>
|
||||||
|
|
||||||
|
</record>
|
||||||
|
<record id="product.product_product_5" model="product.product">
|
||||||
|
<field name="type">product</field>
|
||||||
|
<field name="procure_method">make_to_order</field>
|
||||||
|
<field name="supply_method">produce</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="product.product_product_6" model="product.product">
|
||||||
|
<field name="type">product</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="product.product_product_7" model="product.product">
|
||||||
|
<field name="type">product</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="product.product_product_8" model="product.product">
|
||||||
|
<field name="type">product</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="product.product_product_9" model="product.product">
|
||||||
|
<field name="type">product</field>
|
||||||
|
<field name="procure_method">make_to_order</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="product.product_product_10" model="product.product">
|
||||||
|
<field name="type">product</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="product.product_product_11" model="product.product">
|
||||||
|
<field name="type">product</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="product.product_product_12" model="product.product">
|
||||||
|
<field name="type">product</field>
|
||||||
|
<field name="procure_method">make_to_order</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="product.product_product_13" model="product.product">
|
||||||
|
<field name="type">product</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="product.product_product_14" model="product.product">
|
||||||
|
<field name="type">product</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="product.product_product_15" model="product.product">
|
||||||
|
<field name="type">product</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="product.product_product_16" model="product.product">
|
||||||
|
<field name="type">product</field>
|
||||||
|
<field name="procure_method">make_to_order</field>
|
||||||
|
<field name="supply_method">produce</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="product.product_product_17" model="product.product">
|
||||||
|
<field name="type">product</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="product.product_product_18" model="product.product">
|
||||||
|
<field name="type">product</field>
|
||||||
|
<field name="procure_method">make_to_order</field>
|
||||||
|
<field name="supply_method">produce</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="product.product_product_19" model="product.product">
|
||||||
|
<field name="type">product</field>
|
||||||
|
<field name="procure_method">make_to_order</field>
|
||||||
|
<field name="supply_method">produce</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="product.product_product_20" model="product.product">
|
||||||
|
<field name="type">product</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="product.product_product_21" model="product.product">
|
||||||
|
<field name="type">product</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="product.product_product_22" model="product.product">
|
||||||
|
<field name="type">product</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="product.product_product_23" model="product.product">
|
||||||
|
<field name="type">product</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="product.product_product_24" model="product.product">
|
||||||
|
<field name="type">product</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="product.product_product_25" model="product.product">
|
||||||
|
<field name="type">product</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="product.product_product_26" model="product.product">
|
||||||
|
<field name="type">product</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="product.product_product_27" model="product.product">
|
||||||
|
<field name="type">product</field>
|
||||||
|
<field name="procure_method">make_to_order</field>
|
||||||
|
<field name="supply_method">produce</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="product.product_product_28" model="product.product">
|
||||||
|
<field name="type">product</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="product.product_product_29" model="product.product">
|
||||||
|
<field name="type">product</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="product.product_product_30" model="product.product">
|
||||||
|
<field name="type">product</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="product.product_product_31" model="product.product">
|
||||||
|
<field name="type">product</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="product.product_product_32" model="product.product">
|
||||||
|
<field name="type">product</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="product.product_product_33" model="product.product">
|
||||||
|
<field name="type">product</field>
|
||||||
|
<field name="procure_method">make_to_order</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="product.product_product_34" model="product.product">
|
||||||
|
<field name="type">product</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="product.product_product_35" model="product.product">
|
||||||
|
<field name="type">product</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="product.product_product_36" model="product.product">
|
||||||
|
<field name="type">product</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="product.product_product_37" model="product.product">
|
||||||
|
<field name="type">product</field>
|
||||||
|
<field name="procure_method">make_to_order</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="product.product_product_38" model="product.product">
|
||||||
|
<field name="type">product</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="product.product_product_39" model="product.product">
|
||||||
|
<field name="type">product</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="product.product_product_44" model="product.product">
|
||||||
|
<field name="procure_method">make_to_order</field>
|
||||||
|
<field name="supply_method">produce</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="product.product_product_45" model="product.product">
|
||||||
|
<field name="type">product</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="product.product_product_46" model="product.product">
|
||||||
|
<field name="type">product</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="product.product_product_47" model="product.product">
|
||||||
|
<field name="type">product</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="product.product_product_48" model="product.product">
|
||||||
|
<field name="type">product</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
</data>
|
||||||
|
</openerp>
|
||||||
|
|
|
@ -294,6 +294,29 @@
|
||||||
<field name="res_model">stock.warehouse.orderpoint</field>
|
<field name="res_model">stock.warehouse.orderpoint</field>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
|
<record model="ir.ui.view" id="product_template_form_view_procurement">
|
||||||
|
<field name="name">product.template.procurement</field>
|
||||||
|
<field name="model">product.template</field>
|
||||||
|
<field name="inherit_id" ref="product.product_template_form_view"/>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<xpath expr="//field[@name='type']" position="after">
|
||||||
|
<field name="procure_method"/>
|
||||||
|
<field name="supply_method"/>
|
||||||
|
</xpath>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="product_search_form_view_procurment" model="ir.ui.view">
|
||||||
|
<field name="name">product.search.procurment.form</field>
|
||||||
|
<field name="model">product.product</field>
|
||||||
|
<field name="inherit_id" ref="product.product_search_form_view"/>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<filter name="consumable" position="before">
|
||||||
|
<filter string="Products" icon="terp-accessories-archiver" domain="[('type','=','product')]" help="Stockable products"/>
|
||||||
|
</filter>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
<record model="ir.ui.view" id="product_form_view_procurement_button">
|
<record model="ir.ui.view" id="product_form_view_procurement_button">
|
||||||
<field name="name">product.product.procurement</field>
|
<field name="name">product.product.procurement</field>
|
||||||
<field name="model">product.product</field>
|
<field name="model">product.product</field>
|
||||||
|
@ -303,6 +326,33 @@
|
||||||
<button string="Request Procurement" name="%(act_make_procurement)d" type="action"/>
|
<button string="Request Procurement" name="%(act_make_procurement)d" type="action"/>
|
||||||
<button string="Orderpoints" name="%(product_open_orderpoint)d" type="action"/>
|
<button string="Orderpoints" name="%(product_open_orderpoint)d" type="action"/>
|
||||||
</xpath>
|
</xpath>
|
||||||
|
<xpath expr="//field[@name='cost_method']" position="before">
|
||||||
|
<field name="procure_method" groups="base.group_user"/>
|
||||||
|
<field name="supply_method" groups="base.group_user"/>
|
||||||
|
</xpath>
|
||||||
|
<xpath expr="//group[@name='general']" position="after" >
|
||||||
|
<group name="procurement_help" class="oe_grey" col="1" groups="base.group_user">
|
||||||
|
<p attrs="{'invisible': [('type','<>','service'),('procure_method','<>','make_to_stock')]}">
|
||||||
|
When you sell this service, nothing special will be trigered
|
||||||
|
to deliver the customer, as you set the procurement method as
|
||||||
|
'Make to Stock'.
|
||||||
|
</p>
|
||||||
|
<p attrs="{'invisible': [('type','<>','product'),('procure_method','<>','make_to_stock')]}">
|
||||||
|
When you sell this product, OpenERP will <b>use the available
|
||||||
|
inventory</b> for the delivery order.
|
||||||
|
<br/><br/>
|
||||||
|
If there are not enough quantities available, the delivery order
|
||||||
|
will wait for new products. To fulfill the inventory, you should
|
||||||
|
create others rules like orderpoints.
|
||||||
|
</p>
|
||||||
|
<p attrs="{'invisible': [('type','<>','consu'),('procure_method','<>','make_to_stock')]}">
|
||||||
|
When you sell this product, a delivery order will be created.
|
||||||
|
OpenERP will consider that the <b>required quantities are always
|
||||||
|
available</b> as it's a consumable (as a result of this, the quantity
|
||||||
|
on hand may become negative).
|
||||||
|
</p>
|
||||||
|
</group>
|
||||||
|
</xpath>
|
||||||
</field>
|
</field>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
|
|
|
@ -280,11 +280,8 @@ class product_template(osv.osv):
|
||||||
'description': fields.text('Description',translate=True),
|
'description': fields.text('Description',translate=True),
|
||||||
'description_purchase': fields.text('Purchase Description',translate=True),
|
'description_purchase': fields.text('Purchase Description',translate=True),
|
||||||
'description_sale': fields.text('Sale Description',translate=True),
|
'description_sale': fields.text('Sale Description',translate=True),
|
||||||
'type': fields.selection([('product','Stockable Product'),('consu', 'Consumable'),('service','Service')], 'Product Type', required=True, help="Will change the way procurements are processed. Consumable are product where you don't manage stock."),
|
'type': fields.selection([('consu', 'Consumable'),('service','Service')], 'Product Type', required=True, help="Consumable are product where you don't manage stock, a service is a non-material product provided by a company or an individual."),
|
||||||
'supply_method': fields.selection([('produce','Manufacture'),('buy','Buy')], 'Supply Method', required=True, help="Produce will generate production order or tasks, according to the product type. Buy will trigger purchase orders when requested."),
|
|
||||||
'sale_delay': fields.float('Customer Lead Time', help="This is the average delay in days between the confirmation of the customer order and the delivery of the finished products. It's the time you promise to your customers."),
|
|
||||||
'produce_delay': fields.float('Manufacturing Lead Time', help="Average delay in days to produce this product. This is only for the production order and, if it is a multi-level bill of material, it's only for the level of this product. Different lead times will be summed for all levels and purchase orders."),
|
'produce_delay': fields.float('Manufacturing Lead Time', help="Average delay in days to produce this product. This is only for the production order and, if it is a multi-level bill of material, it's only for the level of this product. Different lead times will be summed for all levels and purchase orders."),
|
||||||
'procure_method': fields.selection([('make_to_stock','Make to Stock'),('make_to_order','Make to Order')], 'Procurement Method', required=True, help="'Make to Stock': When needed, take from the stock or wait until re-supplying. 'Make to Order': When needed, purchase or produce for the procurement request."),
|
|
||||||
'rental': fields.boolean('Can be Rent'),
|
'rental': fields.boolean('Can be Rent'),
|
||||||
'categ_id': fields.many2one('product.category','Category', required=True, change_default=True, domain="[('type','=','normal')]" ,help="Select category for the current product"),
|
'categ_id': fields.many2one('product.category','Category', required=True, change_default=True, domain="[('type','=','normal')]" ,help="Select category for the current product"),
|
||||||
'list_price': fields.float('Sale Price', digits_compute=dp.get_precision('Product Price'), help="Base price for computing the customer price. Sometimes called the catalog price."),
|
'list_price': fields.float('Sale Price', digits_compute=dp.get_precision('Product Price'), help="Base price for computing the customer price. Sometimes called the catalog price."),
|
||||||
|
@ -296,7 +293,6 @@ class product_template(osv.osv):
|
||||||
help="Standard Price: the cost price is fixed and recomputed periodically (usually at the end of the year), Average Price: the cost price is recomputed at each reception of products."),
|
help="Standard Price: the cost price is fixed and recomputed periodically (usually at the end of the year), Average Price: the cost price is recomputed at each reception of products."),
|
||||||
'warranty': fields.float('Warranty'),
|
'warranty': fields.float('Warranty'),
|
||||||
'sale_ok': fields.boolean('Can be Sold', help="Determines if the product can be visible in the list of product within a selection from a sale order line."),
|
'sale_ok': fields.boolean('Can be Sold', help="Determines if the product can be visible in the list of product within a selection from a sale order line."),
|
||||||
'purchase_ok': fields.boolean('Can be Purchased', help="Determine if the product is visible in the list of products within a selection from a purchase order line."),
|
|
||||||
'state': fields.selection([('',''),
|
'state': fields.selection([('',''),
|
||||||
('draft', 'In Development'),
|
('draft', 'In Development'),
|
||||||
('sellable','Normal'),
|
('sellable','Normal'),
|
||||||
|
@ -309,11 +305,8 @@ class product_template(osv.osv):
|
||||||
'uos_coeff': fields.float('Unit of Measure -> UOS Coeff', digits_compute= dp.get_precision('Product UoS'),
|
'uos_coeff': fields.float('Unit of Measure -> UOS Coeff', digits_compute= dp.get_precision('Product UoS'),
|
||||||
help='Coefficient to convert Unit of Measure to UOS\n'
|
help='Coefficient to convert Unit of Measure to UOS\n'
|
||||||
' uos = uom * coeff'),
|
' uos = uom * coeff'),
|
||||||
'mes_type': fields.selection((('fixed', 'Fixed'), ('variable', 'Variable')), 'Measure Type', required=True),
|
'mes_type': fields.selection((('fixed', 'Fixed'), ('variable', 'Variable')), 'Measure Type'),
|
||||||
'seller_ids': fields.one2many('product.supplierinfo', 'product_id', 'Partners'),
|
'seller_ids': fields.one2many('product.supplierinfo', 'product_id', 'Partners'),
|
||||||
'loc_rack': fields.char('Rack', size=16),
|
|
||||||
'loc_row': fields.char('Row', size=16),
|
|
||||||
'loc_case': fields.char('Case', size=16),
|
|
||||||
'company_id': fields.many2one('res.company', 'Company', select=1),
|
'company_id': fields.many2one('res.company', 'Company', select=1),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -351,21 +344,17 @@ class product_template(osv.osv):
|
||||||
|
|
||||||
_defaults = {
|
_defaults = {
|
||||||
'company_id': lambda s,cr,uid,c: s.pool.get('res.company')._company_default_get(cr, uid, 'product.template', context=c),
|
'company_id': lambda s,cr,uid,c: s.pool.get('res.company')._company_default_get(cr, uid, 'product.template', context=c),
|
||||||
'list_price': lambda *a: 1,
|
'list_price': 1,
|
||||||
'cost_method': lambda *a: 'standard',
|
'cost_method': 'standard',
|
||||||
'supply_method': lambda *a: 'buy',
|
'standard_price': 0.0,
|
||||||
'standard_price': lambda *a: 0.0,
|
'sale_ok': 1,
|
||||||
'sale_ok': lambda *a: 1,
|
'produce_delay': 1,
|
||||||
'sale_delay': lambda *a: 7,
|
|
||||||
'produce_delay': lambda *a: 1,
|
|
||||||
'purchase_ok': lambda *a: 1,
|
|
||||||
'procure_method': lambda *a: 'make_to_stock',
|
|
||||||
'uom_id': _get_uom_id,
|
'uom_id': _get_uom_id,
|
||||||
'uom_po_id': _get_uom_id,
|
'uom_po_id': _get_uom_id,
|
||||||
'uos_coeff' : lambda *a: 1.0,
|
'uos_coeff' : 1.0,
|
||||||
'mes_type' : lambda *a: 'fixed',
|
'mes_type' : 'fixed',
|
||||||
'categ_id' : _default_category,
|
'categ_id' : _default_category,
|
||||||
'type' : lambda *a: 'consu',
|
'type' : 'consu',
|
||||||
}
|
}
|
||||||
|
|
||||||
def _check_uom(self, cursor, user, ids, context=None):
|
def _check_uom(self, cursor, user, ids, context=None):
|
||||||
|
|
|
@ -197,7 +197,6 @@ parameter) will see those record just disappear.
|
||||||
<field name="name">Service</field>
|
<field name="name">Service</field>
|
||||||
<field name="categ_id" ref="product.product_category_all"/>
|
<field name="categ_id" ref="product.product_category_all"/>
|
||||||
<field name="type">service</field>
|
<field name="type">service</field>
|
||||||
<field eval="False" name="purchase_ok"/>
|
|
||||||
</record>
|
</record>
|
||||||
</data>
|
</data>
|
||||||
</openerp>
|
</openerp>
|
||||||
|
|
|
@ -70,8 +70,6 @@
|
||||||
<field name="standard_price">20.5</field>
|
<field name="standard_price">20.5</field>
|
||||||
<field name="list_price">30.75</field>
|
<field name="list_price">30.75</field>
|
||||||
<field name="type">service</field>
|
<field name="type">service</field>
|
||||||
<field name="procure_method">make_to_order</field>
|
|
||||||
<field name="supply_method">produce</field>
|
|
||||||
<field name="uom_id" ref="product_uom_hour"/>
|
<field name="uom_id" ref="product_uom_hour"/>
|
||||||
<field name="uom_po_id" ref="product_uom_hour"/>
|
<field name="uom_po_id" ref="product_uom_hour"/>
|
||||||
<field name="description">This type of service include basic monitoring of products.</field>
|
<field name="description">This type of service include basic monitoring of products.</field>
|
||||||
|
@ -84,8 +82,6 @@
|
||||||
<field name="standard_price">25.5</field>
|
<field name="standard_price">25.5</field>
|
||||||
<field name="list_price">38.25</field>
|
<field name="list_price">38.25</field>
|
||||||
<field name="type">service</field>
|
<field name="type">service</field>
|
||||||
<field name="procure_method">make_to_order</field>
|
|
||||||
<field name="supply_method">produce</field>
|
|
||||||
<field name="uom_id" ref="product_uom_hour"/>
|
<field name="uom_id" ref="product_uom_hour"/>
|
||||||
<field name="uom_po_id" ref="product_uom_hour"/>
|
<field name="uom_po_id" ref="product_uom_hour"/>
|
||||||
<field name="description">This type of service include assistance for security questions, system configuration requirements, implementation or special needs.</field>
|
<field name="description">This type of service include assistance for security questions, system configuration requirements, implementation or special needs.</field>
|
||||||
|
@ -97,9 +93,7 @@
|
||||||
<field name="categ_id" ref="product_category_4"/>
|
<field name="categ_id" ref="product_category_4"/>
|
||||||
<field name="list_price">450.0</field>
|
<field name="list_price">450.0</field>
|
||||||
<field name="standard_price">300.0</field>
|
<field name="standard_price">300.0</field>
|
||||||
<field name="type">product</field>
|
<field name="type">consu</field>
|
||||||
<field name="procure_method">make_to_order</field>
|
|
||||||
<field name="supply_method">produce</field>
|
|
||||||
<field name="uom_id" ref="product_uom_unit"/>
|
<field name="uom_id" ref="product_uom_unit"/>
|
||||||
<field name="uom_po_id" ref="product_uom_unit"/>
|
<field name="uom_po_id" ref="product_uom_unit"/>
|
||||||
<field name="sale_delay">4.0</field>
|
<field name="sale_delay">4.0</field>
|
||||||
|
@ -115,9 +109,8 @@ HDD SH-1</field>
|
||||||
<field name="categ_id" ref="product_category_4"/>
|
<field name="categ_id" ref="product_category_4"/>
|
||||||
<field name="standard_price">500.0</field>
|
<field name="standard_price">500.0</field>
|
||||||
<field name="list_price">750.0</field>
|
<field name="list_price">750.0</field>
|
||||||
<field name="type">product</field>
|
<field name="type">consu</field>
|
||||||
<field name="procure_method">make_to_order</field>
|
|
||||||
<field name="supply_method">produce</field>
|
|
||||||
<field name="uom_id" ref="product_uom_unit"/>
|
<field name="uom_id" ref="product_uom_unit"/>
|
||||||
<field name="uom_po_id" ref="product_uom_unit"/>
|
<field name="uom_po_id" ref="product_uom_unit"/>
|
||||||
<field name="sale_delay">4.0</field>
|
<field name="sale_delay">4.0</field>
|
||||||
|
@ -133,9 +126,7 @@ HDD SH-1</field>
|
||||||
<field name="categ_id" ref="product_category_4"/>
|
<field name="categ_id" ref="product_category_4"/>
|
||||||
<field name="standard_price">600.0</field>
|
<field name="standard_price">600.0</field>
|
||||||
<field name="list_price">900.0</field>
|
<field name="list_price">900.0</field>
|
||||||
<field name="type">product</field>
|
<field name="type">consu</field>
|
||||||
<field name="procure_method">make_to_order</field>
|
|
||||||
<field name="supply_method">produce</field>
|
|
||||||
<field name="uom_id" ref="product_uom_unit"/>
|
<field name="uom_id" ref="product_uom_unit"/>
|
||||||
<field name="uom_po_id" ref="product_uom_unit"/>
|
<field name="uom_po_id" ref="product_uom_unit"/>
|
||||||
<field name="sale_delay">7.0</field>
|
<field name="sale_delay">7.0</field>
|
||||||
|
@ -148,7 +139,7 @@ HDD SH-1</field>
|
||||||
<field name="categ_id" ref="product_category_8"/>
|
<field name="categ_id" ref="product_category_8"/>
|
||||||
<field name="standard_price">800.0</field>
|
<field name="standard_price">800.0</field>
|
||||||
<field name="list_price">1200.0</field>
|
<field name="list_price">1200.0</field>
|
||||||
<field name="type">product</field>
|
<field name="type">consu</field>
|
||||||
<field name="uom_id" ref="product_uom_unit"/>
|
<field name="uom_id" ref="product_uom_unit"/>
|
||||||
<field name="uom_po_id" ref="product_uom_unit"/>
|
<field name="uom_po_id" ref="product_uom_unit"/>
|
||||||
</record>
|
</record>
|
||||||
|
@ -158,7 +149,7 @@ HDD SH-1</field>
|
||||||
<field name="categ_id" ref="product_category_8"/>
|
<field name="categ_id" ref="product_category_8"/>
|
||||||
<field name="standard_price">880.0</field>
|
<field name="standard_price">880.0</field>
|
||||||
<field name="list_price">1350.0</field>
|
<field name="list_price">1350.0</field>
|
||||||
<field name="type">product</field>
|
<field name="type">consu</field>
|
||||||
<field name="uom_id" ref="product_uom_unit"/>
|
<field name="uom_id" ref="product_uom_unit"/>
|
||||||
<field name="uom_po_id" ref="product_uom_unit"/>
|
<field name="uom_po_id" ref="product_uom_unit"/>
|
||||||
</record>
|
</record>
|
||||||
|
@ -168,7 +159,7 @@ HDD SH-1</field>
|
||||||
<field name="categ_id" ref="product_category_8"/>
|
<field name="categ_id" ref="product_category_8"/>
|
||||||
<field name="standard_price">10.0</field>
|
<field name="standard_price">10.0</field>
|
||||||
<field name="list_price">13.0</field>
|
<field name="list_price">13.0</field>
|
||||||
<field name="type">product</field>
|
<field name="type">consu</field>
|
||||||
<field name="uom_id" ref="product_uom_unit"/>
|
<field name="uom_id" ref="product_uom_unit"/>
|
||||||
<field name="uom_po_id" ref="product_uom_unit"/>
|
<field name="uom_po_id" ref="product_uom_unit"/>
|
||||||
</record>
|
</record>
|
||||||
|
@ -178,8 +169,7 @@ HDD SH-1</field>
|
||||||
<field name="categ_id" ref="product_category_8"/>
|
<field name="categ_id" ref="product_category_8"/>
|
||||||
<field name="standard_price">10.0</field>
|
<field name="standard_price">10.0</field>
|
||||||
<field name="list_price">13.0</field>
|
<field name="list_price">13.0</field>
|
||||||
<field name="type">product</field>
|
<field name="type">consu</field>
|
||||||
<field name="procure_method">make_to_order</field>
|
|
||||||
<field name="uom_id" ref="product_uom_unit"/>
|
<field name="uom_id" ref="product_uom_unit"/>
|
||||||
<field name="uom_po_id" ref="product_uom_unit"/>
|
<field name="uom_po_id" ref="product_uom_unit"/>
|
||||||
</record>
|
</record>
|
||||||
|
@ -189,7 +179,7 @@ HDD SH-1</field>
|
||||||
<field name="categ_id" ref="product_category_8"/>
|
<field name="categ_id" ref="product_category_8"/>
|
||||||
<field name="standard_price">12.50</field>
|
<field name="standard_price">12.50</field>
|
||||||
<field name="list_price">14</field>
|
<field name="list_price">14</field>
|
||||||
<field name="type">product</field>
|
<field name="type">consu</field>
|
||||||
<field name="uom_id" ref="product_uom_unit"/>
|
<field name="uom_id" ref="product_uom_unit"/>
|
||||||
<field name="uom_po_id" ref="product_uom_unit"/>
|
<field name="uom_po_id" ref="product_uom_unit"/>
|
||||||
</record>
|
</record>
|
||||||
|
@ -199,7 +189,7 @@ HDD SH-1</field>
|
||||||
<field name="categ_id" ref="product_category_8"/>
|
<field name="categ_id" ref="product_category_8"/>
|
||||||
<field name="standard_price">14</field>
|
<field name="standard_price">14</field>
|
||||||
<field name="list_price">16.50</field>
|
<field name="list_price">16.50</field>
|
||||||
<field name="type">product</field>
|
<field name="type">consu</field>
|
||||||
<field name="uom_id" ref="product_uom_unit"/>
|
<field name="uom_id" ref="product_uom_unit"/>
|
||||||
<field name="uom_po_id" ref="product_uom_unit"/>
|
<field name="uom_po_id" ref="product_uom_unit"/>
|
||||||
</record>
|
</record>
|
||||||
|
@ -209,8 +199,7 @@ HDD SH-1</field>
|
||||||
<field name="categ_id" ref="product_category_8"/>
|
<field name="categ_id" ref="product_category_8"/>
|
||||||
<field name="standard_price">18</field>
|
<field name="standard_price">18</field>
|
||||||
<field name="list_price">12.50</field>
|
<field name="list_price">12.50</field>
|
||||||
<field name="type">product</field>
|
<field name="type">consu</field>
|
||||||
<field name="procure_method">make_to_order</field>
|
|
||||||
<field name="uom_id" ref="product_uom_unit"/>
|
<field name="uom_id" ref="product_uom_unit"/>
|
||||||
<field name="uom_po_id" ref="product_uom_unit"/>
|
<field name="uom_po_id" ref="product_uom_unit"/>
|
||||||
</record>
|
</record>
|
||||||
|
@ -220,7 +209,7 @@ HDD SH-1</field>
|
||||||
<field name="categ_id" ref="product_category_8"/>
|
<field name="categ_id" ref="product_category_8"/>
|
||||||
<field name="standard_price">78.0</field>
|
<field name="standard_price">78.0</field>
|
||||||
<field name="list_price">85.0</field>
|
<field name="list_price">85.0</field>
|
||||||
<field name="type">product</field>
|
<field name="type">consu</field>
|
||||||
<field name="uom_id" ref="product_uom_unit"/>
|
<field name="uom_id" ref="product_uom_unit"/>
|
||||||
<field name="uom_po_id" ref="product_uom_unit"/>
|
<field name="uom_po_id" ref="product_uom_unit"/>
|
||||||
</record>
|
</record>
|
||||||
|
@ -230,7 +219,7 @@ HDD SH-1</field>
|
||||||
<field name="categ_id" ref="product_category_8"/>
|
<field name="categ_id" ref="product_category_8"/>
|
||||||
<field name="standard_price">87.0</field>
|
<field name="standard_price">87.0</field>
|
||||||
<field name="list_price">95.0</field>
|
<field name="list_price">95.0</field>
|
||||||
<field name="type">product</field>
|
<field name="type">consu</field>
|
||||||
<field name="uom_id" ref="product_uom_unit"/>
|
<field name="uom_id" ref="product_uom_unit"/>
|
||||||
<field name="uom_po_id" ref="product_uom_unit"/>
|
<field name="uom_po_id" ref="product_uom_unit"/>
|
||||||
</record>
|
</record>
|
||||||
|
@ -240,7 +229,7 @@ HDD SH-1</field>
|
||||||
<field name="categ_id" ref="product_category_8"/>
|
<field name="categ_id" ref="product_category_8"/>
|
||||||
<field name="standard_price">80.0</field>
|
<field name="standard_price">80.0</field>
|
||||||
<field name="list_price">85.0</field>
|
<field name="list_price">85.0</field>
|
||||||
<field name="type">product</field>
|
<field name="type">consu</field>
|
||||||
<field name="uom_id" ref="product_uom_unit"/>
|
<field name="uom_id" ref="product_uom_unit"/>
|
||||||
<field name="uom_po_id" ref="product_uom_unit"/>
|
<field name="uom_po_id" ref="product_uom_unit"/>
|
||||||
</record>
|
</record>
|
||||||
|
@ -250,9 +239,7 @@ HDD SH-1</field>
|
||||||
<field name="categ_id" ref="product_category_8"/>
|
<field name="categ_id" ref="product_category_8"/>
|
||||||
<field name="standard_price">20.0</field>
|
<field name="standard_price">20.0</field>
|
||||||
<field name="list_price">25.0</field>
|
<field name="list_price">25.0</field>
|
||||||
<field name="type">product</field>
|
<field name="type">consu</field>
|
||||||
<field name="procure_method">make_to_order</field>
|
|
||||||
<field name="supply_method">produce</field>
|
|
||||||
<field name="uom_id" ref="product_uom_unit"/>
|
<field name="uom_id" ref="product_uom_unit"/>
|
||||||
<field name="uom_po_id" ref="product_uom_unit"/>
|
<field name="uom_po_id" ref="product_uom_unit"/>
|
||||||
</record>
|
</record>
|
||||||
|
@ -262,7 +249,7 @@ HDD SH-1</field>
|
||||||
<field name="categ_id" ref="product_category_8"/>
|
<field name="categ_id" ref="product_category_8"/>
|
||||||
<field name="standard_price">860.0</field>
|
<field name="standard_price">860.0</field>
|
||||||
<field name="list_price">975.0</field>
|
<field name="list_price">975.0</field>
|
||||||
<field name="type">product</field>
|
<field name="type">consu</field>
|
||||||
<field name="uom_id" ref="product_uom_unit"/>
|
<field name="uom_id" ref="product_uom_unit"/>
|
||||||
<field name="uom_po_id" ref="product_uom_unit"/>
|
<field name="uom_po_id" ref="product_uom_unit"/>
|
||||||
</record>
|
</record>
|
||||||
|
@ -272,9 +259,7 @@ HDD SH-1</field>
|
||||||
<field name="categ_id" ref="product_category_8"/>
|
<field name="categ_id" ref="product_category_8"/>
|
||||||
<field name="standard_price">1020.0</field>
|
<field name="standard_price">1020.0</field>
|
||||||
<field name="list_price">1150.0</field>
|
<field name="list_price">1150.0</field>
|
||||||
<field name="type">product</field>
|
<field name="type">consu</field>
|
||||||
<field name="procure_method">make_to_order</field>
|
|
||||||
<field name="supply_method">produce</field>
|
|
||||||
<field name="uom_id" ref="product_uom_unit"/>
|
<field name="uom_id" ref="product_uom_unit"/>
|
||||||
<field name="uom_po_id" ref="product_uom_unit"/>
|
<field name="uom_po_id" ref="product_uom_unit"/>
|
||||||
</record>
|
</record>
|
||||||
|
@ -284,9 +269,7 @@ HDD SH-1</field>
|
||||||
<field name="categ_id" ref="product_category_8"/>
|
<field name="categ_id" ref="product_category_8"/>
|
||||||
<field name="standard_price">1100.0</field>
|
<field name="standard_price">1100.0</field>
|
||||||
<field name="list_price">1250.0</field>
|
<field name="list_price">1250.0</field>
|
||||||
<field name="type">product</field>
|
<field name="type">consu</field>
|
||||||
<field name="procure_method">make_to_order</field>
|
|
||||||
<field name="supply_method">produce</field>
|
|
||||||
<field name="uom_id" ref="product_uom_unit"/>
|
<field name="uom_id" ref="product_uom_unit"/>
|
||||||
<field name="uom_po_id" ref="product_uom_unit"/>
|
<field name="uom_po_id" ref="product_uom_unit"/>
|
||||||
<field name="description">On demand hard-disk having capacity based on requirement.</field>
|
<field name="description">On demand hard-disk having capacity based on requirement.</field>
|
||||||
|
@ -297,7 +280,7 @@ HDD SH-1</field>
|
||||||
<field name="categ_id" ref="product_category_8"/>
|
<field name="categ_id" ref="product_category_8"/>
|
||||||
<field name="standard_price">1700.0</field>
|
<field name="standard_price">1700.0</field>
|
||||||
<field name="list_price">1950.0</field>
|
<field name="list_price">1950.0</field>
|
||||||
<field name="type">product</field>
|
<field name="type">consu</field>
|
||||||
<field name="uom_id" ref="product_uom_unit"/>
|
<field name="uom_id" ref="product_uom_unit"/>
|
||||||
<field name="uom_po_id" ref="product_uom_unit"/>
|
<field name="uom_po_id" ref="product_uom_unit"/>
|
||||||
</record>
|
</record>
|
||||||
|
@ -307,7 +290,7 @@ HDD SH-1</field>
|
||||||
<field name="categ_id" ref="product_category_8"/>
|
<field name="categ_id" ref="product_category_8"/>
|
||||||
<field name="standard_price">1790.0</field>
|
<field name="standard_price">1790.0</field>
|
||||||
<field name="list_price">2000.0</field>
|
<field name="list_price">2000.0</field>
|
||||||
<field name="type">product</field>
|
<field name="type">consu</field>
|
||||||
<field name="uom_id" ref="product_uom_unit"/>
|
<field name="uom_id" ref="product_uom_unit"/>
|
||||||
<field name="uom_po_id" ref="product_uom_unit"/>
|
<field name="uom_po_id" ref="product_uom_unit"/>
|
||||||
</record>
|
</record>
|
||||||
|
@ -317,7 +300,7 @@ HDD SH-1</field>
|
||||||
<field name="categ_id" ref="product_category_8"/>
|
<field name="categ_id" ref="product_category_8"/>
|
||||||
<field name="standard_price">2010.0</field>
|
<field name="standard_price">2010.0</field>
|
||||||
<field name="list_price">2100.0</field>
|
<field name="list_price">2100.0</field>
|
||||||
<field name="type">product</field>
|
<field name="type">consu</field>
|
||||||
<field name="uom_id" ref="product_uom_unit"/>
|
<field name="uom_id" ref="product_uom_unit"/>
|
||||||
<field name="uom_po_id" ref="product_uom_unit"/>
|
<field name="uom_po_id" ref="product_uom_unit"/>
|
||||||
</record>
|
</record>
|
||||||
|
@ -327,7 +310,7 @@ HDD SH-1</field>
|
||||||
<field name="categ_id" ref="product_category_8"/>
|
<field name="categ_id" ref="product_category_8"/>
|
||||||
<field name="standard_price">1910.0</field>
|
<field name="standard_price">1910.0</field>
|
||||||
<field name="list_price">1980.0</field>
|
<field name="list_price">1980.0</field>
|
||||||
<field name="type">product</field>
|
<field name="type">consu</field>
|
||||||
<field name="uom_id" ref="product_uom_unit"/>
|
<field name="uom_id" ref="product_uom_unit"/>
|
||||||
<field name="uom_po_id" ref="product_uom_unit"/>
|
<field name="uom_po_id" ref="product_uom_unit"/>
|
||||||
</record>
|
</record>
|
||||||
|
@ -337,7 +320,7 @@ HDD SH-1</field>
|
||||||
<field name="categ_id" ref="product_category_8"/>
|
<field name="categ_id" ref="product_category_8"/>
|
||||||
<field name="standard_price">876.0</field>
|
<field name="standard_price">876.0</field>
|
||||||
<field name="list_price">885.0</field>
|
<field name="list_price">885.0</field>
|
||||||
<field name="type">product</field>
|
<field name="type">consu</field>
|
||||||
<field name="uom_id" ref="product_uom_unit"/>
|
<field name="uom_id" ref="product_uom_unit"/>
|
||||||
<field name="uom_po_id" ref="product_uom_unit"/>
|
<field name="uom_po_id" ref="product_uom_unit"/>
|
||||||
</record>
|
</record>
|
||||||
|
@ -347,7 +330,7 @@ HDD SH-1</field>
|
||||||
<field name="categ_id" ref="product_category_4"/>
|
<field name="categ_id" ref="product_category_4"/>
|
||||||
<field name="standard_price">2870.0</field>
|
<field name="standard_price">2870.0</field>
|
||||||
<field name="list_price">2950.0</field>
|
<field name="list_price">2950.0</field>
|
||||||
<field name="type">product</field>
|
<field name="type">consu</field>
|
||||||
<field name="uom_id" ref="product_uom_unit"/>
|
<field name="uom_id" ref="product_uom_unit"/>
|
||||||
<field name="uom_po_id" ref="product_uom_unit"/>
|
<field name="uom_po_id" ref="product_uom_unit"/>
|
||||||
<field name="description">17" Monitor
|
<field name="description">17" Monitor
|
||||||
|
@ -361,7 +344,7 @@ QWERTY keyboard</field>
|
||||||
<field name="categ_id" ref="product_category_4"/>
|
<field name="categ_id" ref="product_category_4"/>
|
||||||
<field name="standard_price">3000.0</field>
|
<field name="standard_price">3000.0</field>
|
||||||
<field name="list_price">3245.0</field>
|
<field name="list_price">3245.0</field>
|
||||||
<field name="type">product</field>
|
<field name="type">consu</field>
|
||||||
<field name="uom_id" ref="product_uom_unit"/>
|
<field name="uom_id" ref="product_uom_unit"/>
|
||||||
<field name="uom_po_id" ref="product_uom_unit"/>
|
<field name="uom_po_id" ref="product_uom_unit"/>
|
||||||
<field name="description">17" Monitor
|
<field name="description">17" Monitor
|
||||||
|
@ -375,9 +358,7 @@ QWERTY keyboard</field>
|
||||||
<field name="categ_id" ref="product_category_4"/>
|
<field name="categ_id" ref="product_category_4"/>
|
||||||
<field name="standard_price">3300.0</field>
|
<field name="standard_price">3300.0</field>
|
||||||
<field name="list_price">3645.0</field>
|
<field name="list_price">3645.0</field>
|
||||||
<field name="type">product</field>
|
<field name="type">consu</field>
|
||||||
<field name="procure_method">make_to_order</field>
|
|
||||||
<field name="supply_method">produce</field>
|
|
||||||
<field name="uom_id" ref="product_uom_unit"/>
|
<field name="uom_id" ref="product_uom_unit"/>
|
||||||
<field name="uom_po_id" ref="product_uom_unit"/>
|
<field name="uom_po_id" ref="product_uom_unit"/>
|
||||||
<field name="description">Custom Laptop based on customer's requirement.</field>
|
<field name="description">Custom Laptop based on customer's requirement.</field>
|
||||||
|
@ -388,7 +369,7 @@ QWERTY keyboard</field>
|
||||||
<field name="categ_id" ref="product_category_6"/>
|
<field name="categ_id" ref="product_category_6"/>
|
||||||
<field name="standard_price">390.0</field>
|
<field name="standard_price">390.0</field>
|
||||||
<field name="list_price">405.0</field>
|
<field name="list_price">405.0</field>
|
||||||
<field name="type">product</field>
|
<field name="type">consu</field>
|
||||||
<field name="uom_id" ref="product_uom_unit"/>
|
<field name="uom_id" ref="product_uom_unit"/>
|
||||||
<field name="uom_po_id" ref="product_uom_unit"/>
|
<field name="uom_po_id" ref="product_uom_unit"/>
|
||||||
</record>
|
</record>
|
||||||
|
@ -399,7 +380,7 @@ QWERTY keyboard</field>
|
||||||
<field name="categ_id" ref="product_category_7"/>
|
<field name="categ_id" ref="product_category_7"/>
|
||||||
<field name="standard_price">90.0</field>
|
<field name="standard_price">90.0</field>
|
||||||
<field name="list_price">100.0</field>
|
<field name="list_price">100.0</field>
|
||||||
<field name="type">product</field>
|
<field name="type">consu</field>
|
||||||
<field name="uom_id" ref="product_uom_unit"/>
|
<field name="uom_id" ref="product_uom_unit"/>
|
||||||
<field name="uom_po_id" ref="product_uom_unit"/>
|
<field name="uom_po_id" ref="product_uom_unit"/>
|
||||||
</record>
|
</record>
|
||||||
|
@ -410,7 +391,7 @@ QWERTY keyboard</field>
|
||||||
<field name="categ_id" ref="product_category_7"/>
|
<field name="categ_id" ref="product_category_7"/>
|
||||||
<field name="standard_price">126.0</field>
|
<field name="standard_price">126.0</field>
|
||||||
<field name="list_price">145.0</field>
|
<field name="list_price">145.0</field>
|
||||||
<field name="type">product</field>
|
<field name="type">consu</field>
|
||||||
<field name="uom_id" ref="product_uom_unit"/>
|
<field name="uom_id" ref="product_uom_unit"/>
|
||||||
<field name="uom_po_id" ref="product_uom_unit"/>
|
<field name="uom_po_id" ref="product_uom_unit"/>
|
||||||
</record>
|
</record>
|
||||||
|
@ -420,7 +401,7 @@ QWERTY keyboard</field>
|
||||||
<field name="categ_id" ref="product_category_7"/>
|
<field name="categ_id" ref="product_category_7"/>
|
||||||
<field name="standard_price">134.0</field>
|
<field name="standard_price">134.0</field>
|
||||||
<field name="list_price">150.0</field>
|
<field name="list_price">150.0</field>
|
||||||
<field name="type">product</field>
|
<field name="type">consu</field>
|
||||||
<field name="uom_id" ref="product_uom_unit"/>
|
<field name="uom_id" ref="product_uom_unit"/>
|
||||||
<field name="uom_po_id" ref="product_uom_unit"/>
|
<field name="uom_po_id" ref="product_uom_unit"/>
|
||||||
<field name="description">.</field>
|
<field name="description">.</field>
|
||||||
|
@ -431,7 +412,7 @@ QWERTY keyboard</field>
|
||||||
<field name="categ_id" ref="product_category_7"/>
|
<field name="categ_id" ref="product_category_7"/>
|
||||||
<field name="standard_price">57.0</field>
|
<field name="standard_price">57.0</field>
|
||||||
<field name="list_price">62.0</field>
|
<field name="list_price">62.0</field>
|
||||||
<field name="type">product</field>
|
<field name="type">consu</field>
|
||||||
<field name="uom_id" ref="product_uom_unit"/>
|
<field name="uom_id" ref="product_uom_unit"/>
|
||||||
<field name="uom_po_id" ref="product_uom_unit"/>
|
<field name="uom_po_id" ref="product_uom_unit"/>
|
||||||
<field name="description">Hands free headset for laptop PC with in-line microphone and headphone plug.</field>
|
<field name="description">Hands free headset for laptop PC with in-line microphone and headphone plug.</field>
|
||||||
|
@ -442,8 +423,7 @@ QWERTY keyboard</field>
|
||||||
<field name="categ_id" ref="product_category_7"/>
|
<field name="categ_id" ref="product_category_7"/>
|
||||||
<field name="standard_price">60.0</field>
|
<field name="standard_price">60.0</field>
|
||||||
<field name="list_price">65.0</field>
|
<field name="list_price">65.0</field>
|
||||||
<field name="type">product</field>
|
<field name="type">consu</field>
|
||||||
<field name="procure_method">make_to_order</field>
|
|
||||||
<field name="uom_id" ref="product_uom_unit"/>
|
<field name="uom_id" ref="product_uom_unit"/>
|
||||||
<field name="uom_po_id" ref="product_uom_unit"/>
|
<field name="uom_po_id" ref="product_uom_unit"/>
|
||||||
<field name="description">Headset for laptop PC with USB connector.</field>
|
<field name="description">Headset for laptop PC with USB connector.</field>
|
||||||
|
@ -455,7 +435,7 @@ QWERTY keyboard</field>
|
||||||
<field name="categ_id" ref="product_category_7"/>
|
<field name="categ_id" ref="product_category_7"/>
|
||||||
<field name="standard_price">38.0</field>
|
<field name="standard_price">38.0</field>
|
||||||
<field name="list_price">45.0</field>
|
<field name="list_price">45.0</field>
|
||||||
<field name="type">product</field>
|
<field name="type">consu</field>
|
||||||
<field name="uom_id" ref="product_uom_unit"/>
|
<field name="uom_id" ref="product_uom_unit"/>
|
||||||
<field name="uom_po_id" ref="product_uom_unit"/>
|
<field name="uom_po_id" ref="product_uom_unit"/>
|
||||||
</record>
|
</record>
|
||||||
|
@ -466,7 +446,7 @@ QWERTY keyboard</field>
|
||||||
<field name="categ_id" ref="product_category_7"/>
|
<field name="categ_id" ref="product_category_7"/>
|
||||||
<field name="standard_price">18.40</field>
|
<field name="standard_price">18.40</field>
|
||||||
<field name="list_price">20.0</field>
|
<field name="list_price">20.0</field>
|
||||||
<field name="type">product</field>
|
<field name="type">consu</field>
|
||||||
<field name="uom_id" ref="product_uom_dozen"/>
|
<field name="uom_id" ref="product_uom_dozen"/>
|
||||||
<field name="uom_po_id" ref="product_uom_dozen"/>
|
<field name="uom_po_id" ref="product_uom_dozen"/>
|
||||||
</record>
|
</record>
|
||||||
|
@ -477,7 +457,7 @@ QWERTY keyboard</field>
|
||||||
<field name="categ_id" ref="product_category_7"/>
|
<field name="categ_id" ref="product_category_7"/>
|
||||||
<field name="standard_price">21.60</field>
|
<field name="standard_price">21.60</field>
|
||||||
<field name="list_price">24.0</field>
|
<field name="list_price">24.0</field>
|
||||||
<field name="type">product</field>
|
<field name="type">consu</field>
|
||||||
<field name="uom_id" ref="product_uom_dozen"/>
|
<field name="uom_id" ref="product_uom_dozen"/>
|
||||||
<field name="uom_po_id" ref="product_uom_dozen"/>
|
<field name="uom_po_id" ref="product_uom_dozen"/>
|
||||||
</record>
|
</record>
|
||||||
|
@ -488,8 +468,7 @@ QWERTY keyboard</field>
|
||||||
<field name="categ_id" ref="product_category_6"/>
|
<field name="categ_id" ref="product_category_6"/>
|
||||||
<field name="standard_price">4258.0</field>
|
<field name="standard_price">4258.0</field>
|
||||||
<field name="list_price">4410.0</field>
|
<field name="list_price">4410.0</field>
|
||||||
<field name="type">product</field>
|
<field name="type">consu</field>
|
||||||
<field name="procure_method">make_to_order</field>
|
|
||||||
<field name="uom_id" ref="product_uom_unit"/>
|
<field name="uom_id" ref="product_uom_unit"/>
|
||||||
<field name="uom_po_id" ref="product_uom_unit"/>
|
<field name="uom_po_id" ref="product_uom_unit"/>
|
||||||
<field name="description">All in one hi-speed printer with fax and scanner.</field>
|
<field name="description">All in one hi-speed printer with fax and scanner.</field>
|
||||||
|
@ -501,7 +480,7 @@ QWERTY keyboard</field>
|
||||||
<field name="categ_id" ref="product_category_6"/>
|
<field name="categ_id" ref="product_category_6"/>
|
||||||
<field name="standard_price">60.0</field>
|
<field name="standard_price">60.0</field>
|
||||||
<field name="list_price">65.0</field>
|
<field name="list_price">65.0</field>
|
||||||
<field name="type">product</field>
|
<field name="type">consu</field>
|
||||||
<field name="uom_id" ref="product_uom_unit"/>
|
<field name="uom_id" ref="product_uom_unit"/>
|
||||||
<field name="uom_po_id" ref="product_uom_unit"/>
|
<field name="uom_po_id" ref="product_uom_unit"/>
|
||||||
</record>
|
</record>
|
||||||
|
@ -512,7 +491,7 @@ QWERTY keyboard</field>
|
||||||
<field name="categ_id" ref="product_category_6"/>
|
<field name="categ_id" ref="product_category_6"/>
|
||||||
<field name="standard_price">66.0</field>
|
<field name="standard_price">66.0</field>
|
||||||
<field name="list_price">70.0</field>
|
<field name="list_price">70.0</field>
|
||||||
<field name="type">product</field>
|
<field name="type">consu</field>
|
||||||
<field name="uom_id" ref="product_uom_unit"/>
|
<field name="uom_id" ref="product_uom_unit"/>
|
||||||
<field name="uom_po_id" ref="product_uom_unit"/>
|
<field name="uom_po_id" ref="product_uom_unit"/>
|
||||||
</record>
|
</record>
|
||||||
|
@ -569,8 +548,6 @@ QWERTY keyboard</field>
|
||||||
<field name="standard_price">155.0</field>
|
<field name="standard_price">155.0</field>
|
||||||
<field name="list_price">173.0</field>
|
<field name="list_price">173.0</field>
|
||||||
<field name="type">consu</field>
|
<field name="type">consu</field>
|
||||||
<field name="procure_method">make_to_order</field>
|
|
||||||
<field name="supply_method">produce</field>
|
|
||||||
<field name="uom_id" ref="product_uom_unit"/>
|
<field name="uom_id" ref="product_uom_unit"/>
|
||||||
<field name="uom_po_id" ref="product_uom_unit"/>
|
<field name="uom_po_id" ref="product_uom_unit"/>
|
||||||
<field name="description_sale">Full featured image editing software.</field>
|
<field name="description_sale">Full featured image editing software.</field>
|
||||||
|
@ -582,7 +559,7 @@ QWERTY keyboard</field>
|
||||||
<field name="categ_id" ref="product_category_6"/>
|
<field name="categ_id" ref="product_category_6"/>
|
||||||
<field name="standard_price">55.0</field>
|
<field name="standard_price">55.0</field>
|
||||||
<field name="list_price">60.0</field>
|
<field name="list_price">60.0</field>
|
||||||
<field name="type">product</field>
|
<field name="type">consu</field>
|
||||||
<field name="uom_id" ref="product_uom_unit"/>
|
<field name="uom_id" ref="product_uom_unit"/>
|
||||||
<field name="uom_po_id" ref="product_uom_unit"/>
|
<field name="uom_po_id" ref="product_uom_unit"/>
|
||||||
</record>
|
</record>
|
||||||
|
@ -593,7 +570,7 @@ QWERTY keyboard</field>
|
||||||
<field name="categ_id" ref="product_category_6"/>
|
<field name="categ_id" ref="product_category_6"/>
|
||||||
<field name="standard_price">35.0</field>
|
<field name="standard_price">35.0</field>
|
||||||
<field name="list_price">40.0</field>
|
<field name="list_price">40.0</field>
|
||||||
<field name="type">product</field>
|
<field name="type">consu</field>
|
||||||
<field name="uom_id" ref="product_uom_unit"/>
|
<field name="uom_id" ref="product_uom_unit"/>
|
||||||
<field name="uom_po_id" ref="product_uom_unit"/>
|
<field name="uom_po_id" ref="product_uom_unit"/>
|
||||||
</record>
|
</record>
|
||||||
|
@ -604,7 +581,7 @@ QWERTY keyboard</field>
|
||||||
<field name="categ_id" ref="product_category_6"/>
|
<field name="categ_id" ref="product_category_6"/>
|
||||||
<field name="standard_price">55.0</field>
|
<field name="standard_price">55.0</field>
|
||||||
<field name="list_price">70.0</field>
|
<field name="list_price">70.0</field>
|
||||||
<field name="type">product</field>
|
<field name="type">consu</field>
|
||||||
<field name="uom_id" ref="product_uom_unit"/>
|
<field name="uom_id" ref="product_uom_unit"/>
|
||||||
<field name="uom_po_id" ref="product_uom_unit"/>
|
<field name="uom_po_id" ref="product_uom_unit"/>
|
||||||
</record>
|
</record>
|
||||||
|
@ -615,7 +592,7 @@ QWERTY keyboard</field>
|
||||||
<field name="categ_id" ref="product_category_6"/>
|
<field name="categ_id" ref="product_category_6"/>
|
||||||
<field name="standard_price">13.0</field>
|
<field name="standard_price">13.0</field>
|
||||||
<field name="list_price">18.0</field>
|
<field name="list_price">18.0</field>
|
||||||
<field name="type">product</field>
|
<field name="type">consu</field>
|
||||||
<field name="uom_id" ref="product_uom_unit"/>
|
<field name="uom_id" ref="product_uom_unit"/>
|
||||||
<field name="uom_po_id" ref="product_uom_unit"/>
|
<field name="uom_po_id" ref="product_uom_unit"/>
|
||||||
</record>
|
</record>
|
||||||
|
|
|
@ -10,11 +10,9 @@
|
||||||
<search string="Product">
|
<search string="Product">
|
||||||
<field name="name" string="Product" filter_domain="['|',('name','ilike',self),('default_code','ilike',self)]"/>
|
<field name="name" string="Product" filter_domain="['|',('name','ilike',self),('default_code','ilike',self)]"/>
|
||||||
<filter string="Services" icon="terp-accessories-archiver" domain="[('type','=','service')]"/>
|
<filter string="Services" icon="terp-accessories-archiver" domain="[('type','=','service')]"/>
|
||||||
<filter string="Products" icon="terp-accessories-archiver" domain="['|',('type','=','product'),('type','=','consu')]" help="Both stockable and consumable products"/>
|
<filter string="Consumable" name="consumable" icon="terp-accessories-archiver" domain="[('type','=','consu')]" help="Consumable products"/>
|
||||||
<separator/>
|
<separator/>
|
||||||
<filter name="filter_to_purchase" string="To Purchase" icon="terp-accessories-archiver+" domain="[('purchase_ok', '=', 1)]"/>
|
|
||||||
<filter string="Can be Sold" name="filter_to_sell" icon="terp-accessories-archiver-minus" domain="[('sale_ok','=',1)]"/>
|
<filter string="Can be Sold" name="filter_to_sell" icon="terp-accessories-archiver-minus" domain="[('sale_ok','=',1)]"/>
|
||||||
<filter name="filter_to_purchase" string="Can be Purchased" icon="terp-accessories-archiver+" domain="[('purchase_ok', '=', 1)]"/>
|
|
||||||
<field name="categ_id" operator="child_of"/>
|
<field name="categ_id" operator="child_of"/>
|
||||||
<group expand="0" string="Context...">
|
<group expand="0" string="Context...">
|
||||||
<field name="pricelist_id" context="{'pricelist': self}" groups="product.group_sale_pricelist"/>
|
<field name="pricelist_id" context="{'pricelist': self}" groups="product.group_sale_pricelist"/>
|
||||||
|
@ -60,7 +58,7 @@
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<form string="Product" version="7.0">
|
<form string="Product" version="7.0">
|
||||||
<sheet>
|
<sheet>
|
||||||
<field name="image_medium" widget="image" class="oe_avatar oe_right"/>
|
<field name="image_medium" widget="image" class="oe_avatar oe_left"/>
|
||||||
<div class="oe_title">
|
<div class="oe_title">
|
||||||
<div class="oe_edit_only">
|
<div class="oe_edit_only">
|
||||||
<label for="name" string="Product Name"/>
|
<label for="name" string="Product Name"/>
|
||||||
|
@ -73,8 +71,6 @@
|
||||||
<div name="options" groups="base.group_user">
|
<div name="options" groups="base.group_user">
|
||||||
<field name="sale_ok"/>
|
<field name="sale_ok"/>
|
||||||
<label for="sale_ok"/>
|
<label for="sale_ok"/>
|
||||||
<field name="purchase_ok"/>
|
|
||||||
<label for="purchase_ok"/>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="oe_right oe_button_box" name="buttons">
|
<div class="oe_right oe_button_box" name="buttons">
|
||||||
|
@ -104,34 +100,11 @@
|
||||||
</page>
|
</page>
|
||||||
<page string="Procurements" groups="base.group_user">
|
<page string="Procurements" groups="base.group_user">
|
||||||
<group name="procurement">
|
<group name="procurement">
|
||||||
<group>
|
<group name="general">
|
||||||
<field name="procure_method" groups="base.group_user"/>
|
|
||||||
<field name="supply_method" groups="base.group_user" invisible="1"/>
|
|
||||||
<field name="cost_method" groups="product.group_costing_method"/>
|
<field name="cost_method" groups="product.group_costing_method"/>
|
||||||
<field name="standard_price" attrs="{'readonly':[('cost_method','=','average')]}"/>
|
<field name="standard_price" attrs="{'readonly':[('cost_method','=','average')]}"/>
|
||||||
</group>
|
</group>
|
||||||
<group name="procurement_help" class="oe_grey" col="1" groups="base.group_user">
|
<group name="procurement_uom" groups="product.group_uom">
|
||||||
<p attrs="{'invisible': [('type','<>','service'),('procure_method','<>','make_to_stock')]}">
|
|
||||||
When you sell this service, nothing special will be trigered
|
|
||||||
to deliver the customer, as you set the procurement method as
|
|
||||||
'Make to Stock'.
|
|
||||||
</p>
|
|
||||||
<p attrs="{'invisible': [('type','<>','product'),('procure_method','<>','make_to_stock')]}">
|
|
||||||
When you sell this product, OpenERP will <b>use the available
|
|
||||||
inventory</b> for the delivery order.
|
|
||||||
<br/><br/>
|
|
||||||
If there are not enough quantities available, the delivery order
|
|
||||||
will wait for new products. To fulfill the inventory, you should
|
|
||||||
create others rules like orderpoints.
|
|
||||||
</p>
|
|
||||||
<p attrs="{'invisible': [('type','<>','consu'),('procure_method','<>','make_to_stock')]}">
|
|
||||||
When you sell this product, a delivery order will be created.
|
|
||||||
OpenERP will consider that the <b>required quantities are always
|
|
||||||
available</b> as it's a consumable (as a result of this, the quantity
|
|
||||||
on hand may become negative).
|
|
||||||
</p>
|
|
||||||
</group>
|
|
||||||
<group groups="product.group_uom">
|
|
||||||
<field name="uom_po_id"/>
|
<field name="uom_po_id"/>
|
||||||
</group>
|
</group>
|
||||||
</group>
|
</group>
|
||||||
|
@ -144,13 +117,7 @@
|
||||||
<field name="state"/>
|
<field name="state"/>
|
||||||
<field name="product_manager"/>
|
<field name="product_manager"/>
|
||||||
</group>
|
</group>
|
||||||
<group name="store" string="Storage Localisation">
|
<group name="Weights" groups="product.group_stock_packaging" string="Weights">
|
||||||
<field name="company_id" groups="base.group_multi_company" widget="selection"/>
|
|
||||||
<field name="loc_rack" attrs="{'invisible':[('type','=','service')]}"/>
|
|
||||||
<field name="loc_row" attrs="{'invisible':[('type','=','service')]}"/>
|
|
||||||
<field name="loc_case" attrs="{'invisible':[('type','=','service')]}"/>
|
|
||||||
</group>
|
|
||||||
<group groups="product.group_stock_packaging" string="Weights">
|
|
||||||
<field digits="(14, 3)" name="volume" attrs="{'readonly':[('type','=','service')]}"/>
|
<field digits="(14, 3)" name="volume" attrs="{'readonly':[('type','=','service')]}"/>
|
||||||
<field name="weight" attrs="{'readonly':[('type','=','service')]}"/>
|
<field name="weight" attrs="{'readonly':[('type','=','service')]}"/>
|
||||||
<field name="weight_net" attrs="{'readonly':[('type','=','service')]}"/>
|
<field name="weight_net" attrs="{'readonly':[('type','=','service')]}"/>
|
||||||
|
@ -160,10 +127,6 @@
|
||||||
<page string="Sales" attrs="{'readonly':[('sale_ok','=',0)]}">
|
<page string="Sales" attrs="{'readonly':[('sale_ok','=',0)]}">
|
||||||
<group name="sale">
|
<group name="sale">
|
||||||
<group string="Sale Conditions">
|
<group string="Sale Conditions">
|
||||||
<label for="sale_delay"/>
|
|
||||||
<div>
|
|
||||||
<field name="sale_delay" class="oe_inline"/> days
|
|
||||||
</div>
|
|
||||||
<label for="warranty"/>
|
<label for="warranty"/>
|
||||||
<div>
|
<div>
|
||||||
<field name="warranty" class="oe_inline"/> months
|
<field name="warranty" class="oe_inline"/> months
|
||||||
|
@ -715,12 +678,9 @@
|
||||||
<group>
|
<group>
|
||||||
<group string="Product Type">
|
<group string="Product Type">
|
||||||
<field name="sale_ok"/>
|
<field name="sale_ok"/>
|
||||||
<field name="purchase_ok"/>
|
|
||||||
</group>
|
</group>
|
||||||
<group string="Procurement">
|
<group string="Procurement">
|
||||||
<field name="type"/>
|
<field name="type"/>
|
||||||
<field name="procure_method"/>
|
|
||||||
<field name="supply_method"/>
|
|
||||||
</group>
|
</group>
|
||||||
|
|
||||||
<group string="Base Prices">
|
<group string="Base Prices">
|
||||||
|
@ -733,7 +693,7 @@
|
||||||
<field digits="(14, 3)" name="volume" attrs="{'readonly':[('type','=','service')]}"/>
|
<field digits="(14, 3)" name="volume" attrs="{'readonly':[('type','=','service')]}"/>
|
||||||
<field digits="(14, 3)" name="weight" attrs="{'readonly':[('type','=','service')]}"/>
|
<field digits="(14, 3)" name="weight" attrs="{'readonly':[('type','=','service')]}"/>
|
||||||
<field digits="(14, 3)" name="weight_net" attrs="{'readonly':[('type','=','service')]}"/>
|
<field digits="(14, 3)" name="weight_net" attrs="{'readonly':[('type','=','service')]}"/>
|
||||||
</group>
|
</group>
|
||||||
|
|
||||||
<group name="status" string="Status">
|
<group name="status" string="Status">
|
||||||
<field name="categ_id"/>
|
<field name="categ_id"/>
|
||||||
|
@ -756,18 +716,12 @@
|
||||||
<page string="Procurement & Locations">
|
<page string="Procurement & Locations">
|
||||||
<group>
|
<group>
|
||||||
<group name="delay" string="Delays">
|
<group name="delay" string="Delays">
|
||||||
<field name="sale_delay" attrs="{'readonly':[('sale_ok','=',0)]}"/>
|
|
||||||
<label for="produce_delay"/>
|
<label for="produce_delay"/>
|
||||||
<div>
|
<div>
|
||||||
<field name="produce_delay" class="oe_inline"/> days
|
<field name="produce_delay" class="oe_inline"/> days
|
||||||
</div>
|
</div>
|
||||||
<field name="warranty"/>
|
<field name="warranty"/>
|
||||||
</group>
|
</group>
|
||||||
<group name="store" string="Storage Localisation">
|
|
||||||
<field name="loc_rack"/>
|
|
||||||
<field name="loc_row"/>
|
|
||||||
<field name="loc_case"/>
|
|
||||||
</group>
|
|
||||||
</group>
|
</group>
|
||||||
|
|
||||||
</page>
|
</page>
|
||||||
|
|
|
@ -19,9 +19,9 @@
|
||||||
<record model="ir.ui.view" id="view_product_form_expiry">
|
<record model="ir.ui.view" id="view_product_form_expiry">
|
||||||
<field name="name">product.normal.form</field>
|
<field name="name">product.normal.form</field>
|
||||||
<field name="model">product.product</field>
|
<field name="model">product.product</field>
|
||||||
<field name="inherit_id" ref="product.product_normal_form_view" />
|
<field name="inherit_id" ref="stock.view_normal_procurement_locations_form" />
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<group name="inventory">
|
<group name="Weights" position="after">
|
||||||
<group string="Dates">
|
<group string="Dates">
|
||||||
<field name="life_time" />
|
<field name="life_time" />
|
||||||
<field name="use_time" />
|
<field name="use_time" />
|
||||||
|
|
|
@ -510,8 +510,7 @@ def Project():
|
||||||
model_name=vals.get('alias_model', 'project.task'),
|
model_name=vals.get('alias_model', 'project.task'),
|
||||||
context=context)
|
context=context)
|
||||||
vals['alias_id'] = alias_id
|
vals['alias_id'] = alias_id
|
||||||
if vals.get('partner_id', False):
|
vals['type'] = 'contract'
|
||||||
vals['type'] = 'contract'
|
|
||||||
project_id = super(project, self).create(cr, uid, vals, context)
|
project_id = super(project, self).create(cr, uid, vals, context)
|
||||||
mail_alias.write(cr, uid, [vals['alias_id']], {'alias_defaults': {'project_id': project_id} }, context)
|
mail_alias.write(cr, uid, [vals['alias_id']], {'alias_defaults': {'project_id': project_id} }, context)
|
||||||
self.create_send_note(cr, uid, [project_id], context=context)
|
self.create_send_note(cr, uid, [project_id], context=context)
|
||||||
|
@ -1426,7 +1425,9 @@ class project_task_history_cumulative(osv.osv):
|
||||||
}
|
}
|
||||||
|
|
||||||
def init(self, cr):
|
def init(self, cr):
|
||||||
cr.execute(""" CREATE OR REPLACE VIEW project_task_history_cumulative AS (
|
tools.drop_view_if_exists(cr, 'report_event_registration')
|
||||||
|
|
||||||
|
cr.execute(""" CREATE VIEW project_task_history_cumulative AS (
|
||||||
SELECT
|
SELECT
|
||||||
history.date::varchar||'-'||history.history_id::varchar AS id,
|
history.date::varchar||'-'||history.history_id::varchar AS id,
|
||||||
history.date AS end_date,
|
history.date AS end_date,
|
||||||
|
|
|
@ -63,7 +63,7 @@
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<form string="Project" version="7.0">
|
<form string="Project" version="7.0">
|
||||||
<header>
|
<header>
|
||||||
<button name="set_done" string="Done" type="object" states="open,pending"/>
|
<button name="set_done" string="Close Project" type="object" states="open,pending"/>
|
||||||
<button name="set_open" string="Re-open project" type="object" states="pending" class="oe_highlight"/>
|
<button name="set_open" string="Re-open project" type="object" states="pending" class="oe_highlight"/>
|
||||||
<button name="set_open" string="Re-open project" type="object" states="cancelled,close"/>
|
<button name="set_open" string="Re-open project" type="object" states="cancelled,close"/>
|
||||||
<button name="set_pending" string="Pending" type="object" states="open"/>
|
<button name="set_pending" string="Pending" type="object" states="open"/>
|
||||||
|
|
|
@ -10,7 +10,7 @@
|
||||||
<field name="name">report.project.task.user.tree</field>
|
<field name="name">report.project.task.user.tree</field>
|
||||||
<field name="model">report.project.task.user</field>
|
<field name="model">report.project.task.user</field>
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<tree string="Tasks Analysis">
|
<tree string="Tasks Analysis" create="false">
|
||||||
<field name="name" invisible="1"/>
|
<field name="name" invisible="1"/>
|
||||||
<field name="project_id" invisible="1"/>
|
<field name="project_id" invisible="1"/>
|
||||||
<field name="user_id" invisible="1"/>
|
<field name="user_id" invisible="1"/>
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
<field name="name">project.issue.report.tree</field>
|
<field name="name">project.issue.report.tree</field>
|
||||||
<field name="model">project.issue.report</field>
|
<field name="model">project.issue.report</field>
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<tree string="Issues Analysis">
|
<tree string="Issues Analysis" create="false">
|
||||||
<field name="name" invisible="1"/>
|
<field name="name" invisible="1"/>
|
||||||
<field name="month" invisible="1"/>
|
<field name="month" invisible="1"/>
|
||||||
<field name="project_id" invisible="1"/>
|
<field name="project_id" invisible="1"/>
|
||||||
|
|
|
@ -31,10 +31,10 @@
|
||||||
</field>
|
</field>
|
||||||
</field>
|
</field>
|
||||||
</record>
|
</record>
|
||||||
<record id="product.product_normal_form_supply_view" model="ir.ui.view">
|
<record id="product_product_normal_form_supply_view" model="ir.ui.view">
|
||||||
<field name="name">product.normal.form.project_mrp.inherit</field>
|
<field name="name">product.normal.form.project_mrp.inherit</field>
|
||||||
<field name="model">product.product</field>
|
<field name="model">product.product</field>
|
||||||
<field name="inherit_id" ref="product.product_normal_form_view"/>
|
<field name="inherit_id" ref="procurement.product_form_view_procurement_button"/>
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<xpath expr="//field[@name='supply_method']" position="attributes">
|
<xpath expr="//field[@name='supply_method']" position="attributes">
|
||||||
<attribute name="invisible">False</attribute>
|
<attribute name="invisible">False</attribute>
|
||||||
|
|
|
@ -20,6 +20,7 @@
|
||||||
##############################################################################
|
##############################################################################
|
||||||
|
|
||||||
from osv import fields, osv
|
from osv import fields, osv
|
||||||
|
from tools.translate import _
|
||||||
|
|
||||||
class procurement_order(osv.osv):
|
class procurement_order(osv.osv):
|
||||||
_name = "procurement.order"
|
_name = "procurement.order"
|
||||||
|
@ -83,10 +84,15 @@ class procurement_order(osv.osv):
|
||||||
'project_id': project and project.id or False,
|
'project_id': project and project.id or False,
|
||||||
'company_id': procurement.company_id.id,
|
'company_id': procurement.company_id.id,
|
||||||
},context=context)
|
},context=context)
|
||||||
self.write(cr, uid, [procurement.id], {'task_id': task_id, 'state': 'running', 'message':'from project: task created.'}, context=context)
|
self.write(cr, uid, [procurement.id], {'task_id': task_id, 'state': 'running', 'message':_('Task created.')}, context=context)
|
||||||
self.running_send_note(cr, uid, ids, context=None)
|
self.project_task_create_note(cr, uid, ids, context=context)
|
||||||
return task_id
|
return task_id
|
||||||
|
|
||||||
|
def project_task_create_note(self, cr, uid, ids, context=None):
|
||||||
|
for procurement in self.browse(cr, uid, ids, context=context):
|
||||||
|
body = _("Task created")
|
||||||
|
self.message_post(cr, uid, [procurement.id], body=body, context=context)
|
||||||
|
|
||||||
procurement_order()
|
procurement_order()
|
||||||
|
|
||||||
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
||||||
|
|
|
@ -1084,7 +1084,7 @@ class procurement_order(osv.osv):
|
||||||
}
|
}
|
||||||
res[procurement.id] = self.create_procurement_purchase_order(cr, uid, procurement, po_vals, line_vals, context=new_context)
|
res[procurement.id] = self.create_procurement_purchase_order(cr, uid, procurement, po_vals, line_vals, context=new_context)
|
||||||
self.write(cr, uid, [procurement.id], {'state': 'running', 'purchase_id': res[procurement.id]})
|
self.write(cr, uid, [procurement.id], {'state': 'running', 'purchase_id': res[procurement.id]})
|
||||||
self.running_send_note(cr, uid, [procurement.id], context=context)
|
self.purchase_order_create_note(cr, uid, ids, context=context)
|
||||||
return res
|
return res
|
||||||
|
|
||||||
def _product_virtual_get(self, cr, uid, order_point):
|
def _product_virtual_get(self, cr, uid, order_point):
|
||||||
|
@ -1093,6 +1093,11 @@ class procurement_order(osv.osv):
|
||||||
return None
|
return None
|
||||||
return super(procurement_order, self)._product_virtual_get(cr, uid, order_point)
|
return super(procurement_order, self)._product_virtual_get(cr, uid, order_point)
|
||||||
|
|
||||||
|
def purchase_order_create_note(self, cr, uid, ids, context=None):
|
||||||
|
for procurement in self.browse(cr, uid, ids, context=context):
|
||||||
|
body = _("Draft Purchase Order created")
|
||||||
|
self.message_post(cr, uid, [procurement.id], body=body, context=context)
|
||||||
|
|
||||||
procurement_order()
|
procurement_order()
|
||||||
|
|
||||||
class mail_mail(osv.osv):
|
class mail_mail(osv.osv):
|
||||||
|
@ -1107,4 +1112,16 @@ class mail_mail(osv.osv):
|
||||||
|
|
||||||
mail_mail()
|
mail_mail()
|
||||||
|
|
||||||
|
class product_template(osv.osv):
|
||||||
|
_name = 'product.template'
|
||||||
|
_inherit = 'product.template'
|
||||||
|
_columns = {
|
||||||
|
'purchase_ok': fields.boolean('Can be Purchased', help="Determine if the product is visible in the list of products within a selection from a purchase order line."),
|
||||||
|
}
|
||||||
|
_defaults = {
|
||||||
|
'purchase_ok': 1,
|
||||||
|
}
|
||||||
|
|
||||||
|
product_template()
|
||||||
|
|
||||||
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
||||||
|
|
|
@ -14,6 +14,9 @@
|
||||||
<field eval="80.0" name="schedule_range"/>
|
<field eval="80.0" name="schedule_range"/>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
|
<record id="product.product_product_consultant" model="product.product">
|
||||||
|
<field eval="False" name="purchase_ok"/>
|
||||||
|
</record>
|
||||||
</data>
|
</data>
|
||||||
</openerp>
|
</openerp>
|
||||||
|
|
||||||
|
|
|
@ -198,8 +198,9 @@
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<form string="Purchase Order" version="7.0">
|
<form string="Purchase Order" version="7.0">
|
||||||
<header>
|
<header>
|
||||||
<button name="purchase_confirm" states="draft,sent" string="Confirm Order" class="oe_highlight"/>
|
<button name="wkf_send_rfq" states="draft" string="Send RFQ" type="object" context="{'send_rfq':True}" class="oe_highlight"/>
|
||||||
<button name="wkf_send_rfq" states="draft" string="Send RFQ" type="object" context="{'send_rfq':True}"/>
|
<button name="purchase_confirm" states="draft" string="Confirm Order"/>
|
||||||
|
<button name="purchase_confirm" states="sent" string="Confirm Order" class="oe_highlight"/>
|
||||||
<button name="wkf_send_rfq" states="confirmed" string="Resend Purchase Order" type="object" class="oe_highlight"/>
|
<button name="wkf_send_rfq" states="confirmed" string="Resend Purchase Order" type="object" class="oe_highlight"/>
|
||||||
<button name="action_cancel" states="except_picking,except_invoice" string="Cancel" type="object" />
|
<button name="action_cancel" states="except_picking,except_invoice" string="Cancel" type="object" />
|
||||||
<button name="picking_ok" states="except_picking" string="Manually Corrected"/>
|
<button name="picking_ok" states="except_picking" string="Manually Corrected"/>
|
||||||
|
@ -590,10 +591,22 @@
|
||||||
<field name="model">product.product</field>
|
<field name="model">product.product</field>
|
||||||
<field name="inherit_id" ref="product.product_normal_form_view"/>
|
<field name="inherit_id" ref="product.product_normal_form_view"/>
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
|
<div name="options" position="inside">
|
||||||
|
<field name="purchase_ok"/>
|
||||||
|
<label for="purchase_ok"/>
|
||||||
|
</div>
|
||||||
<group name="procurement" position="after">
|
<group name="procurement" position="after">
|
||||||
<separator string="Suppliers"/>
|
<separator string="Suppliers"/>
|
||||||
<field name="seller_ids" context="{'uom_id': uom_id}"/>
|
<field name="seller_ids" context="{'uom_id': uom_id}"/>
|
||||||
</group>
|
</group>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="product_product_normal_form_procurement_help_view" model="ir.ui.view">
|
||||||
|
<field name="name">product.normal.form.procurement.help.inherit</field>
|
||||||
|
<field name="model">product.product</field>
|
||||||
|
<field name="inherit_id" ref="procurement.product_form_view_procurement_button"/>
|
||||||
|
<field name="arch" type="xml">
|
||||||
<group name="procurement_help" position="inside">
|
<group name="procurement_help" position="inside">
|
||||||
<p attrs="{'invisible': [('type','<>','service'),('procure_method','<>','make_to_order'),('supply_method','<>','buy')]}">
|
<p attrs="{'invisible': [('type','<>','service'),('procure_method','<>','make_to_order'),('supply_method','<>','buy')]}">
|
||||||
When you sell this service to a customer, <b>a draft purchase order</b>
|
When you sell this service to a customer, <b>a draft purchase order</b>
|
||||||
|
@ -610,5 +623,45 @@
|
||||||
</group>
|
</group>
|
||||||
</field>
|
</field>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
|
<record id="product_search_form_view_purchase" model="ir.ui.view">
|
||||||
|
<field name="name">product.search.purchase.form</field>
|
||||||
|
<field name="model">product.product</field>
|
||||||
|
<field name="inherit_id" ref="product.product_search_form_view"/>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<filter name="filter_to_sell" position="before">
|
||||||
|
<filter name="filter_to_purchase" string="To Purchase" icon="terp-accessories-archiver+" domain="[('purchase_ok', '=', 1)]"/>
|
||||||
|
</filter>
|
||||||
|
<filter name="filter_to_sell" position="after">
|
||||||
|
<filter name="filter_to_purchase" string="Can be Purchased" icon="terp-accessories-archiver+" domain="[('purchase_ok', '=', 1)]"/>
|
||||||
|
</filter>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="view_template_purchase_ok_form" model="ir.ui.view">
|
||||||
|
<field name="name">product.template.purchase.ok.form.inherit</field>
|
||||||
|
<field name="model">product.template</field>
|
||||||
|
<field name="inherit_id" ref="product.product_template_form_view"/>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<field name="sale_ok" position="after">
|
||||||
|
<field name="purchase_ok"/>
|
||||||
|
</field>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="view_product_account_purchase_ok_form" model="ir.ui.view">
|
||||||
|
<field name="name">product.account.purchase.ok.form.inherit</field>
|
||||||
|
<field name="model">product.product</field>
|
||||||
|
<field name="inherit_id" ref="account.product_normal_form_view"/>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<xpath expr="//field[@name='property_account_expense']" position="replace" >
|
||||||
|
<field name="property_account_expense" domain="[('type','<>','view'),('type','<>','consolidation')]" attrs="{'readonly':[('purchase_ok','=',0)]}" />
|
||||||
|
</xpath>
|
||||||
|
<xpath expr="//field[@name='supplier_taxes_id']" position="replace" >
|
||||||
|
<field name="supplier_taxes_id" colspan="2" widget="many2many_tags" attrs="{'readonly':[('purchase_ok','=',0)]}"/>
|
||||||
|
</xpath>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
</data>
|
</data>
|
||||||
</openerp>
|
</openerp>
|
||||||
|
|
|
@ -16,7 +16,7 @@
|
||||||
<field name="name">purchase.order.tree</field>
|
<field name="name">purchase.order.tree</field>
|
||||||
<field name="model">purchase.report</field>
|
<field name="model">purchase.report</field>
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<tree string="Purchase Orders Statistics">
|
<tree string="Purchase Orders Statistics" create="false">
|
||||||
<field name="date" invisible="1"/>
|
<field name="date" invisible="1"/>
|
||||||
<field name="date_approve" invisible="1"/>
|
<field name="date_approve" invisible="1"/>
|
||||||
<field name="expected_date" invisible="1"/>
|
<field name="expected_date" invisible="1"/>
|
||||||
|
|
|
@ -180,7 +180,7 @@
|
||||||
<record model="ir.ui.view" id="product_normal_form_view_inherit">
|
<record model="ir.ui.view" id="product_normal_form_view_inherit">
|
||||||
<field name="name">product.form.inherit</field>
|
<field name="name">product.form.inherit</field>
|
||||||
<field name="model">product.product</field>
|
<field name="model">product.product</field>
|
||||||
<field name="inherit_id" ref="product.product_normal_form_view"/>
|
<field name="inherit_id" ref="procurement.product_form_view_procurement_button"/>
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<field name="procure_method" position="before">
|
<field name="procure_method" position="before">
|
||||||
<field name="purchase_requisition"/>
|
<field name="purchase_requisition"/>
|
||||||
|
|
|
@ -75,7 +75,7 @@
|
||||||
<field name="name">report.intrastat.view</field>
|
<field name="name">report.intrastat.view</field>
|
||||||
<field name="model">report.intrastat</field>
|
<field name="model">report.intrastat</field>
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<tree string="Intrastat Data">
|
<tree string="Intrastat Data" create="false">
|
||||||
<field name="name" />
|
<field name="name" />
|
||||||
<field name="month"/>
|
<field name="month"/>
|
||||||
<field name="code"/>
|
<field name="code"/>
|
||||||
|
|
|
@ -7,7 +7,7 @@
|
||||||
<field name="name">sale.report.tree</field>
|
<field name="name">sale.report.tree</field>
|
||||||
<field name="model">sale.report</field>
|
<field name="model">sale.report</field>
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<tree string="Sales Analysis">
|
<tree string="Sales Analysis" create="false">
|
||||||
<field name="date" invisible="1"/>
|
<field name="date" invisible="1"/>
|
||||||
<field name="user_id" invisible="1"/>
|
<field name="user_id" invisible="1"/>
|
||||||
<field name="year" invisible="1"/>
|
<field name="year" invisible="1"/>
|
||||||
|
|
|
@ -48,9 +48,6 @@ class sale_configuration(osv.osv_memory):
|
||||||
'group_uom':fields.boolean("Allow using different units of measures",
|
'group_uom':fields.boolean("Allow using different units of measures",
|
||||||
implied_group='product.group_uom',
|
implied_group='product.group_uom',
|
||||||
help="""Allows you to select and maintain different units of measure for products."""),
|
help="""Allows you to select and maintain different units of measure for products."""),
|
||||||
'group_sale_delivery_address': fields.boolean("Allow a different address for delivery and invoicing ",
|
|
||||||
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("Allow setting a discount on the sale order lines",
|
'group_discount_per_so_line': fields.boolean("Allow setting a discount on the sale order lines",
|
||||||
implied_group='sale.group_discount_per_so_line',
|
implied_group='sale.group_discount_per_so_line',
|
||||||
help="Allows you to apply some discount per sale order line."),
|
help="Allows you to apply some discount per sale order line."),
|
||||||
|
|
|
@ -12,6 +12,10 @@
|
||||||
<group>
|
<group>
|
||||||
<label for="id" string="Invoicing Process"/>
|
<label for="id" string="Invoicing Process"/>
|
||||||
<div>
|
<div>
|
||||||
|
<div name="group_invoice_so_lines">
|
||||||
|
<field name="group_invoice_so_lines" class="oe_inline"/>
|
||||||
|
<label for="group_invoice_so_lines"/>
|
||||||
|
</div>
|
||||||
<div name="timesheet">
|
<div name="timesheet">
|
||||||
<field name="timesheet" class="oe_inline" on_change="onchange_timesheet(timesheet)"/>
|
<field name="timesheet" class="oe_inline" on_change="onchange_timesheet(timesheet)"/>
|
||||||
<label for="timesheet"/>
|
<label for="timesheet"/>
|
||||||
|
@ -29,10 +33,6 @@
|
||||||
</group>
|
</group>
|
||||||
</div>
|
</div>
|
||||||
<div name="Customer Features" position="inside">
|
<div name="Customer Features" position="inside">
|
||||||
<div>
|
|
||||||
<field name="group_sale_delivery_address" class="oe_inline"/>
|
|
||||||
<label for="group_sale_delivery_address"/>
|
|
||||||
</div>
|
|
||||||
<div>
|
<div>
|
||||||
<field name="group_sale_pricelist" class="oe_inline"/>
|
<field name="group_sale_pricelist" class="oe_inline"/>
|
||||||
<label for="group_sale_pricelist"/>
|
<label for="group_sale_pricelist"/>
|
||||||
|
|
|
@ -751,13 +751,13 @@ class sale_order_line(osv.osv):
|
||||||
if (line.order_id.invoice_quantity=='order'):
|
if (line.order_id.invoice_quantity=='order'):
|
||||||
if line.product_uos:
|
if line.product_uos:
|
||||||
return line.product_uos_qty or 0.0
|
return line.product_uos_qty or 0.0
|
||||||
return line.product_uom_qty
|
return line.product_uom_qty
|
||||||
|
|
||||||
def _get_line_uom(self, cr, uid, line, context=None):
|
def _get_line_uom(self, cr, uid, line, context=None):
|
||||||
if (line.order_id.invoice_quantity=='order'):
|
if (line.order_id.invoice_quantity=='order'):
|
||||||
if line.product_uos:
|
if line.product_uos:
|
||||||
return line.product_uos.id
|
return line.product_uos.id
|
||||||
return line.product_uom.id
|
return line.product_uom.id
|
||||||
|
|
||||||
def _prepare_order_line_invoice_line(self, cr, uid, line, account_id=False, context=None):
|
def _prepare_order_line_invoice_line(self, cr, uid, line, account_id=False, context=None):
|
||||||
"""Prepare the dict of values to create the new invoice line for a
|
"""Prepare the dict of values to create the new invoice line for a
|
||||||
|
|
|
@ -174,9 +174,9 @@
|
||||||
</h1>
|
</h1>
|
||||||
<group>
|
<group>
|
||||||
<group>
|
<group>
|
||||||
<field name="partner_id" on_change="onchange_partner_id(partner_id)" domain="[('customer','=',True)]" context="{'search_default_customer':1}"/>
|
<field name="partner_id" on_change="onchange_partner_id(partner_id)" domain="[('customer','=',True)]" context="{'search_default_customer':1, 'show_address': 1}" options='{"always_reload": True}'/>
|
||||||
<field name="partner_invoice_id" groups="sale.group_delivery_invoice_address"/>
|
<field name="partner_invoice_id" groups="sale.group_delivery_invoice_address" context="{'default_type':'invoice'}"/>
|
||||||
<field name="partner_shipping_id" groups="sale.group_delivery_invoice_address"/>
|
<field name="partner_shipping_id" groups="sale.group_delivery_invoice_address" context="{'default_type':'delivery'}"/>
|
||||||
<field name="project_id" context="{'partner_id':partner_id, 'pricelist_id':pricelist_id, 'default_name':name}" groups="sale.group_analytic_accounting" domain="[('type','in',['view','normal','contract'])]"/>
|
<field name="project_id" context="{'partner_id':partner_id, 'pricelist_id':pricelist_id, 'default_name':name}" groups="sale.group_analytic_accounting" domain="[('type','in',['view','normal','contract'])]"/>
|
||||||
</group>
|
</group>
|
||||||
<group>
|
<group>
|
||||||
|
|
|
@ -9,8 +9,8 @@
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<data>
|
<data>
|
||||||
<xpath expr="/form/header/button[@name='case_mark_lost']" position="after">
|
<xpath expr="/form/header/button[@name='case_mark_lost']" position="after">
|
||||||
<button states="done" string="Convert to Quotation" name="%(action_crm_make_sale)d" type="action" class="oe_highlight"/>
|
<button states="done" string="Create Quotation" name="%(action_crm_make_sale)d" type="action"/>
|
||||||
<button states="draft,open,pending" string="Convert to Quotation" name="%(action_crm_make_sale)d" type="action"/>
|
<button states="draft,open,pending" string="Convert to Quotation" name="%(action_crm_make_sale)d" type="action" class="oe_highlight"/>
|
||||||
</xpath>
|
</xpath>
|
||||||
</data>
|
</data>
|
||||||
</field>
|
</field>
|
||||||
|
|
|
@ -32,7 +32,7 @@ Price and Cost Price.
|
||||||
'author':'OpenERP SA',
|
'author':'OpenERP SA',
|
||||||
'images':['images/sale_margin.jpeg'],
|
'images':['images/sale_margin.jpeg'],
|
||||||
'depends':['sale_stock'],
|
'depends':['sale_stock'],
|
||||||
'demo':[],
|
'demo':['sale_margin_demo.xml'],
|
||||||
'test': ['test/sale_margin.yml'],
|
'test': ['test/sale_margin.yml'],
|
||||||
'data':['security/ir.model.access.csv','sale_margin_view.xml'],
|
'data':['security/ir.model.access.csv','sale_margin_view.xml'],
|
||||||
'auto_install': False,
|
'auto_install': False,
|
||||||
|
|
|
@ -0,0 +1,46 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<openerp>
|
||||||
|
<data noupdate="1">
|
||||||
|
|
||||||
|
<record id="sale.sale_order_line_1" model="sale.order.line">
|
||||||
|
<field name="purchase_price">2870.00</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="sale.sale_order_line_2" model="sale.order.line">
|
||||||
|
<field name="purchase_price">126.00</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="sale.sale_order_line_3" model="sale.order.line">
|
||||||
|
<field name="purchase_price">60.00</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="sale.sale_order_line_12" model="sale.order.line">
|
||||||
|
<field name="purchase_price">390.00</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="sale.sale_order_line_13" model="sale.order.line">
|
||||||
|
<field name="purchase_price">21.60</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="sale.sale_order_line_14" model="sale.order.line">
|
||||||
|
<field name="purchase_price">4258.00</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="sale.sale_order_line_16" model="sale.order.line">
|
||||||
|
<field name="purchase_price">2870.00</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="sale.sale_order_line_17" model="sale.order.line">
|
||||||
|
<field name="purchase_price">155.00</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="sale.sale_order_line_18" model="sale.order.line">
|
||||||
|
<field name="purchase_price">35.00</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="sale.sale_order_line_19" model="sale.order.line">
|
||||||
|
<field name="purchase_price">13.00</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
</data>
|
||||||
|
</openerp>
|
|
@ -27,6 +27,9 @@ class sale_configuration(osv.osv_memory):
|
||||||
_inherit = 'sale.config.settings'
|
_inherit = 'sale.config.settings'
|
||||||
|
|
||||||
_columns = {
|
_columns = {
|
||||||
|
'group_sale_delivery_address': fields.boolean("Allow a different address for delivery and invoicing ",
|
||||||
|
implied_group='sale.group_delivery_invoice_address',
|
||||||
|
help="Allows you to specify different delivery and invoice addresses on a sale order."),
|
||||||
'group_invoice_deli_orders': fields.boolean('Generate invoices after and based on delivery orders',
|
'group_invoice_deli_orders': fields.boolean('Generate invoices after and based on delivery orders',
|
||||||
implied_group='sale_stock.group_invoice_deli_orders',
|
implied_group='sale_stock.group_invoice_deli_orders',
|
||||||
help="To allow your salesman to make invoices for Delivery Orders using the menu 'Deliveries to Invoice'."),
|
help="To allow your salesman to make invoices for Delivery Orders using the menu 'Deliveries to Invoice'."),
|
||||||
|
|
|
@ -8,11 +8,19 @@
|
||||||
<field name="inherit_id" ref="sale.view_sales_config"/>
|
<field name="inherit_id" ref="sale.view_sales_config"/>
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<data>
|
<data>
|
||||||
<xpath expr="//div[@name='timesheet']" position="before">
|
<xpath expr="//div[@name='Customer Features']" position="inside">
|
||||||
|
<div>
|
||||||
|
<field name="group_sale_delivery_address" class="oe_inline"/>
|
||||||
|
<label for="group_sale_delivery_address"/>
|
||||||
|
</div>
|
||||||
|
</xpath>
|
||||||
|
<xpath expr="//div[@name='group_invoice_so_lines']" position="replace">
|
||||||
<div>
|
<div>
|
||||||
<field name="group_invoice_so_lines" on_change="onchange_invoice_methods(group_invoice_so_lines, group_invoice_deli_orders)" class="oe_inline"/>
|
<field name="group_invoice_so_lines" on_change="onchange_invoice_methods(group_invoice_so_lines, group_invoice_deli_orders)" class="oe_inline"/>
|
||||||
<label for="group_invoice_so_lines"/>
|
<label for="group_invoice_so_lines"/>
|
||||||
</div>
|
</div>
|
||||||
|
</xpath>
|
||||||
|
<xpath expr="//div[@name='timesheet']" position="before">
|
||||||
<div>
|
<div>
|
||||||
<field name="group_invoice_deli_orders" class="oe_inline" on_change="onchange_invoice_methods(group_invoice_so_lines, group_invoice_deli_orders)"/>
|
<field name="group_invoice_deli_orders" class="oe_inline" on_change="onchange_invoice_methods(group_invoice_so_lines, group_invoice_deli_orders)"/>
|
||||||
<label for="group_invoice_deli_orders"/>
|
<label for="group_invoice_deli_orders"/>
|
||||||
|
|
|
@ -153,13 +153,14 @@ class stock_picking(osv.osv):
|
||||||
inv_name = picking.sale_id.client_order_ref + " : " + invoice_created.name
|
inv_name = picking.sale_id.client_order_ref + " : " + invoice_created.name
|
||||||
invoice_obj.write(cursor, user, [invoice_created.id], {'name': inv_name}, context=context)
|
invoice_obj.write(cursor, user, [invoice_created.id], {'name': inv_name}, context=context)
|
||||||
for sale_line in sale_lines:
|
for sale_line in sale_lines:
|
||||||
|
account_id = False
|
||||||
|
if not type:
|
||||||
|
type = context.get('inv_type', False)
|
||||||
|
if group:
|
||||||
|
name = picking.name + '-' + sale_line.name
|
||||||
|
else:
|
||||||
|
name = sale_line.name
|
||||||
if sale_line.product_id.type == 'service' and sale_line.invoiced == False:
|
if sale_line.product_id.type == 'service' and sale_line.invoiced == False:
|
||||||
if not type:
|
|
||||||
type = context.get('inv_type', False)
|
|
||||||
if group:
|
|
||||||
name = picking.name + '-' + sale_line.name
|
|
||||||
else:
|
|
||||||
name = sale_line.name
|
|
||||||
if type in ('out_invoice', 'out_refund'):
|
if type in ('out_invoice', 'out_refund'):
|
||||||
account_id = sale_line.product_id.product_tmpl_id.\
|
account_id = sale_line.product_id.product_tmpl_id.\
|
||||||
property_account_income.id
|
property_account_income.id
|
||||||
|
@ -173,16 +174,16 @@ class stock_picking(osv.osv):
|
||||||
account_id = sale_line.product_id.categ_id.\
|
account_id = sale_line.product_id.categ_id.\
|
||||||
property_account_expense_categ.id
|
property_account_expense_categ.id
|
||||||
|
|
||||||
vals = order_line_obj._prepare_order_line_invoice_line(cursor, user, sale_line, account_id, context)
|
vals = order_line_obj._prepare_order_line_invoice_line(cursor, user, sale_line, account_id, context)
|
||||||
if vals: #note: in some cases we may not want to include all service lines as invoice lines
|
if vals: #note: in some cases we may not want to include all service lines as invoice lines
|
||||||
vals['name'] = name
|
vals['name'] = name
|
||||||
vals['account_analytic_id'] = self._get_account_analytic_invoice(cursor, user, picking, sale_line)
|
vals['account_analytic_id'] = self._get_account_analytic_invoice(cursor, user, picking, sale_line)
|
||||||
vals['invoice_id'] = invoices[result[picking.id]].id
|
vals['invoice_id'] = invoices[result[picking.id]].id
|
||||||
invoice_line_id = invoice_line_obj.create(cursor, user, vals, context=context)
|
invoice_line_id = invoice_line_obj.create(cursor, user, vals, context=context)
|
||||||
order_line_obj.write(cursor, user, [sale_line.id], {
|
order_line_obj.write(cursor, user, [sale_line.id], {
|
||||||
'invoiced': True,
|
'invoiced': True,
|
||||||
'invoice_lines': [(6, 0, [invoice_line_id])],
|
'invoice_lines': [(6, 0, [invoice_line_id])],
|
||||||
})
|
})
|
||||||
return result
|
return result
|
||||||
|
|
||||||
# Redefinition of the new field in order to update the model stock.picking.out in the orm
|
# Redefinition of the new field in order to update the model stock.picking.out in the orm
|
||||||
|
|
|
@ -513,8 +513,15 @@ class product_template(osv.osv):
|
||||||
string='Stock Output Account', view_load=True,
|
string='Stock Output Account', view_load=True,
|
||||||
help="When doing real-time inventory valuation, counterpart journal items for all outgoing stock moves will be posted in this account, unless "
|
help="When doing real-time inventory valuation, counterpart journal items for all outgoing stock moves will be posted in this account, unless "
|
||||||
"there is a specific valuation account set on the destination location. When not set on the product, the one from the product category is used."),
|
"there is a specific valuation account set on the destination location. When not set on the product, the one from the product category is used."),
|
||||||
|
'sale_delay': fields.float('Customer Lead Time', help="This is the average delay in days between the confirmation of the customer order and the delivery of the finished products. It's the time you promise to your customers."),
|
||||||
|
'loc_rack': fields.char('Rack', size=16),
|
||||||
|
'loc_row': fields.char('Row', size=16),
|
||||||
|
'loc_case': fields.char('Case', size=16),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_defaults = {
|
||||||
|
'sale_delay': 7,
|
||||||
|
}
|
||||||
product_template()
|
product_template()
|
||||||
|
|
||||||
class product_category(osv.osv):
|
class product_category(osv.osv):
|
||||||
|
|
|
@ -35,6 +35,16 @@
|
||||||
<field name="model">product.template</field>
|
<field name="model">product.template</field>
|
||||||
<field name="inherit_id" ref="product.product_template_form_view"/>
|
<field name="inherit_id" ref="product.product_template_form_view"/>
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
|
<group name="delay" position="inside">
|
||||||
|
<field name="sale_delay" attrs="{'readonly':[('sale_ok','=',False)]}"/>
|
||||||
|
</group>
|
||||||
|
<group name="delay" position="after">
|
||||||
|
<group name="store" string="Storage Localisation">
|
||||||
|
<field name="loc_rack"/>
|
||||||
|
<field name="loc_row"/>
|
||||||
|
<field name="loc_case"/>
|
||||||
|
</group>
|
||||||
|
</group>
|
||||||
<page position="after" string="Information">
|
<page position="after" string="Information">
|
||||||
<page string="Properties">
|
<page string="Properties">
|
||||||
<group string="Counter-Part Locations Properties" groups="stock.group_locations">
|
<group string="Counter-Part Locations Properties" groups="stock.group_locations">
|
||||||
|
@ -56,7 +66,7 @@
|
||||||
<field name="model">product.product</field>
|
<field name="model">product.product</field>
|
||||||
<field name="inherit_id" ref="product.product_normal_form_view"/>
|
<field name="inherit_id" ref="product.product_normal_form_view"/>
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<group name="procurement_help" position="after">
|
<group name="procurement_uom" position="before">
|
||||||
<group name="delay" string="Delays">
|
<group name="delay" string="Delays">
|
||||||
<label for="produce_delay" attrs="{'invisible':[('type','=','service')]}"/>
|
<label for="produce_delay" attrs="{'invisible':[('type','=','service')]}"/>
|
||||||
<div attrs="{'invisible':[('type','=','service')]}">
|
<div attrs="{'invisible':[('type','=','service')]}">
|
||||||
|
@ -65,12 +75,45 @@
|
||||||
<field name="active"/>
|
<field name="active"/>
|
||||||
</group>
|
</group>
|
||||||
</group>
|
</group>
|
||||||
<group name="inventory" position="inside">
|
<xpath expr="//group[@string='Sale Conditions']" position="inside">
|
||||||
<group name="store" groups="stock.group_locations" string="Counter-Part Locations Properties">
|
<label for="sale_delay"/>
|
||||||
<field name="property_stock_procurement" attrs="{'readonly':[('type','=','service')]}" domain="[('usage','=','procurement')]"/>
|
<div>
|
||||||
<field name="property_stock_production" attrs="{'readonly':[('type','=','service')]}" domain="[('usage','=','production')]"/>
|
<field name="sale_delay" class="oe_inline"/> days
|
||||||
<field name="property_stock_inventory" attrs="{'readonly':[('type','=','service')]}" domain="[('usage','=','inventory')]"/>
|
</div>
|
||||||
|
</xpath>
|
||||||
|
<group name="status" position="before" version="7.0">
|
||||||
|
<group string="Stock and Expected Variations" attrs="{'invisible': [('type', '=', 'service')]}" groups="base.group_user">
|
||||||
|
<label for="qty_available"/>
|
||||||
|
<div>
|
||||||
|
<field name="qty_available" class="oe_inline"/>
|
||||||
|
<button name="%(action_view_change_product_quantity)d" string="update"
|
||||||
|
type="action"
|
||||||
|
class="oe_link"/>
|
||||||
|
</div>
|
||||||
|
<field name="incoming_qty" class="oe_inline"/>
|
||||||
|
<field name="outgoing_qty" class="oe_inline"/>
|
||||||
|
<field name="virtual_available" class="oe_inline"/>
|
||||||
</group>
|
</group>
|
||||||
|
<group name="lot" groups="stock.group_tracking_lot,stock.group_production_lot" string="Lots">
|
||||||
|
<field name="track_production" groups="stock.group_production_lot"/>
|
||||||
|
<field name="track_incoming" groups="stock.group_tracking_lot"/>
|
||||||
|
<field name="track_outgoing" groups="stock.group_tracking_lot"/>
|
||||||
|
</group>
|
||||||
|
</group>
|
||||||
|
<group name="status" position="after" version="7.0">
|
||||||
|
<group name="store" string="Storage Localisation">
|
||||||
|
<field name="company_id" groups="base.group_multi_company" widget="selection"/>
|
||||||
|
<field name="loc_rack" attrs="{'invisible':[('type','=','service')]}"/>
|
||||||
|
<field name="loc_row" attrs="{'invisible':[('type','=','service')]}"/>
|
||||||
|
<field name="loc_case" attrs="{'invisible':[('type','=','service')]}"/>
|
||||||
|
</group>
|
||||||
|
</group>
|
||||||
|
<group name="Weights" position="after">
|
||||||
|
<group name="store" groups="stock.group_locations" string="Counter-Part Locations Properties">
|
||||||
|
<field name="property_stock_procurement" attrs="{'readonly':[('type','=','service')]}" domain="[('usage','=','procurement')]"/>
|
||||||
|
<field name="property_stock_production" attrs="{'readonly':[('type','=','service')]}" domain="[('usage','=','production')]"/>
|
||||||
|
<field name="property_stock_inventory" attrs="{'readonly':[('type','=','service')]}" domain="[('usage','=','inventory')]"/>
|
||||||
|
</group>
|
||||||
</group>
|
</group>
|
||||||
</field>
|
</field>
|
||||||
</record>
|
</record>
|
||||||
|
@ -116,32 +159,6 @@
|
||||||
</field>
|
</field>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
<record id="view_normal_stock_property_form" model="ir.ui.view">
|
|
||||||
<field name="name">product.normal.stock.form.inherit</field>
|
|
||||||
<field name="model">product.product</field>
|
|
||||||
<field name="inherit_id" ref="product.product_normal_form_view"/>
|
|
||||||
<field name="arch" type="xml">
|
|
||||||
<group name="status" position="before" version="7.0">
|
|
||||||
<group string="Stock and Expected Variations" attrs="{'invisible': [('type', '=', 'service')]}" groups="base.group_user">
|
|
||||||
<label for="qty_available"/>
|
|
||||||
<div>
|
|
||||||
<field name="qty_available" class="oe_inline"/>
|
|
||||||
<button name="%(action_view_change_product_quantity)d" string="update"
|
|
||||||
type="action"
|
|
||||||
class="oe_link"/>
|
|
||||||
</div>
|
|
||||||
<field name="incoming_qty" class="oe_inline"/>
|
|
||||||
<field name="outgoing_qty" class="oe_inline"/>
|
|
||||||
<field name="virtual_available" class="oe_inline"/>
|
|
||||||
</group>
|
|
||||||
<group name="lot" groups="stock.group_tracking_lot,stock.group_production_lot" string="Lots">
|
|
||||||
<field name="track_production" groups="stock.group_production_lot"/>
|
|
||||||
<field name="track_incoming" groups="stock.group_tracking_lot"/>
|
|
||||||
<field name="track_outgoing" groups="stock.group_tracking_lot"/>
|
|
||||||
</group>
|
|
||||||
</group>
|
|
||||||
</field>
|
|
||||||
</record>
|
|
||||||
|
|
||||||
<record id="action_receive_move" model="ir.actions.act_window">
|
<record id="action_receive_move" model="ir.actions.act_window">
|
||||||
<field name="name">Receptions</field>
|
<field name="name">Receptions</field>
|
||||||
|
|
|
@ -13,7 +13,7 @@
|
||||||
<field name="name">report.stock.move.tree</field>
|
<field name="name">report.stock.move.tree</field>
|
||||||
<field name="model">report.stock.move</field>
|
<field name="model">report.stock.move</field>
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<tree string="Moves Analysis">
|
<tree string="Moves Analysis" create="false">
|
||||||
<field name="date" invisible="1"/>
|
<field name="date" invisible="1"/>
|
||||||
<field name="year" invisible="1" />
|
<field name="year" invisible="1" />
|
||||||
<field name="month" invisible="1"/>
|
<field name="month" invisible="1"/>
|
||||||
|
@ -105,7 +105,7 @@
|
||||||
<field name="name">report.stock.inventory.tree</field>
|
<field name="name">report.stock.inventory.tree</field>
|
||||||
<field name="model">report.stock.inventory</field>
|
<field name="model">report.stock.inventory</field>
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<tree string="Inventory Analysis">
|
<tree string="Inventory Analysis" create="false">
|
||||||
<field name="date" invisible="1"/>
|
<field name="date" invisible="1"/>
|
||||||
<field name="year" invisible="1" />
|
<field name="year" invisible="1" />
|
||||||
<field name="month" invisible="1"/>
|
<field name="month" invisible="1"/>
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue