[MERGE] latest trunk

bzr revid: abo@openerp.com-20120920145753-2izkiam4sf8t53of
This commit is contained in:
Antonin Bourguignon 2012-09-20 16:57:53 +02:00
commit c7b1d6cb63
69 changed files with 462 additions and 1183 deletions

View File

@ -836,6 +836,8 @@ class account_journal(osv.osv):
@return: Returns a list of tupples containing id, name @return: Returns a list of tupples containing id, name
""" """
if not ids:
return []
if isinstance(ids, (int, long)): if isinstance(ids, (int, long)):
ids = [ids] ids = [ids]
result = self.browse(cr, user, ids, context=context) result = self.browse(cr, user, ids, context=context)

View File

@ -1103,10 +1103,10 @@ class account_invoice(osv.osv):
if not ids: if not ids:
return [] return []
types = { types = {
'out_invoice': 'CI: ', 'out_invoice': 'Invoice ',
'in_invoice': 'SI: ', 'in_invoice': 'Sup. Invoice ',
'out_refund': 'OR: ', 'out_refund': 'Refund ',
'in_refund': 'SR: ', 'in_refund': 'Supplier Refund ',
} }
return [(r['id'], (r['number']) or types[r['type']] + (r['name'] or '')) for r in self.read(cr, uid, ids, ['type', 'number', 'name'], context, load='_classic_write')] return [(r['id'], (r['number']) or types[r['type']] + (r['name'] or '')) for r in self.read(cr, uid, ids, ['type', 'number', 'name'], context, load='_classic_write')]

View File

@ -30,7 +30,7 @@
<menuitem id="menu_analytic" parent="menu_analytic_accounting" name="Accounts" groups="analytic.group_analytic_accounting"/> <menuitem id="menu_analytic" parent="menu_analytic_accounting" name="Accounts" groups="analytic.group_analytic_accounting"/>
<menuitem id="menu_journals" sequence="15" name="Journals" parent="menu_finance_configuration" groups="group_account_manager"/> <menuitem id="menu_journals" sequence="15" name="Journals" parent="menu_finance_configuration" groups="group_account_manager"/>
<menuitem id="menu_configuration_misc" name="Miscellaneous" parent="menu_finance_configuration" sequence="55"/> <menuitem id="menu_configuration_misc" name="Miscellaneous" parent="menu_finance_configuration" sequence="55"/>
<menuitem id="base.menu_action_currency_form" parent="menu_configuration_misc" sequence="20" groups="base.group_no_one"/> <menuitem id="base.menu_action_currency_form" name="Currencies" parent="menu_configuration_misc" sequence="20" groups="base.group_no_one"/>
<menuitem id="menu_finance_generic_reporting" name="Generic Reporting" parent="menu_finance_reports" sequence="100"/> <menuitem id="menu_finance_generic_reporting" name="Generic Reporting" parent="menu_finance_reports" sequence="100"/>
<menuitem id="menu_finance_entries" name="Journal Entries" parent="menu_finance" sequence="5" groups="group_account_user,group_account_manager"/> <menuitem id="menu_finance_entries" name="Journal Entries" parent="menu_finance" sequence="5" groups="group_account_user,group_account_manager"/>
<menuitem id="menu_account_reports" name="Financial Reports" parent="menu_finance_configuration" sequence="30" /> <menuitem id="menu_account_reports" name="Financial Reports" parent="menu_finance_configuration" sequence="30" />

View File

@ -215,8 +215,10 @@ class account_move_line(osv.osv):
def _default_get(self, cr, uid, fields, context=None): def _default_get(self, cr, uid, fields, context=None):
if context is None: if context is None:
context = {} context = {}
if not context.get('journal_id', False) and context.get('search_default_journal_id', False): if not context.get('journal_id', False):
context['journal_id'] = context.get('search_default_journal_id') context['journal_id'] = context.get('search_default_journal_id')
if not context.get('period_id', False):
context['period_id'] = context.get('search_default_period_id')
account_obj = self.pool.get('account.account') account_obj = self.pool.get('account.account')
period_obj = self.pool.get('account.period') period_obj = self.pool.get('account.period')
journal_obj = self.pool.get('account.journal') journal_obj = self.pool.get('account.journal')
@ -226,6 +228,9 @@ class account_move_line(osv.osv):
partner_obj = self.pool.get('res.partner') partner_obj = self.pool.get('res.partner')
currency_obj = self.pool.get('res.currency') currency_obj = self.pool.get('res.currency')
context = self.convert_to_period(cr, uid, context) context = self.convert_to_period(cr, uid, context)
#pass the right context when search_defaul_journal_id
if context.get('search_default_journal_id',False):
context['journal_id'] = context.get('search_default_journal_id')
# Compute simple values # Compute simple values
data = super(account_move_line, self).default_get(cr, uid, fields, context=context) data = super(account_move_line, self).default_get(cr, uid, fields, context=context)
# Starts: Manual entry from account.move form # Starts: Manual entry from account.move form
@ -926,6 +931,8 @@ class account_move_line(osv.osv):
return res return res
if (not context.get('journal_id', False)) or (not context.get('period_id', False)): if (not context.get('journal_id', False)) or (not context.get('period_id', False)):
return False return False
if context.get('search_default_journal_id', False):
context['journal_id'] = context.get('search_default_journal_id')
cr.execute('SELECT code FROM account_journal WHERE id = %s', (context['journal_id'], )) cr.execute('SELECT code FROM account_journal WHERE id = %s', (context['journal_id'], ))
j = cr.fetchone()[0] or '' j = cr.fetchone()[0] or ''
cr.execute('SELECT code FROM account_period WHERE id = %s', (context['period_id'], )) cr.execute('SELECT code FROM account_period WHERE id = %s', (context['period_id'], ))

View File

@ -102,6 +102,7 @@
<field name="arch" type="xml"> <field name="arch" type="xml">
<form string="Account Period" version="7.0"> <form string="Account Period" version="7.0">
<header> <header>
<button string="Close Period" name="%(account.action_account_period_close)d" type="action" class="oe_highlight" states="draft"/>
<button name="action_draft" states="done" string="Set to Draft" type="object" groups="account.group_account_manager"/> <button name="action_draft" states="done" string="Set to Draft" type="object" groups="account.group_account_manager"/>
<field name="state" widget="statusbar" nolabel="1"/> <field name="state" widget="statusbar" nolabel="1"/>
</header> </header>
@ -1718,8 +1719,10 @@
<field name="model">account.payment.term.line</field> <field name="model">account.payment.term.line</field>
<field name="arch" type="xml"> <field name="arch" type="xml">
<form string="Payment Term" version="7.0"> <form string="Payment Term" version="7.0">
<field name="name"/> <group>
<field name="sequence"/> <field name="name"/>
<field name="sequence"/>
</group>
<group> <group>
<group string="Amount Computation"> <group string="Amount Computation">
<field name="value"/> <field name="value"/>
@ -1767,12 +1770,11 @@
<field name="model">account.payment.term</field> <field name="model">account.payment.term</field>
<field name="arch" type="xml"> <field name="arch" type="xml">
<form string="Payment Term" version="7.0"> <form string="Payment Term" version="7.0">
<group> <group col="4">
<field name="name"/> <field name="name"/>
<field name="active"/> <field name="active"/>
</group> </group>
<separator string="Description on Invoices"/> <field name="note" placeholder="Note fo the invoice..."/>
<field name="note"/>
<separator string="Computation"/> <separator string="Computation"/>
<field name="line_ids"/> <field name="line_ids"/>
</form> </form>

View File

@ -12,7 +12,7 @@
<field name="active"/> <field name="active"/>
<field name="company_id" widget="selection" groups="base.group_multi_company"/> <field name="company_id" widget="selection" groups="base.group_multi_company"/>
</group> </group>
<separator string="Mapping"/> <separator string="Taxes Mapping"/>
<field name="tax_ids" widget="one2many_list"> <field name="tax_ids" widget="one2many_list">
<tree string="Tax Mapping" editable="bottom"> <tree string="Tax Mapping" editable="bottom">
<field name="tax_src_id" domain="[('parent_id','=',False)]"/> <field name="tax_src_id" domain="[('parent_id','=',False)]"/>
@ -23,6 +23,7 @@
<field name="tax_dest_id" domain="[('parent_id','=',False)]"/> <field name="tax_dest_id" domain="[('parent_id','=',False)]"/>
</form> </form>
</field> </field>
<separator string="Accounts Mapping"/>
<field name="account_ids" widget="one2many_list"> <field name="account_ids" widget="one2many_list">
<tree string="Account Mapping" editable="bottom"> <tree string="Account Mapping" editable="bottom">
<field name="account_src_id"/> <field name="account_src_id"/>
@ -93,8 +94,10 @@
</group> </group>
<field name="bank_ids"> <field name="bank_ids">
<form string="Bank account" version="7.0"> <form string="Bank account" version="7.0">
<field name="state"/> <group col="4">
<field name="acc_number"/> <field name="state"/>
<field name="acc_number"/>
</group>
<group> <group>
<group name="owner" string="Bank Account Owner"> <group name="owner" string="Bank Account Owner">
<field name="partner_id" on_change="onchange_partner_id(partner_id)"/> <field name="partner_id" on_change="onchange_partner_id(partner_id)"/>

View File

@ -92,7 +92,7 @@ class account_move_journal(osv.osv_memory):
journal = False journal = False
if journal_id: if journal_id:
journal = journal_pool.read(cr, uid, journal_id, ['name'], context=context).name journal = journal_pool.read(cr, uid, journal_id, ['name'], context=context).get('name',False)
journal_string = _("Journal: %s") % tools.ustr(journal) journal_string = _("Journal: %s") % tools.ustr(journal)
else: else:
journal_string = _("Journal: All") journal_string = _("Journal: All")

View File

@ -36,6 +36,7 @@ Adds menu to show relevant information to each manager.You can also view the rep
'depends': ['hr_timesheet_invoice', 'sale'], #although sale is technically not required to install this module, all menuitems are located under 'Sales' application 'depends': ['hr_timesheet_invoice', 'sale'], #although sale is technically not required to install this module, all menuitems are located under 'Sales' application
'data': [ 'data': [
'security/ir.model.access.csv', 'security/ir.model.access.csv',
'security/account_analytic_analysis_security.xml',
'account_analytic_analysis_view.xml', 'account_analytic_analysis_view.xml',
'account_analytic_analysis_menu.xml', 'account_analytic_analysis_menu.xml',
'account_analytic_analysis_cron.xml', 'account_analytic_analysis_cron.xml',

View File

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
<record model="res.users" id="base.user_root">
<field eval="[(4,ref('sale.group_analytic_accounting'))]" name="groups_id"/>
</record>
</data>
</openerp>

View File

@ -129,7 +129,7 @@
</group> </group>
</page> </page>
<page string="Depreciation Board"> <page string="Depreciation Board">
<field name="depreciation_line_ids" mode="tree,graph"> <field name="depreciation_line_ids" mode="tree">
<tree string="Depreciation Lines" colors="blue:(move_check == False);black:(move_check == True)"> <tree string="Depreciation Lines" colors="blue:(move_check == False);black:(move_check == True)">
<field name="depreciation_date"/> <field name="depreciation_date"/>
<field name="sequence" invisible="1"/> <field name="sequence" invisible="1"/>
@ -159,11 +159,6 @@
</group> </group>
</group> </group>
</form> </form>
<graph type="bar">
<field name="name"/>
<field name="amount"/>
<field name="depreciated_value"/>
</graph>
</field> </field>
<button type="object" name="compute_depreciation_board" string="Compute" icon="terp-stock_format-scientific" colspan="2" attrs="{'invisible':[('state','=','close')]}"/> <button type="object" name="compute_depreciation_board" string="Compute" icon="terp-stock_format-scientific" colspan="2" attrs="{'invisible':[('state','=','close')]}"/>
</page> </page>

View File

@ -62,12 +62,7 @@
<field name="account_ids"/> <field name="account_ids"/>
</page> </page>
<page string="Budget Lines"> <page string="Budget Lines">
<field name="crossovered_budget_line" widget="one2many_list" mode="graph,tree"> <field name="crossovered_budget_line" widget="one2many_list" mode="tree">
<graph type="bar" string="Lines">
<field name="analytic_account_id" groups="analytic.group_analytic_accounting"/>
<field name="planned_amount" operator="+"/>
<field group="True" name="general_budget_id"/>
</graph>
<tree string="Budget Lines" editable="top"> <tree string="Budget Lines" editable="top">
<field name="crossovered_budget_id"/> <field name="crossovered_budget_id"/>
<field name="analytic_account_id" groups="analytic.group_analytic_accounting" domain="[('parent_id','!=',False)]"/> <field name="analytic_account_id" groups="analytic.group_analytic_accounting" domain="[('parent_id','!=',False)]"/>

View File

@ -22,6 +22,10 @@
<field eval="True" name="global"/> <field eval="True" name="global"/>
<field name="domain_force">['|',('company_id','=',False),('company_id','child_of',[user.company_id.id])]</field> <field name="domain_force">['|',('company_id','=',False),('company_id','child_of',[user.company_id.id])]</field>
</record> </record>
<record model="res.users" id="base.user_root">
<field eval="[(4,ref('analytic.group_analytic_accounting'))]" name="groups_id"/>
</record>
</data> </data>
</openerp> </openerp>

View File

@ -404,9 +404,9 @@
<field name="name"/> <field name="name"/>
<field name="statement_id" readonly="1"/> <field name="statement_id" readonly="1"/>
<field name="ref" readonly="1"/> <field name="ref" readonly="1"/>
<field name="partner_id" on_change="onchange_partner_id(partner_id)"/> <field name="partner_id" />
<field name="type" on_change="onchange_type(partner_id, type)"/> <field name="type" />
<field name="account_id" domain="[('journal_id','=',parent.journal_id)]"/> <field name="account_id" />
<field name="amount" readonly="1" sum="Total Amount"/> <field name="amount" readonly="1" sum="Total Amount"/>
<field name="globalisation_id" string="Glob. Id"/> <field name="globalisation_id" string="Glob. Id"/>
<field name="globalisation_amount" string="Glob. Am."/> <field name="globalisation_amount" string="Glob. Am."/>
@ -426,9 +426,9 @@
<field name="val_date"/> <field name="val_date"/>
<field name="name"/> <field name="name"/>
<field name="ref" readonly="0"/> <field name="ref" readonly="0"/>
<field name="partner_id" on_change="onchange_partner_id(partner_id)"/> <field name="partner_id"/>
<field name="type" on_change="onchange_type(partner_id, type)"/> <field name="type" />
<field domain="[('journal_id', '=', parent.journal_id), ('type', '&lt;&gt;', 'view')]" name="account_id"/> <field domain="[('type', '&lt;&gt;', 'view')]" name="account_id"/>
<field name="amount"/> <field name="amount"/>
<field name="globalisation_id"/> <field name="globalisation_id"/>
<field name="sequence" readonly="0"/> <field name="sequence" readonly="0"/>

View File

@ -47,16 +47,18 @@
<field name="state" widget="statusbar" statusbar_visible="draft,posted" statusbar_colors='{"proforma":"blue"}'/> <field name="state" widget="statusbar" statusbar_visible="draft,posted" statusbar_colors='{"proforma":"blue"}'/>
</header> </header>
<sheet string="Accounting Voucher"> <sheet string="Accounting Voucher">
<group col="6" colspan="4"> <group col="4" colspan="4">
<field name="partner_id" required="1" on_change="onchange_journal_voucher(line_ids, tax_id, amount, partner_id, journal_id, type)"/> <field name="partner_id" required="1" on_change="onchange_journal_voucher(line_ids, tax_id, amount, partner_id, journal_id, type)"/>
<field name="payment_rate_currency_id" invisible="1"/>
<field name="date" on_change="onchange_date(date, currency_id, payment_rate_currency_id, amount, company_id)"/> <field name="date" on_change="onchange_date(date, currency_id, payment_rate_currency_id, amount, company_id)"/>
<field name="journal_id" widget="selection" on_change="onchange_journal_voucher(line_ids, tax_id, amount, partner_id, journal_id, type)"/> <field name="journal_id" widget="selection" on_change="onchange_journal_voucher(line_ids, tax_id, amount, partner_id, journal_id, type)"/>
<field name="type" required="1"/> <field name="type" required="1"/>
<field name="name" colspan="2"/> <field name="name" colspan="2"/>
<field name="company_id" widget="selection" groups="base.group_multi_company"/> <field name="company_id" widget="selection" groups="base.group_multi_company"/>
<field name="reference"/> <field name="reference"/>
<field name="number"/>
<field name="currency_id" groups="base.group_multi_currency"/>
<field name="account_id" widget="selection" invisible="True"/> <field name="account_id" widget="selection" invisible="True"/>
<field name="payment_rate_currency_id" invisible="1"/>
</group> </group>
<notebook colspan="4"> <notebook colspan="4">
<page string="Voucher Entry"> <page string="Voucher Entry">
@ -69,20 +71,16 @@
<field name="account_analytic_id" groups="analytic.group_analytic_accounting"/> <field name="account_analytic_id" groups="analytic.group_analytic_accounting"/>
</tree> </tree>
</field> </field>
<group col="3"> <group>
<group string="Internal Notes"> <field name="narration" nolabel="1" placeholder="Internal Notes"/>
<field name="narration" colspan="2" nolabel="1"/> <group class="oe_subtotal_footer oe_right" attrs="{'invisible':[('type','in',['payment', 'receipt', False])]}">
</group> <field name="tax_id" on_change="onchange_price(line_ids, tax_id, partner_id)" widget="selection" nolabel="1"/>
<group string="Other Information">
<field name="number"/>
<field name="currency_id" groups="base.group_multi_currency"/>
</group>
<group col="4" attrs="{'invisible':[('type','in',['payment', 'receipt', False])]}">
<separator string="Total" colspan="4"/>
<field name="tax_id" on_change="onchange_price(line_ids, tax_id, partner_id)" widget="selection"/>
<field name="tax_amount" nolabel="1"/> <field name="tax_amount" nolabel="1"/>
<button type="object" icon="terp-stock_format-scientific" name="compute_tax" string="Compute Tax" attrs="{'invisible': [('state','!=','draft')]}"/> <div class="oe_subtotal_footer_separator">
<label colspan="1" string=""/><field name="amount" string="Total"/> <label for="amount"/>
<button type="object" icon="terp-stock_format-scientific" name="compute_tax" class="oe_link oe_edit_only" string="(Update)" attrs="{'invisible': [('state','!=','draft')]}"/>
</div>
<field name="amount" class="oe_subtotal_footer_separator" nolabel="1"/>
</group> </group>
</group> </group>
</page> </page>

View File

@ -68,8 +68,10 @@ class ir_model_fields_anonymization(osv.osv):
return state return state
def _check_write(self, cr, uid, context=None): def _check_write(self, cr, uid, context=None):
# check that the field is created from the menu and not from an database update """check that the field is created from the menu and not from an database update
# otherwise the database update can crash: otherwise the database update can crash:"""
if context is None:
context = {}
if context.get('manual'): if context.get('manual'):
global_state = self._get_global_state(cr, uid, context=context) global_state = self._get_global_state(cr, uid, context=context)
@ -295,10 +297,10 @@ class ir_model_fields_anonymize_wizard(osv.osv_memory):
def fields_view_get(self, cr, uid, view_id=None, view_type='form', context=None, *args, **kwargs): def fields_view_get(self, cr, uid, view_id=None, view_type='form', context=None, *args, **kwargs):
state = self.pool.get('ir.model.fields.anonymization')._get_global_state(cr, uid, context=context) state = self.pool.get('ir.model.fields.anonymization')._get_global_state(cr, uid, context=context)
if context is None: if context is None:
context = {} context = {}
step = context.get('step', 'new_window') step = context.get('step', 'new_window')
res = super(ir_model_fields_anonymize_wizard, self).fields_view_get(cr, uid, view_id, view_type, context, *args, **kwargs) res = super(ir_model_fields_anonymize_wizard, self).fields_view_get(cr, uid, view_id, view_type, context, *args, **kwargs)

View File

@ -132,8 +132,6 @@
<header> <header>
<button name="%(crm.action_crm_lead2opportunity_partner)d" string="Convert to Opportunity" type="action" <button name="%(crm.action_crm_lead2opportunity_partner)d" string="Convert to Opportunity" type="action"
states="draft,open,pending" help="Convert to Opportunity" class="oe_highlight"/> states="draft,open,pending" help="Convert to Opportunity" class="oe_highlight"/>
<button name="case_escalate" string="Escalate" type="object"
states="draft,open,pending"/>
<button name="case_reset" string="Reset" type="object" <button name="case_reset" string="Reset" type="object"
states="cancel"/> states="cancel"/>
<button name="case_cancel" string="Cancel" type="object" <button name="case_cancel" string="Cancel" type="object"
@ -188,7 +186,11 @@
</group> </group>
<group> <group>
<field name="user_id"/> <field name="user_id"/>
<field name="section_id"/> <label for="section_id"/>
<div>
<field name="section_id"/>
<button name="case_escalate" string="Escalate" type="object" states="draft,open,pending"/>
</div>
<field name="type" invisible="1"/> <field name="type" invisible="1"/>
</group> </group>
<group> <group>
@ -403,8 +405,6 @@
states="draft,open,pending" class="oe_highlight"/> states="draft,open,pending" class="oe_highlight"/>
<button name="case_mark_lost" string="Mark Lost" type="object" <button name="case_mark_lost" string="Mark Lost" type="object"
states="draft,open" class="oe_highlight"/> states="draft,open" class="oe_highlight"/>
<button name="case_escalate" string="Escalate" type="object"
states="open" />
<field name="stage_id" widget="statusbar" clickable="True"/> <field name="stage_id" widget="statusbar" clickable="True"/>
</header> </header>
<sheet> <sheet>
@ -450,7 +450,11 @@
<group> <group>
<field name="user_id"/> <field name="user_id"/>
<field name="section_id" colspan="1" widget="selection"/> <label for="section_id"/>
<div>
<field name="section_id" widget="selection"/>
<button name="case_escalate" string="Escalate" type="object" states="draft,open,pending" />
</div>
</group> </group>
<group> <group>
<field name="categ_ids" <field name="categ_ids"

View File

@ -44,10 +44,6 @@ Web pages
'auto_install': False, 'auto_install': False,
'certificate': '0086363630317', 'certificate': '0086363630317',
'images': [], 'images': [],
'js': [
'static/src/lib/wiky/wiky.js',
'static/src/js/document_page.js'
],
'css' : ['static/src/css/document_page.css'], 'css' : ['static/src/css/document_page.css'],
} }
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

View File

@ -23,24 +23,28 @@ Additional ressources
<field name="name">OpenERP 6.1. Functional Demo</field> <field name="name">OpenERP 6.1. Functional Demo</field>
<field name="parent_id" ref="demo_category1"/> <field name="parent_id" ref="demo_category1"/>
<field name="content"> <field name="content">
<![CDATA[
The news is out, OpenERP's latest version 6.1. is here. It's more <br>
user-friendly, even more business oriented and efficient to manage your company <br>
The news is out, OpenERP's latest version 6.1. is here. It's more<br>
How to discover the latest version 6.1.? user-friendly, even more business oriented and efficient to manage your company<br>
<br>
Demo : [http://demo.openerp.com] How to discover the latest version 6.1.?<br>
Online: [http://openerp.com/online] <br>
Download: [http://openerp.com/downloads] Demo : <a target="http://demo.openerp.com" href="http://demo.openerp.com" style="background: url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAFZJREFUeF59z4EJADEIQ1F36k7u5E7ZKXeUQPACJ3wK7UNokVxVk9kHnQH7bY9hbDyDhNXgjpRLqFlo4M2GgfyJHhjq8V4agfrgPQX3JtJQGbofmCHgA/nAKks+JAjFAAAAAElFTkSuQmCC&quot;) no-repeat scroll right center transparent;padding-right: 13px;"></a><br>
Online: <a target="http://openerp.com/online" href="http://openerp.com/online" style="background: url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAFZJREFUeF59z4EJADEIQ1F36k7u5E7ZKXeUQPACJ3wK7UNokVxVk9kHnQH7bY9hbDyDhNXgjpRLqFlo4M2GgfyJHhjq8V4agfrgPQX3JtJQGbofmCHgA/nAKks+JAjFAAAAAElFTkSuQmCC&quot;) no-repeat scroll right center transparent;padding-right: 13px;"></a><br>
We have also put together a functional demo that presents 6.1. Watch this video Download: <a target="http://openerp.com/downloads" href="http://openerp.com/downloads" style="background: url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAFZJREFUeF59z4EJADEIQ1F36k7u5E7ZKXeUQPACJ3wK7UNokVxVk9kHnQH7bY9hbDyDhNXgjpRLqFlo4M2GgfyJHhjq8V4agfrgPQX3JtJQGbofmCHgA/nAKks+JAjFAAAAAElFTkSuQmCC&quot;) no-repeat scroll right center transparent;padding-right: 13px;"></a><br>
to learn directly from us what OpenERP 6.1. can do for you. Share it in your <br>
company, with your clients and implement it now for your business. We have also put together a functional demo that presents 6.1. Watch this video<br>
to learn directly from us what OpenERP 6.1. can do for you. Share it in your<br>
==Watch on Youtube!== company, with your clients and implement it now for your business.<br>
<br>
[[Video:http://www.youtube.com/embed/7jES2jxKMso ]] <h3>Watch on Youtube!</h3><br>
<br>
<iframe width="480" height="390" src="http://www.youtube.com/embed/7jES2jxKMso " frameborder="0" allowfullscreen=""></iframe><br>
<br>
<br>
]]>
</field> </field>
</record> </record>
@ -48,36 +52,40 @@ company, with your clients and implement it now for your business.
<field name="name">Personalise Dashboards</field> <field name="name">Personalise Dashboards</field>
<field name="parent_id" ref="demo_category1"/> <field name="parent_id" ref="demo_category1"/>
<field name="content"> <field name="content">
You like OpenERP, but feel like you want to personalise it more? Now, OpenERP <![CDATA[
goes a step further and lets you customize your dashboard. Thanks to a new <br>
feature that allows you to customize your dashboard by adding new boards of any You like OpenERP, but feel like you want to personalise it more? Now, OpenERP<br>
search view. goes a step further and lets you customize your dashboard. Thanks to a new<br>
feature that allows you to customize your dashboard by adding new boards of any<br>
==How is it done?== search view.<br>
<br>
Step 1: access one search view <h3>How is it done?</h3><br>
<br>
Step 2: apply the filter you want to see at each connection to the application Step 1: access one search view <br>
(eg. on sales, manufacturing, etc) <br>
Step 2: apply the filter you want to see at each connection to the application<br>
Step 3: add it into the dashboard in the same space where you can save the filter (eg. on sales, manufacturing, etc)<br>
<br>
Step 4: choose the application you want it visible on and the name of the array Step 3: add it into the dashboard in the same space where you can save the filter<br>
<br>
Look at this simple example below from Purchase, where I want to put on the Step 4: choose the application you want it visible on and the name of the array<br>
application's dashboard "Purchases to Approve". After I access the search view <br>
and apply the filter for "Purchases to Approve", I can add it immediately to my Look at this simple example below from Purchase, where I want to put on the<br>
Purchase dashboard. application's dashboard "Purchases to Approve". After I access the search view<br>
and apply the filter for "Purchases to Approve", I can add it immediately to my<br>
[[File:http://www.openerp.com/sites/default/files/fileattach/dashboard2_1(1).png ]] Purchase dashboard.<br>
<br>
In less than a minute, the search view is visible on the dashboard <img src="http://www.openerp.com/sites/default/files/fileattach/dashboard2_1(1).png" alt=""><br>
<br>
[[File:http://www.openerp.com/sites/default/files/fileattach/dashboard2_2.png ]] In less than a minute, the search view is visible on the dashboard<br>
<br>
Of course, you are free to delete what you don't need or like, but just in case <img src="http://www.openerp.com/sites/default/files/fileattach/dashboard2_2.png" alt=""><br>
you change your mind there is a reset button to return to the default view. <br>
Of course, you are free to delete what you don't need or like, but just in case<br>
you change your mind there is a reset button to return to the default view.<br>
<br>
<br>
]]>
</field> </field>
</record> </record>
@ -85,36 +93,36 @@ you change your mind there is a reset button to return to the default view.
<field name="name">Touchscreen Point of Sale</field> <field name="name">Touchscreen Point of Sale</field>
<field name="parent_id" ref="demo_category1"/> <field name="parent_id" ref="demo_category1"/>
<field name="content"> <field name="content">
The brand new OpenERP touchscreen point of sale available with 6.1 allows you <![CDATA[
to manage your shop sales very easily. It's fully web based so that you don't <br>
have to install or deploy any software and all the sales shops can be easily The brand new OpenERP touchscreen point of sale available with 6.1 allows you<br>
consolidated. It works in connected and disconnected modes so that you can to manage your shop sales very easily. It's fully web based so that you don't<br>
continue to sell if you lose your internet connection. have to install or deploy any software and all the sales shops can be easily<br>
consolidated. It works in connected and disconnected modes so that you can<br>
[[File:http://www.openerp.com/sites/default/files/fileattach/POS(2).png ]] continue to sell if you lose your internet connection.<br>
<br>
==Here's a summary of its main features and benefits:== <img src="http://www.openerp.com/sites/default/files/fileattach/POS(2).png" alt=""><br>
<br>
100% WEB based <h3>Here's a summary of its main features and benefits:</h3><br>
<br>
* available for any touchscreen device (ipod, ipad, any tablet)mobile (with portable devices) 100% WEB based<br>
* no installation required <br>
* no synchronization needed, completely integrated <ul><li>available for any touchscreen device (ipod, ipad, any tablet)mobile (with portable devices)</li><li>no installation required</li><li>no synchronization needed, completely integrated</li><li>continue working even when your connection is down if you close your browser, data won't be lost</li><li>fully web based with a clean interface smart interface</li></ul><br>
* continue working even when your connection is down if you close your browser, data won't be lost <br>
* fully web based with a clean interface smart interface You have different options to select your products. You can do it through the<br>
barcode reader, just browse through the categories you have put in place (ie.<br>
You have different options to select your products. You can do it through the drinks, snacks, meals, etc.), or text search in case neither of the other<br>
barcode reader, just browse through the categories you have put in place (ie. options work for you. If you need to use the POS for your restaurant, for<br>
drinks, snacks, meals, etc.), or text search in case neither of the other example, your employees can record at the same time multiple tickets without<br>
options work for you. If you need to use the POS for your restaurant, for having to wait to do one transaction at a time. Along, to facilitate payment,<br>
example, your employees can record at the same time multiple tickets without the application allows multiple payment methods.<br>
having to wait to do one transaction at a time. Along, to facilitate payment, <br>
the application allows multiple payment methods. The POS application is so simple and accessible to use that your shop or<br>
restaurant will never need any other tool to manage orders. Due to its smart<br>
The POS application is so simple and accessible to use that your shop or and user-friendly interface you don't need any training to learn how to use it.<br>
restaurant will never need any other tool to manage orders. Due to its smart Think of it as an out-of-the-box solution to boost your business' productivity.<br>
and user-friendly interface you don't need any training to learn how to use it. <br>
Think of it as an out-of-the-box solution to boost your business' productivity. ]]>
</field> </field>
</record> </record>

View File

@ -55,7 +55,7 @@
</div> </div>
<field name="content" placeholder="e.g. Once upon a time..." class="oe_edit_only"/> <field name="content" placeholder="e.g. Once upon a time..." class="oe_edit_only"/>
<div class="oe_document_page"> <div class="oe_document_page">
<field name="display_content" widget="text_wiki" class="oe_view_only"/> <field name="display_content" widget="html" class="oe_view_only" options='{"safe": true}'/>
</div> </div>
</form> </form>
</field> </field>

View File

@ -1,18 +0,0 @@
openerp.document_page = function (openerp) {
openerp.web.form.widgets.add('text_wiki', 'openerp.web.form.FieldTextWiki');
openerp.web.form.FieldTextWiki = openerp.web.form.FieldText.extend({
render_value: function() {
var show_value = openerp.web.format_value(this.get('value'), this, '');
if (!this.get("effective_readonly")) {
this.$textarea.val(show_value);
if (show_value && this.view.options.resize_textareas) {
this.do_resize(this.view.options.resize_textareas);
}
} else {
var wiki_value = wiky.process(show_value || '');
this.$el.html(wiki_value);
}
},
});
};

View File

@ -1,41 +0,0 @@
Wiky.js - a javascript library to convert Wiki Markup language to HTML.
=======================
(It is buggy, please use with care)
Wiky.js is a javascript library that converts Wiki Markup language to HTML.
How to use it
-------------------
Include wiki.js into your HTML file. Wiky.js has only one function, which is wiky.process(wikitext).
Please see index.html for an example.
*wiky.js does not depend on jQuery, which is included for testing purpose.
Supported Syntax
-------------------
* == Heading ==
* === Subheading ===
* [http://www.url.com Name of URLs]
* [[File:http://www.url.com/image.png Alternative Text]]
* -------------------- (Horizontal line)
* : (Indentation)
* # Ordered bullet point
* * Unordered bullet point
License
------------------
Creative Commons 3.0
Contributors
-------------------
Tanin Na Nakorn
Tanun Niyomjit (Designer)

View File

@ -1,56 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<script type="text/javascript" src="jquery-1.4.2.min.js"></script>
<script type="text/javascript" src="wiky.js"></script>
<title>Untitled Document</title>
<link href="wiky.css" rel="stylesheet" type="text/css">
</head>
<body>
<textarea id="textarea" onchange="$('#preview').html(wiky.process($(this).val()));" cols="60" rows="20">=== Heading ===
Some content
I would like to add another line
== Subheading ==
Some more content
Some more lines1
:A line with indent
:: A 2-indented line
:: more
:back to 1-indented line
This is Taeyeon.
[[File:http://www.oknation.net/blog/home/blog_data/12/2012/images/ty4.jpg Taeyeon]]
Taeyeon is so cute.
This is a link:[http://www.google.com Google].
This is a bold link:'''[http://www.google.com Google]'''.
This is a bold-italic link:'''''[http://www.google.com Google]'''''.
This is '''bold''', '''''bold-italic''''', and ''italic''
[[Video:http://www.youtube.com/embed/ovVfLancwys]]
# First
# secon
## Second-First
*** First Point
*** Second Point
#### z
#### y
#### x
*** Third Point
## Second-Second [ftp://www.facebook.com FacebookFTP]
## Second-Third [http://www.google.com Google Here]
# third
</textarea>
<br/>
<span style="display:block;width:600px;border:1px solid #999999;">
<span style="display:block;margin:10px 10px 10px 10px;" class="wiky_preview_area" id="preview">
</span>
</span>
</body>
</html>
<script language="javascript">
$('#preview').html(wiky.process($('#textarea').val()));
</script>

View File

@ -1,35 +0,0 @@
=== Heading ===
Some content
I would like to add another line
== Subheading ==
Some more content
Some more lines1
:A line with indent
:: A 2-indented line
:: more
:back to 1-indented line
This is Taeyeon.
[[File:http://www.oknation.net/blog/home/blog_data/12/2012/images/ty4.jpg Taeyeon]]
Taeyeon is so cute.
This is a link:[http://www.google.com Google].
This is a bold link:'''[http://www.google.com Google]'''.
This is a bold-italic link:'''''[http://www.google.com Google]'''''.
This is '''bold''', '''''bold-italic''''', and ''italic''
# First
# second
## Second-First
*** First Point
*** Second Point
#### z
#### y
#### x
*** Third Point
## Second-Second [ftp://www.facebook.com FacebookFTP]
## Second-Third [http://www.google.com Google Here]
# third

View File

@ -1,79 +0,0 @@
@charset "UTF-8";
.wiky_preview_area {
font-family: "Helvetica Neue", Arial, Helvetica, 'Liberation Sans', FreeSans, sans-serif;
font-size: 13px;
line-height: 1.5em;
color: #666;
font-weight:350;
width:600px;
display:block;
}
.wiky_preview_area h2{
font-size:24px;
color:#333;
font-weight:400;
text-shadow:0 1px 0 rgba(000, 000, 000, .4);
}
.wiky_preview_area h3{
font-size:18px;
color:#555;
font-weight:400;
text-shadow:0 1px 0 rgba(000, 000, 000, .4);
}
.wiky_preview_area img{
background-repeat: repeat;
width: 400px;
-webkit-border-radius: 10px;
-moz-border-radius: 10px;
border-radius: 10px;
-webkit-box-shadow:0 1px 3px rgba(0, 0, 0, .8);
-moz-box-shadow:0 1px 3px rgba(0, 0, 0, .8);
box-shadow:0 1px 3px rgba(0, 0, 0, .8);
}
.wiky_preview_area a{
padding:5px;
font-weight:400;
background: #999; /* for non-css3 browsers */
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#cccccc', endColorstr='#000000'); /* for IE */
background: -webkit-gradient(linear, left top, left bottom, from(#ccc), to(#000)); /* for webkit browsers */
background: -moz-linear-gradient(top, #ccc, #000); /* for firefox 3.6+ */
-webkit-border-radius: 4px;
-moz-border-radius: 4px;
border-radius: 4px;
-webkit-box-shadow:none;
-moz-box-shadow:none;
box-shadow:none;
text-shadow:0 1px 0 rgba(255, 255, 255, 1);
}
.wiky_preview_area a:hover{
color:#333;
padding:5px;
font-weight:400;
text-decoration:none;
-webkit-border-radius: 4px;
-moz-border-radius: 4px;
border-radius: 4px;
-webkit-box-shadow:0 1px 3px rgba(0, 0, 0, .3);
-moz-box-shadow:0 1px 3px rgba(0, 0, 0, .3);
box-shadow:0 1px 3px rgba(0, 0, 0, .3);
text-shadow:0 1px 0 rgba(255, 255, 255, 1);
}
.wiky_preview_area > ol,
.wiky_preview_area > ul,
.wiky_preview_area > ul > li,
.wiky_preview_area > ol > li {
list-style: disc inside none;
}

View File

@ -1,303 +0,0 @@
/**
* Wiky.js - Javascript library to converts Wiki MarkUp language to HTML.
* You can do whatever with it. Please give me some credits (Apache License)
* - Tanin Na Nakorn
*/
var wiky = {};
wiky.process = function(wikitext) {
var lines = wikitext.split(/\r?\n/);
var start;
var html = "";
for (var i=0;i<lines.length;i++)
{
var line = lines[i];
if (line.match(/^===/)!=null && line.match(/===$/)!=null)
{
html += "<h2>"+line.substring(3,line.length-3)+"</h2>";
}
else if (line.match(/^==/)!=null && line.match(/==$/)!=null)
{
html += "<h3>"+line.substring(2,line.length-2)+"</h3>";
}
else if (line.match(/^:+/)!=null)
{
// find start line and ending line
start = i;
while (i < lines.length && lines[i].match(/^:+/)!=null) i++;
i--;
html += wiky.process_indent(lines,start,i);
}
else if (line.match(/^----+(\s*)$/)!=null)
{
html += "<hr/>";
}
else if (line.match(/^(\*+) /)!=null)
{
// find start line and ending line
start = i;
while (i < lines.length && lines[i].match(/^(\*+|##+):? /)!=null) i++;
i--;
html += wiky.process_bullet_point(lines,start,i);
}
else if (line.match(/^(#+) /)!=null)
{
// find start line and ending line
start = i;
while (i < lines.length && lines[i].match(/^(#+|\*\*+):? /)!=null) i++;
i--;
html += wiky.process_bullet_point(lines,start,i);
}
else
{
html += wiky.process_normal(line);
}
html += "<br/>\n";
}
return html;
};
wiky.process_indent = function(lines,start,end) {
var html = "<dl>";
for(var i=start;i<=end;i++) {
html += "<dd>";
var this_count = lines[i].match(/^(:+)/)[1].length;
html += wiky.process_normal(lines[i].substring(this_count));
var nested_end = i;
for (var j=i+1;j<=end;j++) {
var nested_count = lines[j].match(/^(:+)/)[1].length;
if (nested_count <= this_count) break;
else nested_end = j;
}
if (nested_end > i) {
html += wiky.process_indent(lines,i+1,nested_end);
i = nested_end;
}
html += "</dd>";
}
html += "</dl>";
return html;
};
wiky.process_bullet_point = function(lines,start,end) {
var html = (lines[start].charAt(0)=='*')?"<ul>":"<ol>";
for(var i=start;i<=end;i++) {
html += "<li>";
var this_count = lines[i].match(/^(\*+|#+) /)[1].length;
html += wiky.process_normal(lines[i].substring(this_count+1));
// continue previous with #:
{
var nested_end = i;
for (var j = i + 1; j <= end; j++) {
var nested_count = lines[j].match(/^(\*+|#+):? /)[1].length;
if (nested_count < this_count)
break;
else {
if (lines[j].charAt(nested_count) == ':') {
html += "<br/>" + wiky.process_normal(lines[j].substring(nested_count + 2));
nested_end = j;
} else {
break;
}
}
}
i = nested_end;
}
// nested bullet point
{
var nested_end = i;
for (var j = i + 1; j <= end; j++) {
var nested_count = lines[j].match(/^(\*+|#+):? /)[1].length;
if (nested_count <= this_count)
break;
else
nested_end = j;
}
if (nested_end > i) {
html += wiky.process_bullet_point(lines, i + 1, nested_end);
i = nested_end;
}
}
// continue previous with #:
{
var nested_end = i;
for (var j = i + 1; j <= end; j++) {
var nested_count = lines[j].match(/^(\*+|#+):? /)[1].length;
if (nested_count < this_count)
break;
else {
if (lines[j].charAt(nested_count) == ':') {
html += wiky.process_normal(lines[j].substring(nested_count + 2));
nested_end = j;
} else {
break;
}
}
}
i = nested_end;
}
html += "</li>";
}
html += (lines[start].charAt(0)=='*')?"</ul>":"</ol>";
return html;
};
wiky.process_url = function(txt) {
var index = txt.indexOf(" ");
if (index == -1)
{
return "<a target='"+txt+"' href='"+txt+"' style='background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAFZJREFUeF59z4EJADEIQ1F36k7u5E7ZKXeUQPACJ3wK7UNokVxVk9kHnQH7bY9hbDyDhNXgjpRLqFlo4M2GgfyJHhjq8V4agfrgPQX3JtJQGbofmCHgA/nAKks+JAjFAAAAAElFTkSuQmCC\") no-repeat scroll right center transparent;padding-right: 13px;'></a>";
}
else
{
var url = txt.substring(0,index);
var label = txt.substring(index+1);
return "<a target='"+url+"' href='"+url+"' style='background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAFZJREFUeF59z4EJADEIQ1F36k7u5E7ZKXeUQPACJ3wK7UNokVxVk9kHnQH7bY9hbDyDhNXgjpRLqFlo4M2GgfyJHhjq8V4agfrgPQX3JtJQGbofmCHgA/nAKks+JAjFAAAAAElFTkSuQmCC\") no-repeat scroll right center transparent;padding-right: 13px;'>"+label+"</a>";
}
};
wiky.process_image = function(txt) {
var index = txt.indexOf(" ");
var url = txt;
var label = "";
if (index > -1)
{
url = txt.substring(0,index);
label = txt.substring(index+1);
}
return "<img src='"+url+"' alt=\""+label+"\" />";
};
wiky.process_video = function(url) {
if (url.match(/^(https?:\/\/)?(www.)?youtube.com\//) == null)
{
return "<b>"+url+" is an invalid YouTube URL</b>";
}
var result;
if ((result = url.match(/^(https?:\/\/)?(www.)?youtube.com\/watch\?(.*)v=([^&]+)/)) != null)
{
url = "http://www.youtube.com/embed/"+result[4];
}
return '<iframe width="480" height="390" src="'+url+'" frameborder="0" allowfullscreen></iframe>';
};
wiky.process_normal = function(wikitext) {
// Image
{
var index = wikitext.indexOf("[[File:");
var end_index = wikitext.indexOf("]]", index + 7);
while (index > -1 && end_index > -1) {
wikitext = wikitext.substring(0,index)
+ wiky.process_image(wikitext.substring(index+7,end_index))
+ wikitext.substring(end_index+2);
index = wikitext.indexOf("[[File:");
end_index = wikitext.indexOf("]]", index + 7);
}
}
// Video
{
var index = wikitext.indexOf("[[Video:");
var end_index = wikitext.indexOf("]]", index + 8);
while (index > -1 && end_index > -1) {
wikitext = wikitext.substring(0,index)
+ wiky.process_video(wikitext.substring(index+8,end_index))
+ wikitext.substring(end_index+2);
index = wikitext.indexOf("[[Video:");
end_index = wikitext.indexOf("]]", index + 8);
}
}
// URL
var protocols = ["http","ftp","news"];
for (var i=0;i<protocols.length;i++)
{
var index = wikitext.indexOf("["+protocols[i]+"://");
var end_index = wikitext.indexOf("]", index + 1);
while (index > -1 && end_index > -1) {
wikitext = wikitext.substring(0,index)
+ wiky.process_url(wikitext.substring(index+1,end_index))
+ wikitext.substring(end_index+1);
index = wikitext.indexOf("["+protocols[i]+"://",end_index+1);
end_index = wikitext.indexOf("]", index + 1);
}
}
var count_b = 0;
var index = wikitext.indexOf("'''");
while(index > -1) {
if ((count_b%2)==0) wikitext = wikitext.replace(/'''/,"<b>");
else wikitext = wikitext.replace(/'''/,"</b>");
count_b++;
index = wikitext.indexOf("'''",index);
}
var count_i = 0;
var index = wikitext.indexOf("''");
while(index > -1) {
if ((count_i%2)==0) wikitext = wikitext.replace(/''/,"<i>");
else wikitext = wikitext.replace(/''/,"</i>");
count_i++;
index = wikitext.indexOf("''",index);
}
wikitext = wikitext.replace(/<\/b><\/i>/g,"</i></b>");
return wikitext;
};

View File

@ -261,7 +261,6 @@ class hr_employee(osv.osv):
_defaults = { _defaults = {
'active': 1, 'active': 1,
'image': _get_default_image, 'image': _get_default_image,
'marital': 'single',
'color': 0, 'color': 0,
} }

View File

@ -180,7 +180,7 @@
<field name="name">Employees</field> <field name="name">Employees</field>
<field name="res_model">hr.employee</field> <field name="res_model">hr.employee</field>
<field name="view_type">form</field> <field name="view_type">form</field>
<field name="view_mode">tree,form</field> <field name="view_mode">form,tree</field>
<field name="view_id" eval="False"/> <field name="view_id" eval="False"/>
<field name="search_view_id" ref="view_employee_filter"/> <field name="search_view_id" ref="view_employee_filter"/>
</record> </record>

View File

@ -17,7 +17,7 @@
<field name="name">Payroll</field> <field name="name">Payroll</field>
<field name="res_model">ir.module.module</field> <field name="res_model">ir.module.module</field>
<field name="view_mode">kanban,tree,form</field> <field name="view_mode">kanban,tree,form</field>
<field name="context" eval="{'search_default_category_id': ref('base.module_category_localization'), 'search_default_name': 'payroll'}"/> <field name="context" eval="{'search_default_category_id': ref('base.module_category_localization')}"/>
<field name="search_view_id" ref="base.view_module_filter"/> <field name="search_view_id" ref="base.view_module_filter"/>
</record> </record>

View File

@ -21,7 +21,7 @@
<field name="arch" type="xml"> <field name="arch" type="xml">
<data> <data>
<xpath expr="//div[@name='button_box']" position="inside"> <xpath expr="//div[@name='button_box']" position="inside">
<button name="%(act_hr_employee_2_hr_contract)d" string="Contracts" type="action"/> <button name="%(act_hr_employee_2_hr_contract)d" string="Contracts" type="action" groups="base.group_hr_manager"/>
</xpath> </xpath>
<xpath expr="//field[@name='coach_id']" position="after"> <xpath expr="//field[@name='coach_id']" position="after">
<field name="manager"/> <field name="manager"/>

View File

@ -392,12 +392,6 @@ Once the form had been filled, the employee send it to his supervisor.
<field name="type">char</field> <field name="type">char</field>
<field eval="5" name="sequence"/> <field eval="5" name="sequence"/>
</record> </record>
<record id="survey_answer_98" model="survey.answer">
<field name="answer">Title</field>
<field name="question_id" ref="survey_question_2"/>
<field name="type">char</field>
<field eval="6" name="sequence"/>
</record>
<record id="survey_question_column_heading_4" model="survey.question.column.heading"> <record id="survey_question_column_heading_4" model="survey.question.column.heading">
<field name="in_visible_rating_weight">1</field> <field name="in_visible_rating_weight">1</field>
<field name="in_visible_menu_choice">1</field> <field name="in_visible_menu_choice">1</field>

View File

@ -239,7 +239,7 @@
<field name="name">Appraisal</field> <field name="name">Appraisal</field>
<field name="res_model">hr_evaluation.evaluation</field> <field name="res_model">hr_evaluation.evaluation</field>
<field name="view_type">form</field> <field name="view_type">form</field>
<field name="view_mode">tree,form,graph</field> <field name="view_mode">tree,form</field>
<field name="search_view_id" ref="hr_evaluation.evaluation_search"/> <field name="search_view_id" ref="hr_evaluation.evaluation_search"/>
<field name="context">{"search_default_next_month":1}</field> <field name="context">{"search_default_next_month":1}</field>
<field name="help" type="html"> <field name="help" type="html">

View File

@ -39,4 +39,4 @@ access_survey_response_hr_employee,survey.response.employee,survey.model_survey_
access_survey_question_column_heading_hr_employee,survey.question.column.heading.employee,survey.model_survey_question_column_heading,base.group_user,1,0,0,0 access_survey_question_column_heading_hr_employee,survey.question.column.heading.employee,survey.model_survey_question_column_heading,base.group_user,1,0,0,0
access_survey_response_line_hr_employee,survey.response.line.employee,survey.model_survey_response_line,base.group_user,1,1,1,0 access_survey_response_line_hr_employee,survey.response.line.employee,survey.model_survey_response_line,base.group_user,1,1,1,0
access_survey_response_answer_hr_employee,survey.response.answer.hr.employee,survey.model_survey_response_answer,base.group_user,1,1,1,0 access_survey_response_answer_hr_employee,survey.response.answer.hr.employee,survey.model_survey_response_answer,base.group_user,1,1,1,0
access_survey_tbl_column_heading_hr_employee,survey.tbl.column.heading,survey.model_survey_tbl_column_heading,base.group_user,1,1,1,0

1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
39 access_survey_question_column_heading_hr_employee survey.question.column.heading.employee survey.model_survey_question_column_heading base.group_user 1 0 0 0
40 access_survey_response_line_hr_employee survey.response.line.employee survey.model_survey_response_line base.group_user 1 1 1 0
41 access_survey_response_answer_hr_employee survey.response.answer.hr.employee survey.model_survey_response_answer base.group_user 1 1 1 0
42 access_survey_tbl_column_heading_hr_employee survey.tbl.column.heading survey.model_survey_tbl_column_heading base.group_user 1 1 1 0

View File

@ -54,7 +54,6 @@
str(ref("survey_question_2")) +"_" +str(ref("survey_answer_20")) + "_multi" :'3', str(ref("survey_question_2")) +"_" +str(ref("survey_answer_20")) + "_multi" :'3',
str(ref("survey_question_2")) +"_" +str(ref("survey_answer_25")) + "_multi" :'2011-12-02 16:42:00', str(ref("survey_question_2")) +"_" +str(ref("survey_answer_25")) + "_multi" :'2011-12-02 16:42:00',
str(ref("survey_question_2")) +"_" +str(ref("survey_answer_43")) + "_multi" :'HR', str(ref("survey_question_2")) +"_" +str(ref("survey_answer_43")) + "_multi" :'HR',
str(ref("survey_question_2")) +"_" +str(ref("survey_answer_98")) + "_multi" :'tpa review'
}, context = ctx) }, context = ctx)
- -
I close this Evaluation survey by giving answer of questions. I close this Evaluation survey by giving answer of questions.

View File

@ -130,7 +130,7 @@
</page> </page>
<page string="Other Info"> <page string="Other Info">
<group> <group>
<group string="Accounting Data"> <group string="Accounting Data" groups="account.group_account_user">
<field name="journal_id" widget="selection" domain="[('type', '=', 'purchase')]"/> <field name="journal_id" widget="selection" domain="[('type', '=', 'purchase')]"/>
<field name="voucher_id" context="{'form_view_ref': 'account_voucher.view_purchase_receipt_form'}"/> <field name="voucher_id" context="{'form_view_ref': 'account_voucher.view_purchase_receipt_form'}"/>
</group> </group>

View File

@ -92,7 +92,7 @@
<header> <header>
<button string="Approve" name="validate" states="confirm" type="workflow" groups="base.group_hr_user" class="oe_highlight"/> <button string="Approve" name="validate" states="confirm" type="workflow" groups="base.group_hr_user" class="oe_highlight"/>
<button string="Validate" name="second_validate" states="validate1" type="workflow" groups="base.group_hr_user" class="oe_highlight"/> <button string="Validate" name="second_validate" states="validate1" type="workflow" groups="base.group_hr_user" class="oe_highlight"/>
<button string="Refuse" name="refuse" states="confirm,validate1,validate" type="workflow" groups="base.group_hr_user" class="oe_highlight"/> <button string="Refuse" name="refuse" states="confirm,validate1,validate" type="workflow" groups="base.group_hr_user"/>
<button string="Reset to New" name="set_to_draft" states="refuse" type="object" groups="base.group_hr_user" /> <button string="Reset to New" name="set_to_draft" states="refuse" type="object" groups="base.group_hr_user" />
<field name="state" widget="statusbar" statusbar_visible="draft,confirm,validate" statusbar_colors='{"confirm":"blue","validate1":"blue","refuse":"red"}'/> <field name="state" widget="statusbar" statusbar_visible="draft,confirm,validate" statusbar_colors='{"confirm":"blue","validate1":"blue","refuse":"red"}'/>
</header> </header>
@ -138,7 +138,7 @@
<header> <header>
<button string="Approve" name="validate" states="confirm" type="workflow" groups="base.group_hr_user" class="oe_highlight"/> <button string="Approve" name="validate" states="confirm" type="workflow" groups="base.group_hr_user" class="oe_highlight"/>
<button string="Validate" name="second_validate" states="validate1" type="workflow" groups="base.group_hr_user" class="oe_highlight"/> <button string="Validate" name="second_validate" states="validate1" type="workflow" groups="base.group_hr_user" class="oe_highlight"/>
<button string="Refuse" name="refuse" states="confirm,validate,validate1" type="workflow" groups="base.group_hr_user" class="oe_highlight"/> <button string="Refuse" name="refuse" states="confirm,validate,validate1" type="workflow" groups="base.group_hr_user"/>
<button string="Reset to New" name="set_to_draft" states="cancel,refuse" type="object" groups="base.group_hr_user" /> <button string="Reset to New" name="set_to_draft" states="cancel,refuse" type="object" groups="base.group_hr_user" />
<field name="state" widget="statusbar" statusbar_visible="draft,confirm,validate" statusbar_colors='{"confirm":"blue","validate1":"blue","refuse":"red"}'/> <field name="state" widget="statusbar" statusbar_visible="draft,confirm,validate" statusbar_colors='{"confirm":"blue","validate1":"blue","refuse":"red"}'/>
</header> </header>
@ -485,6 +485,7 @@
<record id="hr_holidays_leaves_assign_tree_view" model="ir.ui.view"> <record id="hr_holidays_leaves_assign_tree_view" model="ir.ui.view">
<field name="name">hr.employee.leave.tree</field> <field name="name">hr.employee.leave.tree</field>
<field name="model">hr.employee</field> <field name="model">hr.employee</field>
<field name="priority" eval="20"/>
<field name="arch" type="xml"> <field name="arch" type="xml">
<tree string="Assign Leaves" editable="bottom"> <tree string="Assign Leaves" editable="bottom">
<field name="name" string="Employee"/> <field name="name" string="Employee"/>
@ -524,7 +525,7 @@
</group> </group>
</xpath> </xpath>
<xpath expr="//div[@name='button_box']" position="inside"> <xpath expr="//div[@name='button_box']" position="inside">
<button name="%(act_hr_employee_holiday_request)d" string="Leaves" type="action"/> <button name="%(act_hr_employee_holiday_request)d" string="Leaves" type="action" groups="base.group_hr_user"/>
</xpath> </xpath>
</field> </field>
</record> </record>

View File

@ -669,26 +669,26 @@ class hr_payslip(osv.osv):
if not context.get('contract', False): if not context.get('contract', False):
#fill with the first contract of the employee #fill with the first contract of the employee
contract_ids = self.get_contract(cr, uid, employee_id, date_from, date_to, context=context) contract_ids = self.get_contract(cr, uid, employee_id, date_from, date_to, context=context)
res['value'].update({
'struct_id': contract_ids and contract_obj.read(cr, uid, contract_ids[0], ['struct_id'], context=context)['struct_id'][0] or False,
'contract_id': contract_ids and contract_ids[0] or False,
})
else: else:
if contract_id: if contract_id:
#set the list of contract for which the input have to be filled #set the list of contract for which the input have to be filled
contract_ids = [contract_id] contract_ids = [contract_id]
#fill the structure with the one on the selected contract
contract_record = contract_obj.browse(cr, uid, contract_id, context=context)
res['value'].update({
'struct_id': contract_record.struct_id.id,
'contract_id': contract_id
})
else: else:
#if we don't give the contract, then the input to fill should be for all current contracts of the employee #if we don't give the contract, then the input to fill should be for all current contracts of the employee
contract_ids = self.get_contract(cr, uid, employee_id, date_from, date_to, context=context) contract_ids = self.get_contract(cr, uid, employee_id, date_from, date_to, context=context)
if not contract_ids:
return res
if not contract_ids:
return res
contract_record = contract_obj.browse(cr, uid, contract_ids[0], context=context)
res['value'].update({
'contract_id': contract_record and contract_record.id or False
})
struct_record = contract_record and contract_record.struct_id or False
if not struct_record:
return res
res['value'].update({
'struct_id': struct_record.id,
})
#computation of the salary input #computation of the salary input
worked_days_line_ids = self.get_worked_day_lines(cr, uid, contract_ids, date_from, date_to, context=context) worked_days_line_ids = self.get_worked_day_lines(cr, uid, contract_ids, date_from, date_to, context=context)
input_line_ids = self.get_inputs(cr, uid, contract_ids, date_from, date_to, context=context) input_line_ids = self.get_inputs(cr, uid, contract_ids, date_from, date_to, context=context)

View File

@ -234,7 +234,7 @@
</h2> </h2>
</div> </div>
<group col="4"> <group col="4">
<field name="contract_id" domain="[('employee_id','=',employee_id)]" on_change="onchange_contract_id(date_from, date_to, employee_id, contract_id)"/> <field name="contract_id" domain="[('employee_id','=',employee_id)]" on_change="onchange_contract_id(date_from, date_to, employee_id, contract_id)" context="{'default_employee_id': employee_id}"/>
<field name="number"/> <field name="number"/>
<field name="struct_id" attrs="{'required':[('contract_id','&lt;&gt;',False)]}"/> <field name="struct_id" attrs="{'required':[('contract_id','&lt;&gt;',False)]}"/>
<field name="name"/> <field name="name"/>
@ -369,7 +369,7 @@
<field name="view_id" ref="view_hr_payslip_tree"/> <field name="view_id" ref="view_hr_payslip_tree"/>
<field name="search_view_id" ref="view_hr_payslip_filter"/> <field name="search_view_id" ref="view_hr_payslip_filter"/>
</record> </record>
<menuitem action="action_view_hr_payslip_form" id="menu_department_tree" parent="menu_hr_root_payroll"/> <menuitem action="action_view_hr_payslip_form" id="menu_department_tree" parent="menu_hr_root_payroll" groups="base.group_hr_user"/>
<act_window name="Payslips" <act_window name="Payslips"
context="{'search_default_employee_id': [active_id], 'default_employee_id': active_id}" context="{'search_default_employee_id': [active_id], 'default_employee_id': active_id}"
res_model="hr.payslip" res_model="hr.payslip"
@ -386,7 +386,7 @@
<field name="arch" type="xml"> <field name="arch" type="xml">
<data> <data>
<xpath expr="//div[@name='button_box']" position="inside"> <xpath expr="//div[@name='button_box']" position="inside">
<button name="%(act_hr_employee_payslip_list)d" string="Payslips" type="action"/> <button name="%(act_hr_employee_payslip_list)d" string="Payslips" type="action" groups="base.group_hr_user"/>
</xpath> </xpath>
</data> </data>
</field> </field>

View File

@ -187,7 +187,7 @@
</record> </record>
<menuitem action="act_hr_timesheet_sheet_form" id="menu_act_hr_timesheet_sheet_form" parent="hr_attendance.menu_hr_time_tracking" <menuitem action="act_hr_timesheet_sheet_form" id="menu_act_hr_timesheet_sheet_form" parent="hr_attendance.menu_hr_time_tracking"
sequence="2" groups="base.group_hr_user,base.group_hr_manager"/> sequence="2" groups="base.group_hr_user"/>
<!-- <!--
Company inheritancy Company inheritancy
@ -350,7 +350,7 @@
<field name="inherit_id" ref="hr_timesheet.hr_timesheet_employee_extd_form"/> <field name="inherit_id" ref="hr_timesheet.hr_timesheet_employee_extd_form"/>
<field name="arch" type="xml"> <field name="arch" type="xml">
<xpath expr="//div[@name='button_box']" position="inside"> <xpath expr="//div[@name='button_box']" position="inside">
<button name="%(act_hr_employee_2_hr_timesheet)d" string="Timesheets" type="action"/> <button name="%(act_hr_employee_2_hr_timesheet)d" string="Timesheets" type="action" groups="base.group_hr_manager"/>
</xpath> </xpath>
</field> </field>
</record> </record>

View File

@ -19,7 +19,6 @@
# #
############################################################################## ##############################################################################
import company
import wizard import wizard
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

View File

@ -1,45 +0,0 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# OpenERP, Open Source Management Solution
# Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>).
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
from osv import osv
class res_company(osv.osv):
_inherit = "res.company"
_description = 'Company'
def _get_default_ad(self, addresses):
name = email = phone = city = post_code = address = country_code = ""
for ads in addresses:
if ads.type == 'default':
city = ads.city or ""
post_code = ads.zip or ""
if ads.street:
address = ads.street or ""
if ads.street2:
address += " " + ads.street2
if ads.country_id:
country_code = ads.country_id and ads.country_id.code or ""
name = ads.name or ""
email = ads.email or ""
phone = ads.phone or ""
return name, email, phone, city, post_code, address, country_code
res_company()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

View File

@ -45,8 +45,8 @@ class l10n_be_vat_declaration(osv.osv_memory):
'tax_code_id': fields.many2one('account.tax.code', 'Tax Code', domain=[('parent_id', '=', False)], required=True), 'tax_code_id': fields.many2one('account.tax.code', 'Tax Code', domain=[('parent_id', '=', False)], required=True),
'msg': fields.text('File created', size=64, readonly=True), 'msg': fields.text('File created', size=64, readonly=True),
'file_save': fields.binary('Save File'), 'file_save': fields.binary('Save File'),
'ask_restitution': fields.boolean('Ask Restitution',help='It indicates whether a restitution is to made or not?'), 'ask_restitution': fields.boolean('Ask Restitution',help='It indicates whether a restitution is to make or not?'),
'ask_payment': fields.boolean('Ask Payment',help='It indicates whether a payment is to made or not?'), 'ask_payment': fields.boolean('Ask Payment',help='It indicates whether a payment is to make or not?'),
'client_nihil': fields.boolean('Last Declaration, no clients in client listing', help='Tick this case only if it concerns only the last statement on the civil or cessation of activity: ' \ 'client_nihil': fields.boolean('Last Declaration, no clients in client listing', help='Tick this case only if it concerns only the last statement on the civil or cessation of activity: ' \
'no clients to be included in the client listing.'), 'no clients to be included in the client listing.'),
'comments': fields.text('Comments'), 'comments': fields.text('Comments'),
@ -70,6 +70,7 @@ class l10n_be_vat_declaration(osv.osv_memory):
obj_tax_code = self.pool.get('account.tax.code') obj_tax_code = self.pool.get('account.tax.code')
obj_acc_period = self.pool.get('account.period') obj_acc_period = self.pool.get('account.period')
obj_user = self.pool.get('res.users') obj_user = self.pool.get('res.users')
obj_partner = self.pool.get('res.partner')
mod_obj = self.pool.get('ir.model.data') mod_obj = self.pool.get('ir.model.data')
if context is None: if context is None:
@ -83,7 +84,7 @@ class l10n_be_vat_declaration(osv.osv_memory):
obj_company = obj_user.browse(cr, uid, uid, context=context).company_id obj_company = obj_user.browse(cr, uid, uid, context=context).company_id
vat_no = obj_company.partner_id.vat vat_no = obj_company.partner_id.vat
if not vat_no: if not vat_no:
raise osv.except_osv(_('Insufficient Data!'), _('No VAT Number Associated with Main Company.')) raise osv.except_osv(_('insufficient data!'), _('No VAT number associated with your company.'))
vat_no = vat_no.replace(' ','').upper() vat_no = vat_no.replace(' ','').upper()
vat = vat_no[2:] vat = vat_no[2:]
@ -93,8 +94,9 @@ class l10n_be_vat_declaration(osv.osv_memory):
ctx['period_id'] = data['period_id'][0] ctx['period_id'] = data['period_id'][0]
tax_info = obj_tax_code.read(cr, uid, tax_code_ids, ['code','sum_period'], context=ctx) tax_info = obj_tax_code.read(cr, uid, tax_code_ids, ['code','sum_period'], context=ctx)
name = email = phone = address = post_code = city = country_code = '' default_address = obj_partner.address_get(cr, uid, [obj_company.partner_id.id])
name, email, phone, city, post_code, address, country_code = self.pool.get('res.company')._get_default_ad(obj_company.partner_id) default_address_id = default_address.get("default", obj_company.partner_id.id)
address_id= obj_partner.browse(cr, uid, default_address_id, context)
account_period = obj_acc_period.browse(cr, uid, data['period_id'][0], context=context) account_period = obj_acc_period.browse(cr, uid, data['period_id'][0], context=context)
issued_by = vat_no[:2] issued_by = vat_no[:2]
@ -106,21 +108,21 @@ class l10n_be_vat_declaration(osv.osv_memory):
ending_month = account_period.date_stop[5:7] ending_month = account_period.date_stop[5:7]
quarter = str(((int(starting_month) - 1) / 3) + 1) quarter = str(((int(starting_month) - 1) / 3) + 1)
if not email: if not address_id.email:
raise osv.except_osv(_('Insufficient Data!'),_('No email address associated with the company.')) raise osv.except_osv(_('Insufficient Data!'),_('No email address associated with the company.'))
if not phone: if not address_id.phone:
raise osv.except_osv(_('Insufficient Data!'),_('No phone associated with the company.')) raise osv.except_osv(_('Insufficient Data!'),_('No phone associated with the company.'))
file_data = { file_data = {
'issued_by': issued_by, 'issued_by': issued_by,
'vat_no': vat_no, 'vat_no': vat_no,
'only_vat': vat_no[2:], 'only_vat': vat_no[2:],
'cmpny_name': obj_company.name, 'cmpny_name': obj_company.name,
'address': address, 'address': "%s %s"%(address_id.street or "",address_id.street2 or ""),
'post_code': post_code, 'post_code': address_id.zip or "",
'city': city, 'city': address_id.city or "",
'country_code': country_code, 'country_code': address_id.country_id and address_id.country_id.code or "",
'email': email, 'email': address_id.email or "",
'phone': phone.replace('.','').replace('/','').replace('(','').replace(')','').replace(' ',''), 'phone': address_id.phone.replace('.','').replace('/','').replace('(','').replace(')','').replace(' ',''),
'send_ref': send_ref, 'send_ref': send_ref,
'quarter': quarter, 'quarter': quarter,
'month': starting_month, 'month': starting_month,

View File

@ -61,7 +61,7 @@ class partner_vat(osv.osv_memory):
company_id = self.pool.get('res.users').browse(cr, uid, uid, context=context).company_id.id company_id = self.pool.get('res.users').browse(cr, uid, uid, context=context).company_id.id
period_ids = obj_period.search(cr, uid, [('date_start' ,'>=', date_start), ('date_stop','<=',date_stop), ('company_id','=',company_id)]) period_ids = obj_period.search(cr, uid, [('date_start' ,'>=', date_start), ('date_stop','<=',date_stop), ('company_id','=',company_id)])
if not period_ids: if not period_ids:
raise osv.except_osv(_('Insufficient Data!'), _('No data for the selected year.')) raise osv.except_osv(_('insufficient data!'), _('No data for the selected year.'))
partners = [] partners = []
partner_ids = obj_partner.search(cr, uid, [('vat_subjected', '!=', False), ('vat','ilike','BE%')], context=context) partner_ids = obj_partner.search(cr, uid, [('vat_subjected', '!=', False), ('vat','ilike','BE%')], context=context)
@ -87,6 +87,9 @@ class partner_vat(osv.osv_memory):
if record['turnover'] >= data['limit_amount']: if record['turnover'] >= data['limit_amount']:
id_client = obj_vat_lclient.create(cr, uid, record, context=context) id_client = obj_vat_lclient.create(cr, uid, record, context=context)
partners.append(id_client) partners.append(id_client)
if not partners:
raise osv.except_osv(_('insufficient data!'), _('No data found for the selected year.'))
context.update({'partner_ids': partners, 'year': data['year'], 'limit_amount': data['limit_amount']}) context.update({'partner_ids': partners, 'year': data['year'], 'limit_amount': data['limit_amount']})
model_data_ids = obj_model_data.search(cr, uid, [('model','=','ir.ui.view'), ('name','=','view_vat_listing')]) model_data_ids = obj_model_data.search(cr, uid, [('model','=','ir.ui.view'), ('name','=','view_vat_listing')])
resource_id = obj_model_data.read(cr, uid, model_data_ids, fields=['res_id'])[0]['res_id'] resource_id = obj_model_data.read(cr, uid, model_data_ids, fields=['res_id'])[0]['res_id']
@ -190,7 +193,7 @@ class partner_vat_list(osv.osv_memory):
phone = ads.phone.replace(' ','') or '' phone = ads.phone.replace(' ','') or ''
email = ads.email or '' email = ads.email or ''
name = ads.name or '' name = ads.name or ''
city = obj_partner.get_city(cr, uid, ads.id) city = ads.city or ''
zip = obj_partner.browse(cr, uid, ads.id, context=context).zip or '' zip = obj_partner.browse(cr, uid, ads.id, context=context).zip or ''
if not city: if not city:
city = '' city = ''

View File

@ -6,18 +6,18 @@
<field name="model">partner.vat</field> <field name="model">partner.vat</field>
<field name="arch" type="xml"> <field name="arch" type="xml">
<form string="Partner VAT Listing" version="7.0"> <form string="Partner VAT Listing" version="7.0">
<header> <p class="oe_grey">
This wizard will create an XML file for VAT details and total invoiced amounts per partner.
</p>
<group>
<field name="year"/>
<field name="limit_amount"/>
</group>
<footer>
<button name="get_partner" string="View Customers" type="object" class="oe_highlight" /> <button name="get_partner" string="View Customers" type="object" class="oe_highlight" />
or or
<button string="Cancel" class="oe_link" special="cancel" /> <button string="Cancel" class="oe_link" special="cancel" />
</header> </footer>
<group>
<label string="This wizard will create an XML file for VAT details and total invoiced amounts per partner." colspan="4"/>
</group>
<newline/>
<field name="year"/>
<newline/>
<field name="limit_amount"/>
</form> </form>
</field> </field>
</record> </record>

View File

@ -108,7 +108,7 @@ class partner_vat_intra(osv.osv_memory):
# Get Company vat # Get Company vat
company_vat = data_company.partner_id.vat company_vat = data_company.partner_id.vat
if not company_vat: if not company_vat:
raise osv.except_osv(_('Insufficient Data!'),_('No VAT number associated with the company.')) raise osv.except_osv(_('insufficient data!'),_('No VAT number associated with your company.'))
company_vat = company_vat.replace(' ','').upper() company_vat = company_vat.replace(' ','').upper()
issued_by = company_vat[:2] issued_by = company_vat[:2]

View File

@ -8,7 +8,7 @@
<field name="inherit_id" ref="account.view_partner_property_form" /> <field name="inherit_id" ref="account.view_partner_property_form" />
<field name="arch" type="xml"> <field name="arch" type="xml">
<data> <data>
<xpath expr="//field[@name='bank_ids']/form/field[@name='acc_number']" position="before"> <xpath expr="//field[@name='bank_ids']//field[@name='acc_number']" position="before">
<newline /> <newline />
<field name="bank_code" /> <field name="bank_code" />
<field name="office" /> <field name="office" />

View File

@ -181,7 +181,7 @@
</record> </record>
<record id="sale.sale_order_5" model="sale.order"> <record id="sale.sale_order_5" model="sale.order">
<field name="company_id" ref="res_company_oerp_in"/> <field name="company_id" ref="base.main_company"/>
</record> </record>

View File

@ -61,7 +61,7 @@
<div class="oe_dropdown_kanban"> <div class="oe_dropdown_kanban">
<span> <span>
<a name="onclick_note_is_done" type="object" t-if="record.open.raw_value" class="oe_e">W</a> <a name="onclick_note_is_done" type="object" t-if="record.open.raw_value" class="oe_e">W</a>
<a name="onclick_note_not_done" type="object" t-if="!record.open.raw_value" class="oe_e">è</a> <a name="onclick_note_not_done" type="object" t-if="!record.open.raw_value" class="oe_e">W</a>
</span> </span>
<!-- dropdown menu --> <!-- dropdown menu -->

View File

@ -1,3 +0,0 @@
memo.css: memo.sass
sass -t expanded memo.sass memo.css

View File

@ -1,93 +1,53 @@
@charset "utf-8"; @charset "utf-8";
@font-face {
font-family: "mnmliconsRegular";
src: url("/web/static/src/font/mnmliconsv21-webfont.eot") format("eot");
src: url("/web/static/src/font/mnmliconsv21-webfont.woff") format("woff");
src: url("/web/static/src/font/mnmliconsv21-webfont.ttf") format("truetype");
src: url("/web/static/src/font/mnmliconsv21-webfont.svg") format("svg") active;
font-weight: normal;
font-style: normal;
}
@font-face {
font-family: "EntypoRegular";
src: url("/web/static/src/font/entypo-webfont.eot") format("eot");
src: url("/web/static/src/font/entypo-webfont.eot?#iefix") format("embedded-opentype");
src: url("/web/static/src/font/entypo-webfont.woff") format("woff");
src: url("/web/static/src/font/entypo-webfont.ttf") format("truetype");
src: url("/web/static/src/font/entypo-webfont.svg") format("svg") active;
font-weight: normal;
font-style: normal;
}
@-moz-keyframes bounce {
0% {
-moz-transform: scale(0);
opacity: 0;
}
50% {
-moz-transform: scale(1.3);
opacity: 0.4;
}
75% {
-moz-transform: scale(0.9);
opacity: 0.7;
}
100% {
-moz-transform: scale(1);
opacity: 1;
}
}
@-webkit-keyframes bounce {
0% {
-webkit-transform: scale(0);
opacity: 0;
}
50% {
-webkit-transform: scale(1.3);
opacity: 0.4;
}
75% {
-webkit-transform: scale(0.9);
opacity: 0.7;
}
100% {
-webkit-transform: scale(1);
opacity: 1;
}
}
.oe_kanban_color_2 {
background-color: red;
}
.oe_kanban_column .note_text_line_through { .oe_kanban_column .note_text_line_through {
text-decoration: line-through; text-decoration: line-through;
} }
.openerp .oe_fold_column .oe_kanban_card_fancy { .openerp .oe_kanban_view.oe_notes .oe_kanban_card_fancy.oe_kanban_color_0 {
text-decoration: none; box-shadow: 0px 4px 9px rgba(48, 48, 48, 0.15);
color: black; }
display: block; .openerp .oe_kanban_view.oe_notes .oe_kanban_card_fancy.oe_kanban_color_1 {
padding: 1em; box-shadow: 0px 4px 9px rgba(0, 0, 0, 0.15);
margin-right: 1em; }
margin-bottom: 1em; .openerp .oe_kanban_view.oe_notes .oe_kanban_card_fancy.oe_kanban_color_2 {
-moz-box-shadow: 5px 5px 7px #212121; box-shadow: 0px 4px 9px rgba(48, 0, 0, 0.15);
-webkit-box-shadow: 5px 5px 7px rgba(33, 33, 33, 0.7); }
box-shadow: 5px 5px 7px rgba(33, 33, 33, 0.7); .openerp .oe_kanban_view.oe_notes .oe_kanban_card_fancy.oe_kanban_color_3 {
box-shadow: 0px 4px 9px rgba(97, 93, 0, 0.16);
}
.openerp .oe_kanban_view.oe_notes .oe_kanban_card_fancy.oe_kanban_color_4 {
box-shadow: 0px 4px 9px rgba(77, 128, 0, 0.17);
}
.openerp .oe_kanban_view.oe_notes .oe_kanban_card_fancy.oe_kanban_color_5 {
box-shadow: 0px 4px 9px rgba(0, 88, 11, 0.15);
}
.openerp .oe_kanban_view.oe_notes .oe_kanban_card_fancy.oe_kanban_color_6 {
box-shadow: 0px 4px 9px rgba(0, 80, 95, 0.15);
}
.openerp .oe_kanban_view.oe_notes .oe_kanban_card_fancy.oe_kanban_color_7 {
box-shadow: 0px 4px 9px rgba(3, 13, 133, 0.18);
}
.openerp .oe_kanban_view.oe_notes .oe_kanban_card_fancy.oe_kanban_color_8 {
box-shadow: 0px 4px 9px rgba(56, 0, 128, 0.15);
}
.openerp .oe_kanban_view.oe_notes .oe_kanban_card_fancy.oe_kanban_color_9 {
box-shadow: 0px 4px 9px rgba(102, 0, 116, 0.15);
} }
.openerp .oe_kanban_record .oe_kanban_card_fancy { .openerp .oe_kanban_record .oe_kanban_card_fancy {
text-shadow: none;
border-radius: 2px;
padding: 12px;
margin-left: 3px;
margin-right: 3px;
padding-bottom: 16px;
margin-bottom: 16px;
-webkit-transform: rotate(-2deg); -webkit-transform: rotate(-2deg);
-o-transform: rotate(-2deg); -o-transform: rotate(-2deg);
-moz-transform: rotate(-2deg); -moz-transform: rotate(-2deg);
-webkit-transition: all 300ms cubic-bezier(0.5, 0, 0.5, 1);
-moz-transition: all 300ms cubic-bezier(0.5, 0, 0.5, 1);
-ms-transition: all 300ms cubic-bezier(0.5, 0, 0.5, 1);
transition: all 300ms cubic-bezier(0.5, 0, 0.5, 1);
} }
.openerp .oe_kanban_record:nth-of-type(even) .oe_kanban_card_fancy { .openerp .oe_kanban_record:nth-of-type(even) .oe_kanban_card_fancy {
-webkit-transform: rotate(1deg); -webkit-transform: rotate(1deg);
@ -132,12 +92,14 @@
.openerp .oe_kanban_column .oe_fold_column .oe_kanban_card_fancy:hover, .openerp .oe_kanban_column .oe_fold_column .oe_kanban_card_fancy:hover,
.openerp .oe_kanban_column .oe_fold_column .oe_kanban_card_fancy:focus { .openerp .oe_kanban_column .oe_fold_column .oe_kanban_card_fancy:focus {
box-shadow: 10px 10px 7px rgba(0, 0, 0, 0.7);
-moz-box-shadow: 10px 10px 7px rgba(0, 0, 0, 0.7);
-webkit-box-shadow: 10px 10px 7px rgba(0, 0, 0, 0.7);
position: relative; position: relative;
z-index: 5; z-index: 5;
-webkit-transform: rotate(0); border-color: rgba(0, 0, 0, 0.4);
-o-transform: rotate(0); -webkit-transition: all 150ms cubic-bezier(0.5, 0, 0.5, 1);
-moz-transform: rotate(0); -moz-transition: all 150ms cubic-bezier(0.5, 0, 0.5, 1);
-ms-transition: all 150ms cubic-bezier(0.5, 0, 0.5, 1);
transition: all 150ms cubic-bezier(0.5, 0, 0.5, 1);
-webkit-transform: rotate(0) !important;
-o-transform: rotate(0) !important;
-moz-transform: rotate(0) !important;
} }

View File

@ -1,168 +1,54 @@
@charset "utf-8" @charset "utf-8"
// Variables {{{
$section-title-color: #8786b7
$tag-bg-light: #f0f0fa
$tag-bg-dark: #8786b7
$tag-border: #afafb6
$tag-border-selected: #a6a6fe
$hover-background: #f0f0fa
$link-color: #8a89ba
$sheet-max-width: 860px
// }}}
// Mixins {{{
@font-face
font-family: 'mnmliconsRegular'
src: url('/web/static/src/font/mnmliconsv21-webfont.eot') format('eot')
src: url('/web/static/src/font/mnmliconsv21-webfont.woff') format('woff')
src: url('/web/static/src/font/mnmliconsv21-webfont.ttf') format('truetype')
src: url('/web/static/src/font/mnmliconsv21-webfont.svg') format('svg') active
font-weight: normal
font-style: normal
@font-face
font-family: 'EntypoRegular'
src: url('/web/static/src/font/entypo-webfont.eot') format('eot')
src: url('/web/static/src/font/entypo-webfont.eot?#iefix') format('embedded-opentype')
src: url('/web/static/src/font/entypo-webfont.woff') format('woff')
src: url('/web/static/src/font/entypo-webfont.ttf') format('truetype')
src: url('/web/static/src/font/entypo-webfont.svg') format('svg') active
font-weight: normal
font-style: normal
@mixin reset()
border: none
padding: 0
margin: 0
background: none
@include radius(none)
@include box-shadow(none)
@mixin vertical-gradient($startColor: #555, $endColor: #333)
background-color: $startColor
background-image: -webkit-gradient(linear, left top, left bottom, from($startColor), to($endColor)) /* Saf4+, Chrome */
background-image: -webkit-linear-gradient(top, $startColor, $endColor) /* Chrome 10+, Saf5.1+, iOS 5+ */
background-image: -moz-linear-gradient(top, $startColor, $endColor) /* FF3.6 */
background-image: -ms-linear-gradient(top, $startColor, $endColor) /* IE10 */
background-image: -o-linear-gradient(top, $startColor, $endColor) /* Opera 11.10+ */
background-image: linear-gradient(to bottom, $startColor, $endColor)
@mixin radial-gradient($gradient)
background-position: center center
background-image: -webkit-radial-gradient(circle, $gradient)
background-image: -moz-radial-gradient($gradient)
background-image: -ms-radial-gradient($gradient)
background-image: radial-gradient($gradient)
@mixin radius($radius: 5px)
-moz-border-radius: $radius
-webkit-border-radius: $radius
border-radius: $radius
@mixin box-shadow($bsval: 0px 1px 4px #777)
-moz-box-shadow: $bsval
-webkit-box-shadow: $bsval
box-shadow: $bsval
@mixin transition($transval: (border linear 0.2s, box-shadow linear 0.2s))
-webkit-transition: $transval
-moz-transition: $transval
-ms-transition: $transval
-o-transition: $transval
transition: $transval
@mixin opacity($opacity: .5)
filter: alpha(opacity=$opacity * 100)
opacity: $opacity
@mixin background-clip($clip: padding-box)
-webkit-background-clip: $clip
-moz-background-clip: $clip
background-clip: $clip
@mixin box-sizing($type: content)
// type = border || content || padding
-webkit-box-sizing: #{$type}-box
-moz-box-sizing: #{$type}-box
-ms-box-sizing: #{$type}-box
box-sizing: #{$type}-box
// Transforms the (readable) text of an inline element into an mmlicons icon,
// allows for actual readable text in-code (and in readers?) with iconic looks
@mixin text-to-icon($icon-name, $color: #404040)
font-size: 1px
letter-spacing: -1px
color: transparent
&: before
font: 21px "mnmliconsRegular"
content: $icon-name
color: $color
// }}}
// CSS animation bounces {{{
@-moz-keyframes bounce
0%
-moz-transform: scale(0)
opacity: 0
50%
-moz-transform: scale(1.3)
opacity: 0.4
75%
-moz-transform: scale(0.9)
opacity: 0.7
100%
-moz-transform: scale(1)
opacity: 1
@-webkit-keyframes bounce
0%
-webkit-transform: scale(0)
opacity: 0
50%
-webkit-transform: scale(1.3)
opacity: 0.4
75%
-webkit-transform: scale(0.9)
opacity: 0.7
100%
-webkit-transform: scale(1)
opacity: 1
// }}}
.oe_kanban_color_2
background-color: red
// au BufWritePost,FileWritePost *.sass : !sass --style expanded --line-numbers <afile> > "%: p: r.css"
.oe_kanban_column .oe_kanban_column
.note_text_line_through .note_text_line_through
text-decoration: line-through text-decoration: line-through
.openerp
.oe_fold_column
.oe_kanban_card_fancy
text-decoration: none
color: #000
display: block
padding: 1em
margin-right: 1em
margin-bottom: 1em
-moz-box-shadow: 5px 5px 7px rgba(33,33,33,1)
-webkit-box-shadow: 5px 5px 7px rgba(33,33,33,.7)
box-shadow: 5px 5px 7px rgba(33,33,33,.7)
@mixin rotate($a) @mixin rotate($a)
-webkit-transform: rotate($a) -webkit-transform: rotate($a)
-o-transform: rotate($a) -o-transform: rotate($a)
-moz-transform: rotate($a) -moz-transform: rotate($a)
@mixin transition($what:all,$duration:100ms)
-webkit-transition: $what $duration cubic-bezier(0.5,0,0.5,1)
-moz-transition: $what $duration cubic-bezier(0.5,0,0.5,1)
-ms-transition: $what $duration cubic-bezier(0.5,0,0.5,1)
transition: $what $duration cubic-bezier(0.5,0,0.5,1)
.openerp .openerp
.oe_kanban_view.oe_notes
.oe_kanban_card_fancy.oe_kanban_color_0
box-shadow: 0px 4px 9px rgba(48,48,48,0.15)
.oe_kanban_card_fancy.oe_kanban_color_1
box-shadow: 0px 4px 9px rgba(0,0,0,0.15)
.oe_kanban_card_fancy.oe_kanban_color_2
box-shadow: 0px 4px 9px rgba(48,0,0,0.15)
.oe_kanban_card_fancy.oe_kanban_color_3
box-shadow: 0px 4px 9px rgba(97,93,0,0.16)
.oe_kanban_card_fancy.oe_kanban_color_4
box-shadow: 0px 4px 9px rgba(77,128,0,0.17)
.oe_kanban_card_fancy.oe_kanban_color_5
box-shadow: 0px 4px 9px rgba(0,88,11,0.15)
.oe_kanban_card_fancy.oe_kanban_color_6
box-shadow: 0px 4px 9px rgba(0,80,95,0.15)
.oe_kanban_card_fancy.oe_kanban_color_7
box-shadow: 0px 4px 9px rgba(3,13,133,0.18)
.oe_kanban_card_fancy.oe_kanban_color_8
box-shadow: 0px 4px 9px rgba(56,0,128,0.15)
.oe_kanban_card_fancy.oe_kanban_color_9
box-shadow: 0px 4px 9px rgba(102,0,116,0.15)
.oe_kanban_record .oe_kanban_record
.oe_kanban_card_fancy .oe_kanban_card_fancy
text-shadow: none
border-radius: 2px
padding: 12px
margin-left: 3px
margin-right: 3px
padding-bottom: 16px
margin-bottom: 16px
@include rotate(-2deg) @include rotate(-2deg)
@include transition($what:all, $duration:300ms)
.oe_kanban_record:nth-of-type(even) .oe_kanban_record:nth-of-type(even)
.oe_kanban_card_fancy .oe_kanban_card_fancy
@include rotate(1deg) @include rotate(1deg)
@ -193,17 +79,16 @@ $sheet-max-width: 860px
@include rotate(-1deg) @include rotate(-1deg)
@mixin oe_kanban_card_fancy
box-shadow: 10px 10px 7px rgba(0,0,0,.7)
-moz-box-shadow: 10px 10px 7px rgba(0,0,0,.7)
-webkit-box-shadow: 10px 10px 7px rgba(0,0,0,.7)
position: relative
z-index: 5
@include rotate(0)
.openerp .openerp
.oe_kanban_column .oe_kanban_column
.oe_fold_column .oe_fold_column
.oe_kanban_card_fancy:hover, .oe_kanban_card_fancy:hover,
.oe_kanban_card_fancy:focus .oe_kanban_card_fancy:focus
@include oe_kanban_card_fancy position: relative
z-index: 5
border-color: rgba(0,0,0,0.4)
@include transition($what:all, $duration:150ms)
-webkit-transform: rotate(0) !important
-o-transform: rotate(0) !important
-moz-transform: rotate(0) !important

View File

@ -21,7 +21,7 @@
<!-- Company news and comments --> <!-- Company news and comments -->
<record id="message_company_news0" model="mail.message"> <record id="message_company_news0" model="mail.message">
<field name="subject">Our first company's blogpost !</field> <field name="subject">Our company's first blog-post !</field>
<field name="model">mail.group</field> <field name="model">mail.group</field>
<field name="res_id" ref="company_news_feed"/> <field name="res_id" ref="company_news_feed"/>
<field name="body"><![CDATA[Hello, and welcome to our company's portal ! <field name="body"><![CDATA[Hello, and welcome to our company's portal !

View File

@ -1293,7 +1293,7 @@ msgstr ""
#. module: project #. module: project
#: view:project.task:0 #: view:project.task:0
msgid "Delegations History" msgid "Delegation"
msgstr "" msgstr ""
#. module: project #. module: project

View File

@ -49,8 +49,9 @@ class project_task_type(osv.osv):
} }
_defaults = { _defaults = {
'sequence': 1, 'sequence': 1,
'state': 'draft', 'state': 'open',
'fold': False, 'fold': False,
'case_default': True,
} }
_order = 'sequence' _order = 'sequence'

View File

@ -130,7 +130,7 @@
</div> </div>
</group> </group>
<group> <group>
<group string="Administration"> <group string="Administration" groups="project.group_time_work_estimation_tasks">
<field name="planned_hours" widget="float_time"/> <field name="planned_hours" widget="float_time"/>
<field name="effective_hours" widget="float_time"/> <field name="effective_hours" widget="float_time"/>
<field name="resource_calendar_id"/> <field name="resource_calendar_id"/>
@ -143,7 +143,6 @@
<field name="currency_id" groups="base.group_multi_currency" required="1"/> <field name="currency_id" groups="base.group_multi_currency" required="1"/>
<field name="parent_id" domain="[('id','!=',analytic_account_id)]" context="{'current_model': 'project.project'}"/> <field name="parent_id" domain="[('id','!=',analytic_account_id)]" context="{'current_model': 'project.project'}"/>
</group> </group>
</group> </group>
</page> </page>
@ -295,16 +294,14 @@
<field name="help" type="html"> <field name="help" type="html">
<p class="oe_view_nocontent_create"> <p class="oe_view_nocontent_create">
Click to start a new project. Click to start a new project.
</p> </p><p>
<p>
Projects are used to organize your activities; plan Projects are used to organize your activities; plan
tasks, track issues, invoice timesheets. You can define tasks, track issues, invoice timesheets. You can define
internal projects (R&amp;D, Improve Sales Process), internal projects (R&amp;D, Improve Sales Process),
private projects (My Todos) or customer ones. private projects (My Todos) or customer ones.
</p> </p><p>
<p> You will be able collaborate with internal users on
You will be able collaborate with internal users on projects or invite customers to share your activities.
projects or invite customers to share your activities.
</p> </p>
</field> </field>
</record> </record>
@ -403,8 +400,6 @@
states="cancelled,done" context="{'button_reactivate':True}"/> states="cancelled,done" context="{'button_reactivate':True}"/>
<button name="action_close" string="Done" type="object" <button name="action_close" string="Done" type="object"
states="draft,open,pending"/> states="draft,open,pending"/>
<button name="%(action_project_task_delegate)d" string="Delegate" type="action"
states="pending,open,draft" groups="project.group_delegate_task"/>
<button name="do_cancel" string="Cancel" type="object" <button name="do_cancel" string="Cancel" type="object"
states="draft,open,pending"/> states="draft,open,pending"/>
</span> </span>
@ -451,7 +446,9 @@
</group> </group>
<div class="oe_clear"/> <div class="oe_clear"/>
</page> </page>
<page string="Delegations History" groups="project.group_delegate_task"> <page string="Delegation" groups="project.group_delegate_task">
<button name="%(action_project_task_delegate)d" string="Delegate" type="action"
states="pending,open,draft" groups="project.group_delegate_task"/>
<separator string="Parent Tasks"/> <separator string="Parent Tasks"/>
<field name="parent_ids"/> <field name="parent_ids"/>
<separator string="Delegated tasks"/> <separator string="Delegated tasks"/>
@ -519,7 +516,7 @@
<t t-if="widget.view.is_action_enabled('edit')"><li><a type="edit">Edit...</a></li></t> <t t-if="widget.view.is_action_enabled('edit')"><li><a type="edit">Edit...</a></li></t>
<t t-if="widget.view.is_action_enabled('delete')"><li><a type="delete">Delete</a></li></t> <t t-if="widget.view.is_action_enabled('delete')"><li><a type="delete">Delete</a></li></t>
<li> <li>
<ul class="oe_kanban_project_times"> <ul class="oe_kanban_project_times" groups="project.group_time_work_estimation_tasks">
<li><a name="set_remaining_time_1" type="object" class="oe_kanban_button">1</a></li> <li><a name="set_remaining_time_1" type="object" class="oe_kanban_button">1</a></li>
<li><a name="set_remaining_time_2" type="object" class="oe_kanban_button">2</a></li> <li><a name="set_remaining_time_2" type="object" class="oe_kanban_button">2</a></li>
<li><a name="set_remaining_time_5" type="object" class="oe_kanban_button">5</a></li> <li><a name="set_remaining_time_5" type="object" class="oe_kanban_button">5</a></li>
@ -536,7 +533,8 @@
<div> <div>
<field name="project_id"/> <field name="project_id"/>
<t t-esc="kanban_text_ellipsis(record.description.value, 160)"/><br/> <t t-esc="kanban_text_ellipsis(record.description.value, 160)"/><br/>
<i><field name="date_deadline"/></i> <t t-if="record.date_deadline.raw_value and record.date_deadline.raw_value lt (new Date())" t-set="red">oe_kanban_text_red</t>
<span t-attf-class="#{red || ''}"><i><field name="date_deadline"/></i></span>
</div> </div>
<div class="oe_kanban_bottom_right"> <div class="oe_kanban_bottom_right">
<a t-if="record.kanban_state.raw_value === 'normal'" type="object" string="Ready to Pull" name="set_kanban_state_done" class="oe_kanban_status"> </a> <a t-if="record.kanban_state.raw_value === 'normal'" type="object" string="Ready to Pull" name="set_kanban_state_done" class="oe_kanban_status"> </a>
@ -797,7 +795,7 @@
<menuitem id="menu_tasks_config" name="GTD" parent="base.menu_definitions" sequence="1"/> <menuitem id="menu_tasks_config" name="GTD" parent="base.menu_definitions" sequence="1"/>
<menuitem id="base.menu_project_config_project" name="Stages" parent="base.menu_definitions" sequence="1"/> <menuitem id="base.menu_project_config_project" name="Stages" parent="base.menu_definitions" sequence="1" groups="base.group_no_one"/>
<menuitem action="open_task_type_form" name="Task Stages" id="menu_task_types_view" parent="base.menu_project_config_project" sequence="2"/> <menuitem action="open_task_type_form" name="Task Stages" id="menu_task_types_view" parent="base.menu_project_config_project" sequence="2"/>
<menuitem action="open_view_project_all" id="menu_projects" name="Projects" parent="menu_project_management" sequence="1"/> <menuitem action="open_view_project_all" id="menu_projects" name="Projects" parent="menu_project_management" sequence="1"/>

View File

@ -30,7 +30,7 @@ class project_configuration(osv.osv_memory):
'module_project_mrp': fields.boolean('Generate tasks from sale orders', 'module_project_mrp': fields.boolean('Generate tasks from sale orders',
help ="""This feature automatically creates project tasks from service products in sale orders. help ="""This feature automatically creates project tasks from service products in sale orders.
More precisely, tasks are created for procurement lines with product of type 'Service', More precisely, tasks are created for procurement lines with product of type 'Service',
procurement method 'Make to Order', and supply method 'Produce'. procurement method 'Make to Order', and supply method 'Manufacture'.
This installs the module project_mrp."""), This installs the module project_mrp."""),
'module_pad': fields.boolean("Use integrated collaborative note pads on task", 'module_pad': fields.boolean("Use integrated collaborative note pads on task",
help="""Lets the company customize which Pad installation should be used to link to new pads help="""Lets the company customize which Pad installation should be used to link to new pads
@ -52,7 +52,7 @@ class project_configuration(osv.osv_memory):
'module_project_issue_sheet': fields.boolean("Invoice working time on issues", 'module_project_issue_sheet': fields.boolean("Invoice working time on issues",
help="""Provides timesheet support for the issues/bugs management in project. help="""Provides timesheet support for the issues/bugs management in project.
This installs the module project_issue_sheet."""), This installs the module project_issue_sheet."""),
'group_tasks_work_on_tasks': fields.boolean("Compute work activities on tasks", 'group_tasks_work_on_tasks': fields.boolean("Log work activities on tasks",
implied_group='project.group_tasks_work_on_tasks', implied_group='project.group_tasks_work_on_tasks',
help="Allows you to compute work on tasks."), help="Allows you to compute work on tasks."),
'group_time_work_estimation_tasks': fields.boolean("Manage time estimation on tasks", 'group_time_work_estimation_tasks': fields.boolean("Manage time estimation on tasks",
@ -72,4 +72,9 @@ class project_configuration(osv.osv_memory):
user = self.pool.get('res.users').browse(cr, uid, uid, context) user = self.pool.get('res.users').browse(cr, uid, uid, context)
user.company_id.write({'project_time_mode_id': config.time_unit.id}) user.company_id.write({'project_time_mode_id': config.time_unit.id})
def onchange_time_estimation_project_timesheet(self, cr, uid, ids, group_time_work_estimation_tasks, module_project_timesheet):
if group_time_work_estimation_tasks or module_project_timesheet:
return {'value': {'group_tasks_work_on_tasks': True}}
return {}
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

View File

@ -29,7 +29,7 @@
<label for="id" string="Task"/> <label for="id" string="Task"/>
<div> <div>
<div> <div>
<field name="module_project_timesheet" class="oe_inline"/> <field name="module_project_timesheet" on_change="onchange_time_estimation_project_timesheet(group_time_work_estimation_tasks, module_project_timesheet)" class="oe_inline"/>
<label for="module_project_timesheet"/> <label for="module_project_timesheet"/>
</div> </div>
<div> <div>
@ -50,7 +50,7 @@
<label for="id" string="Planning"/> <label for="id" string="Planning"/>
<div> <div>
<div> <div>
<field name="group_time_work_estimation_tasks" class="oe_inline"/> <field name="group_time_work_estimation_tasks" on_change="onchange_time_estimation_project_timesheet(group_time_work_estimation_tasks, module_project_timesheet)" class="oe_inline"/>
<label for="group_time_work_estimation_tasks"/> <label for="group_time_work_estimation_tasks"/>
</div> </div>
<div> <div>

View File

@ -100,8 +100,6 @@
states="open"/> states="open"/>
<button name="case_close" string="Done" type="object" <button name="case_close" string="Done" type="object"
states="draft,pending"/> states="draft,pending"/>
<button name="case_escalate" string="Escalate" type="object"
states="draft,open,pending"/>
<button name="case_cancel" string="Cancel" type="object" <button name="case_cancel" string="Cancel" type="object"
states="draft,open,pending"/> states="draft,open,pending"/>
</span> </span>
@ -118,7 +116,11 @@
</group> </group>
<group> <group>
<field name="priority"/> <field name="priority"/>
<field name="project_id" required="True" on_change="on_change_project(project_id)" context="{'default_use_issues':1}"/> <label for="project_id"/>
<div>
<field name="project_id" required="True" on_change="on_change_project(project_id)" class="oe_inline" context="{'default_use_issues':1}"/>
<button name="case_escalate" string="Escalate" type="object" states="draft,open,pending" class="oe_inline"/>
</div>
<label for="task_id"/> <label for="task_id"/>
<div> <div>
<field name="task_id" on_change="onchange_task_id(task_id)" class="oe_inline" context="{'default_project_id':project_id}"/> <field name="task_id" on_change="onchange_task_id(task_id)" class="oe_inline" context="{'default_project_id':project_id}"/>

View File

@ -73,6 +73,7 @@ class procurement_order(osv.osv):
'date_deadline': procurement.date_planned, 'date_deadline': procurement.date_planned,
'planned_hours': planned_hours, 'planned_hours': planned_hours,
'remaining_hours': planned_hours, 'remaining_hours': planned_hours,
'partner_id': procurement.sale_line_id and procurement.sale_line_id.order_id.partner_id.id or False,
'user_id': procurement.product_id.product_manager.id, 'user_id': procurement.product_id.product_manager.id,
'notes': procurement.note, 'notes': procurement.note,
'procurement_id': procurement.id, 'procurement_id': procurement.id,

View File

@ -318,21 +318,26 @@ class purchase_order(osv.osv):
for po in self.browse(cr, uid, ids, context=context): for po in self.browse(cr, uid, ids, context=context):
pick_ids += [picking.id for picking in po.picking_ids] pick_ids += [picking.id for picking in po.picking_ids]
res = mod_obj.get_object_reference(cr, uid, 'stock', 'view_picking_in_form') action_model, action_id = tuple(mod_obj.get_object_reference(cr, uid, 'stock', 'action_picking_tree4'))
res_id = res and res[1] or False action = self.pool.get(action_model).read(cr, uid, action_id, context=context)
ctx = eval(action['context'])
return { ctx.update({
'name': _('Receptions'), 'search_default_purchase_id': ids[0]
'view_type': 'form', })
'view_mode': 'form', if pick_ids and len(pick_ids) == 1:
'view_id': [res_id], form_view_ids = [view_id for view_id, view in action['views'] if view == 'form']
'res_model': 'stock.picking', view_id = form_view_ids and form_view_ids[0] or False
'context': "{'contact_display': 'partner'}", action.update({
'type': 'ir.actions.act_window', 'views': [],
'nodestroy': True, 'view_mode': 'form',
'target': 'current', 'view_id': view_id,
'res_id': pick_ids and pick_ids[0] or False, 'res_id': pick_ids[0]
} })
action.update({
'context': ctx,
})
return action
def wkf_approve_order(self, cr, uid, ids, context=None): def wkf_approve_order(self, cr, uid, ids, context=None):
self.write(cr, uid, ids, {'state': 'approved', 'date_approve': fields.date.context_today(self,cr,uid,context=context)}) self.write(cr, uid, ids, {'state': 'approved', 'date_approve': fields.date.context_today(self,cr,uid,context=context)})
@ -863,6 +868,12 @@ class purchase_order_line(osv.osv):
supplier_delay = int(supplier_info.delay) if supplier_info else 0 supplier_delay = int(supplier_info.delay) if supplier_info else 0
return datetime.strptime(date_order_str, DEFAULT_SERVER_DATE_FORMAT) + relativedelta(days=supplier_delay) return datetime.strptime(date_order_str, DEFAULT_SERVER_DATE_FORMAT) + relativedelta(days=supplier_delay)
def _check_product_uom_group(self, cr, uid, context=None):
group_uom = self.pool.get('ir.model.data').get_object(cr, uid, 'product', 'group_uom')
res = [user for user in group_uom.users if user.id == uid]
return len(res) and True or False
def onchange_product_id(self, cr, uid, ids, pricelist_id, product_id, qty, uom_id, def onchange_product_id(self, cr, uid, ids, pricelist_id, product_id, qty, uom_id,
partner_id, date_order=False, fiscal_position_id=False, date_planned=False, partner_id, date_order=False, fiscal_position_id=False, date_planned=False,
name=False, price_unit=False, context=None): name=False, price_unit=False, context=None):
@ -908,7 +919,8 @@ class purchase_order_line(osv.osv):
uom_id = product_uom_po_id uom_id = product_uom_po_id
if product.uom_id.category_id.id != product_uom.browse(cr, uid, uom_id, context=context).category_id.id: if product.uom_id.category_id.id != product_uom.browse(cr, uid, uom_id, context=context).category_id.id:
res['warning'] = {'title': _('Warning!'), 'message': _('Selected Unit of Measure does not belong to the same category as the product Unit of Measure.')} if self._check_product_uom_group(cr, uid, context=context):
res['warning'] = {'title': _('Warning!'), 'message': _('Selected Unit of Measure does not belong to the same category as the product Unit of Measure.')}
uom_id = product_uom_po_id uom_id = product_uom_po_id
res['value'].update({'product_uom': uom_id}) res['value'].update({'product_uom': uom_id})
@ -1083,15 +1095,15 @@ class procurement_order(osv.osv):
procurement_order() procurement_order()
class mail_message(osv.osv): class mail_mail(osv.osv):
_name = 'mail.message' _name = 'mail.mail'
_inherit = 'mail.message' _inherit = 'mail.mail'
def _postprocess_sent_message(self, cr, uid, message, context=None): def _postprocess_sent_message(self, cr, uid, mail, context=None):
if message.model == 'purchase.order': if mail.model == 'purchase.order':
wf_service = netsvc.LocalService("workflow") wf_service = netsvc.LocalService("workflow")
wf_service.trg_validate(uid, 'purchase.order', message.res_id, 'send_rfq', cr) wf_service.trg_validate(uid, 'purchase.order', mail.res_id, 'send_rfq', cr)
return super(mail_message, self)._postprocess_sent_message(cr, uid, message=message, context=context) return super(mail_mail, self)._postprocess_sent_message(cr, uid, mail=mail, context=context)
mail_message() mail_mail()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

View File

@ -14,19 +14,40 @@
<menuitem id="menu_purchase_config_purchase" name="Configuration" <menuitem id="menu_purchase_config_purchase" name="Configuration"
groups="group_purchase_manager" groups="group_purchase_manager"
parent="base.menu_purchase_root" sequence="100"/> parent="base.menu_purchase_root" sequence="100"/>
<menuitem
action="product.product_pricelist_action_for_purchase" id="menu_product_pricelist_action2_purchase"
parent="menu_purchase_config_purchase" sequence="10" groups="product.group_purchase_pricelist" />
<record id="purchase_pricelist_version_action" model="ir.actions.act_window">
<field name="name">Pricelist Versions</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">product.pricelist.version</field>
<field name="view_type">form</field>
<field name="view_id" ref="product.product_pricelist_version_tree_view"/>
<field name="domain">[('pricelist_id.type','=','purchase')]</field>
<field name="help" type="html">
<p class="oe_view_nocontent_create">
Click to add a pricelist version.
</p><p>
There can be more than one version of a pricelist, each of
these must be valid during a certain period of time. Some
examples of versions: Main Prices, 2010, 2011, Summer Sales,
etc.
</p>
</field>
</record>
<menuitem <menuitem
id="menu_purchase_config_pricelist" name="Pricelists" id="menu_purchase_config_pricelist" name="Pricelists"
parent="menu_purchase_config_purchase" sequence="50" groups="product.group_purchase_pricelist"/> parent="menu_purchase_config_purchase" sequence="50" groups="product.group_purchase_pricelist"/>
<menuitem <menuitem
action="product.product_pricelist_action" id="menu_product_pricelist_action_purhase" action="purchase_pricelist_version_action" id="menu_purchase_pricelist_version_action"
parent="menu_purchase_config_pricelist" sequence="20" groups="base.group_no_one"/> parent="menu_purchase_config_pricelist" sequence="2" groups="product.group_purchase_pricelist"/>
<menuitem <menuitem
action="product.product_pricelist_action_for_purchase" id="menu_product_pricelist_action2_purchase" action="product.product_price_type_action" id="menu_product_pricelist_action2_purchase_type"
parent="menu_purchase_config_pricelist" sequence="10" /> parent="menu_purchase_config_pricelist" sequence="60" />
<menuitem <menuitem
id="menu_product_in_config_purchase" name="Products" id="menu_product_in_config_purchase" name="Products"
parent="menu_purchase_config_purchase" sequence="30" groups="base.group_no_one"/> parent="menu_purchase_config_purchase" sequence="30" groups="base.group_no_one"/>
@ -188,7 +209,7 @@
<button name="view_picking" string="Receive Products" type="object" attrs="{'invisible': ['|', ('shipped','=',True), ('state','!=', 'approved')]}" class="oe_highlight"/> <button name="view_picking" string="Receive Products" type="object" attrs="{'invisible': ['|', ('shipped','=',True), ('state','!=', 'approved')]}" class="oe_highlight"/>
<button name="action_cancel_draft" states="cancel,sent,confirmed" string="Set to Draft" type="object" /> <button name="action_cancel_draft" states="cancel,sent,confirmed" string="Set to Draft" type="object" />
<button name="purchase_cancel" states="draft,confirmed,sent" string="Cancel"/> <button name="purchase_cancel" states="draft,confirmed,sent" string="Cancel"/>
<field name="state" widget="statusbar" statusbar_visible="draft,approved,done" statusbar_colors='{"except_picking":"red","except_invoice":"red","confirmed":"blue"}' readonly="1"/> <field name="state" widget="statusbar" statusbar_visible="draft,sent,approved,done" statusbar_colors='{"except_picking":"red","except_invoice":"red","confirmed":"blue"}' readonly="1"/>
</header> </header>
<sheet> <sheet>
<div class="oe_title"> <div class="oe_title">
@ -347,7 +368,7 @@
<field name="name">Quotations</field> <field name="name">Quotations</field>
<field name="type">ir.actions.act_window</field> <field name="type">ir.actions.act_window</field>
<field name="res_model">purchase.order</field> <field name="res_model">purchase.order</field>
<field name="context">{'search_default_draft': 1}</field> <field name="context">{}</field>
<field name="domain">[('state','in',('draft','sent','confirmed'))]</field> <field name="domain">[('state','in',('draft','sent','confirmed'))]</field>
<field name="view_mode">tree,form,graph,calendar</field> <field name="view_mode">tree,form,graph,calendar</field>
<field name="search_view_id" ref="view_purchase_order_filter"/> <field name="search_view_id" ref="view_purchase_order_filter"/>

View File

@ -145,7 +145,7 @@
<record id="trans_router_invoice_no_order" model="workflow.transition"> <record id="trans_router_invoice_no_order" model="workflow.transition">
<field name="act_from" ref="act_router"/> <field name="act_from" ref="act_router"/>
<field name="act_to" ref="act_invoice_end"/> <field name="act_to" ref="act_invoice_end"/>
<field name="condition">invoice_method&lt;&gt;'order'</field> <field name="condition">invoice_method&lt;&gt;'order' and invoiced</field>
</record> </record>
<record id="trans_except_picking_picking_done" model="workflow.transition"> <record id="trans_except_picking_picking_done" model="workflow.transition">
<field name="act_from" ref="act_except_picking"/> <field name="act_from" ref="act_except_picking"/>

View File

@ -46,10 +46,6 @@ class purchase_config_settings(osv.osv_memory):
'group_purchase_delivery_address': fields.boolean("Allow a different address for incoming products and invoicings", 'group_purchase_delivery_address': fields.boolean("Allow a different address for incoming products and invoicings",
implied_group='purchase.group_delivery_invoice_address', implied_group='purchase.group_delivery_invoice_address',
help="Allows you to specify different delivery and invoice addresses on a purchase order."), help="Allows you to specify different delivery and invoice addresses on a purchase order."),
'module_purchase_analytic_plans': fields.boolean('Allow using multiple analytic accounts on the same order',
help ="""Allows the user to maintain several analysis plans. These let you split
lines on a purchase order between several accounts and analytic plans.
This installs the module purchase_analytic_plans."""),
'module_warning': fields.boolean("Alerts by products or supplier", 'module_warning': fields.boolean("Alerts by products or supplier",
help="""Allow to configure warnings on products and trigger them when a user wants to purchase a given product or a given supplier. help="""Allow to configure warnings on products and trigger them when a user wants to purchase a given product or a given supplier.
Example: Product: this product is deprecated, do not purchase more than 5. Example: Product: this product is deprecated, do not purchase more than 5.
@ -62,6 +58,12 @@ class purchase_config_settings(osv.osv_memory):
help="""Purchase Requisitions are used when you want to request quotations from several suppliers for a given set of products. help="""Purchase Requisitions are used when you want to request quotations from several suppliers for a given set of products.
You can configure per product if you directly do a Request for Quotation You can configure per product if you directly do a Request for Quotation
to one supplier or if you want a purchase requisition to negotiate with several suppliers."""), to one supplier or if you want a purchase requisition to negotiate with several suppliers."""),
'module_purchase_analytic_plans': fields.boolean('Use multiple analytic accounts on purchase orders',
help ="""Allows the user to maintain several analysis plans. These let you split lines on a purchase order between several accounts and analytic plans.
This installs the module purchase_analytic_plans."""),
'group_analytic_account_for_purchases': fields.boolean('Analytic accounting for purchases',
implied_group='purchase.group_analytic_accounting',
help="Allows you to specify an analytic account on purchase orders."),
} }
_defaults = { _defaults = {
@ -75,7 +77,8 @@ class account_config_settings(osv.osv_memory):
_inherit = 'account.config.settings' _inherit = 'account.config.settings'
_columns = { _columns = {
'module_purchase_analytic_plans': fields.boolean('Use multiple analytic accounts on orders', 'module_purchase_analytic_plans': fields.boolean('Use multiple analytic accounts on orders',
help="""This allows install module purchase_analytic_plans."""), help ="""Allows the user to maintain several analysis plans. These let you split lines on a purchase order between several accounts and analytic plans.
This installs the module purchase_analytic_plans."""),
'group_analytic_account_for_purchases': fields.boolean('Analytic accounting for purchases', 'group_analytic_account_for_purchases': fields.boolean('Analytic accounting for purchases',
implied_group='purchase.group_analytic_accounting', implied_group='purchase.group_analytic_accounting',
help="Allows you to specify an analytic account on purchase orders."), help="Allows you to specify an analytic account on purchase orders."),

View File

@ -74,6 +74,10 @@
<field name="module_purchase_analytic_plans" class="oe_inline"/> <field name="module_purchase_analytic_plans" class="oe_inline"/>
<label for="module_purchase_analytic_plans"/> <label for="module_purchase_analytic_plans"/>
</div> </div>
<div>
<field name="group_analytic_account_for_purchases" class="oe_inline"/>
<label for="group_analytic_account_for_purchases"/>
</div>
</div> </div>
</group> </group>
</form> </form>

View File

@ -11,16 +11,6 @@
</xpath> </xpath>
</field> </field>
</record> </record>
<record id="stock_picking_inherit_purchase" model="ir.ui.view">
<field name="name">Picking list</field>
<field name="model">stock.picking</field>
<field name="inherit_id" ref="stock.view_picking_form"/>
<field name="arch" type="xml">
<field name="auto_picking" position="after">
<field name="purchase_id" invisible="1"/>
</field>
</field>
</record>
<record id="stock_picking_in_inherit_purchase" model="ir.ui.view"> <record id="stock_picking_in_inherit_purchase" model="ir.ui.view">
<field name="name">Incoming Picking Inherited</field> <field name="name">Incoming Picking Inherited</field>
@ -36,63 +26,18 @@
</field> </field>
</record> </record>
<!-- Picking to Invoice --> <record id="view_picking_in_search_picking_inherit" model="ir.ui.view">
<record id="view_picking_in_search_picking_to_invoice" model="ir.ui.view"> <field name="name">stock.picking.in.search.inherit</field>
<field name="name">stock.picking.in.search</field>
<field name="model">stock.picking.in</field> <field name="model">stock.picking.in</field>
<field name="inherit_id" ref="stock.view_picking_in_search"/>
<field name="arch" type="xml"> <field name="arch" type="xml">
<search string="Picking to Invoice"> <xpath expr="//field[@name='product_id']" position="before">
<field name="name" string="Picking to Invoice" filter_domain="['|',('name','ilike',self),('origin','ilike',self)]"/> <field name="purchase_id"/>
<filter icon="terp-check" name="available" string="Available" domain="[('state','=','assigned')]" help="Incoming Shipments Available"/> </xpath>
<filter icon="terp-dialog-close" name="done" string="Received" domain="[('state','=','done')]" help="Incoming Shipments already Received"/>
<separator/>
<filter icon="terp-accessories-archiver-minus" string="Back Orders" domain="[('backorder_id', '!=', False)]" help="Is a Back Order"/>
<separator/>
<filter string="To Invoice" name="to_invoice" icon="terp-dolar" domain="[('invoice_state', '=', '2binvoiced')]"/>
<field name="stock_journal_id"/>
<field name="company_id" groups="base.group_multi_company"/>
<field name="purchase_id" />
<group expand="0" string="Group By..." colspan="4" col="8">
<filter icon="terp-stock_effects-object-colorize" name="Status" string="Status" domain="[]" context="{'group_by':'state'}"/>
<filter string="Order Date" icon="terp-go-month" domain="[]" context="{'group_by':'date'}"/>
<filter string="Scheduled Date" icon="terp-go-month" domain="[]" context="{'group_by':'min_date'}"/>
<filter string="Journal" icon="terp-folder-orange" domain="[]" context="{'group_by':'stock_journal_id'}"/>
</group>
</search>
</field> </field>
</record> </record>
<record id="act_purchase_order_2_stock_picking" model="ir.actions.act_window">
<field name="name">Incoming Shipments</field>
<field name="res_model">stock.picking.in</field>
<field name="type">ir.actions.act_window</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form,calendar</field>
<field name="domain">[('type','=','in')]</field>
<field name="context">{'search_default_purchase_id': active_id,'default_type': 'in'}</field>
<field name="search_view_id" ref="view_picking_in_search_picking_to_invoice"/>
</record>
<record id="act_purchase_order_2_stock_picking_tree" model="ir.actions.act_window.view">
<field eval="1" name="sequence"/>
<field name="view_mode">tree</field>
<field name="view_id" ref="stock.view_picking_in_tree"/>
<field name="act_window_id" ref="act_purchase_order_2_stock_picking"/>
</record>
<record id="act_purchase_order_2_stock_picking_form" model="ir.actions.act_window.view">
<field eval="2" name="sequence"/>
<field name="view_mode">form</field>
<field name="view_id" ref="stock.view_picking_in_form"/>
<field name="act_window_id" ref="act_purchase_order_2_stock_picking"/>
</record>
<record id="act_purchase_order_2_stock_picking_calendar" model="ir.actions.act_window.view">
<field eval="3" name="sequence"/>
<field name="view_mode">calendar</field>
<field name="view_id" ref="stock.stock_picking_in_calendar"/>
<field name="act_window_id" ref="act_purchase_order_2_stock_picking"/>
</record>
<!-- is it need ? we have another method "Receive Products"-->
<record id="purchase_order_2_stock_picking" model="ir.ui.view"> <record id="purchase_order_2_stock_picking" model="ir.ui.view">
<field name="name">Purchase Picking Inherited</field> <field name="name">Purchase Picking Inherited</field>
<field name="model">purchase.order</field> <field name="model">purchase.order</field>
@ -100,8 +45,8 @@
<field name="arch" type="xml"> <field name="arch" type="xml">
<xpath expr="//div[contains(@class, 'oe_title')]" position="before"> <xpath expr="//div[contains(@class, 'oe_title')]" position="before">
<div class="oe_right oe_button_box" name="buttons"> <div class="oe_right oe_button_box" name="buttons">
<button type="action" <button type="object"
name="%(act_purchase_order_2_stock_picking)d" name="view_picking"
string="Incoming Shipments" states="approved"/> string="Incoming Shipments" states="approved"/>
</div> </div>
</xpath> </xpath>
@ -110,13 +55,13 @@
<record id="action_picking_tree4_picking_to_invoice" model="ir.actions.act_window"> <record id="action_picking_tree4_picking_to_invoice" model="ir.actions.act_window">
<field name="name">On Incoming Shipments</field> <field name="name">On Incoming Shipments</field>
<field name="res_model">stock.picking</field> <field name="res_model">stock.picking.in</field>
<field name="type">ir.actions.act_window</field> <field name="type">ir.actions.act_window</field>
<field name="view_type">form</field> <field name="view_type">form</field>
<field name="view_mode">tree,form,calendar</field> <field name="view_mode">tree,form,calendar</field>
<field name="domain">[('type','=','in')]</field> <field name="domain">[('type','=','in')]</field>
<field name="context">{"default_type": "in", "contact_display": "partner_address", "search_default_done": 1, "search_default_to_invoice": 1}</field> <field name="context">{"default_type": "in", "contact_display": "partner_address", "search_default_done": 1, "search_default_to_invoice": 1}</field>
<field name="search_view_id" ref="view_picking_in_search_picking_to_invoice"/> <field name="search_view_id" ref="stock.view_picking_in_search"/>
<field name="help" type="html"> <field name="help" type="html">
<p> <p>
Here you can track all the product receptions of purchase Here you can track all the product receptions of purchase

View File

@ -771,7 +771,8 @@ class sale_order(osv.osv):
'default_res_id': ids[0], 'default_res_id': ids[0],
'default_use_template': True, 'default_use_template': True,
'default_template_id': template_id, 'default_template_id': template_id,
}) 'mark_so_as_sent': True
})
return { return {
'view_type': 'form', 'view_type': 'form',
'view_mode': 'form', 'view_mode': 'form',
@ -1476,15 +1477,14 @@ class sale_order_line(osv.osv):
sale_order_line() sale_order_line()
class mail_message(osv.osv): class mail_compose_message(osv.osv):
_inherit = 'mail.message' _inherit = 'mail.compose.message'
def send_mail(self, cr, uid, ids, context=None):
def _postprocess_sent_message(self, cr, uid, message, context=None): context = context or {}
if message.model == 'sale.order': if context.get('mark_so_as_sent', False) and context.get('default_res_id', False):
wf_service = netsvc.LocalService("workflow") wf_service = netsvc.LocalService("workflow")
wf_service.trg_validate(uid, 'sale.order', message.res_id, 'quotation_sent', cr) wf_service.trg_validate(uid, 'sale.order', context.get('default_res_id', False), 'quotation_sent', cr)
return super(mail_message, self)._postprocess_sent_message(cr, uid, message=message, context=context) return super(mail_compose_message, self).send_mail(cr, uid, ids, context=context)
mail_compose_message()
mail_message()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

View File

@ -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 Quote" name="%(action_crm_make_sale)d" type="action" class="oe_highlight"/> <button states="done" string="Convert to Quotation" name="%(action_crm_make_sale)d" type="action" class="oe_highlight"/>
<button states="draft,open,pending" string="Convert to Quote" 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"/>
</xpath> </xpath>
</data> </data>
</field> </field>

View File

@ -673,6 +673,13 @@ class stock_picking(osv.osv):
] ]
def action_process(self, cr, uid, ids, context=None): def action_process(self, cr, uid, ids, context=None):
if context is None:
context = {}
context.update({
'active_model': self._name,
'active_ids': ids,
'active_id': len(ids) and ids[0] or False
})
return { return {
'view_type': 'form', 'view_type': 'form',
'view_mode': 'form', 'view_mode': 'form',

View File

@ -107,21 +107,10 @@ class stock_partial_picking(osv.osv_memory):
picking_ids = context.get('active_ids', []) picking_ids = context.get('active_ids', [])
active_model = context.get('active_model') active_model = context.get('active_model')
if active_model == 'purchase.order':
for purchase_order in self.pool.get('purchase.order').browse(cr, uid, picking_ids, context=context):
picking_ids = [picking_id.id for picking_id in purchase_order.picking_ids]
elif active_model == 'sale.order':
for sale_order in self.pool.get('sale.order').browse(cr, uid, picking_ids, context=context):
picking_ids = [picking.id for picking in sale_order.picking_ids]
if not picking_ids or len(picking_ids) != 1: if not picking_ids or len(picking_ids) != 1:
# Partial Picking Processing may only be done for one picking at a time # Partial Picking Processing may only be done for one picking at a time
return res return res
# The check about active_model is there in case the client mismatched the context during propagation of it assert active_model in ('stock.picking', 'stock.picking.in', 'stock.picking.out'), 'Bad context propagation'
# (already seen in previous bug where context passed was containing ir.ui.menu as active_model and the menu
# ID as active_id). Though this should be fixed in clients now, this place is sensitive enough to ensure the
# consistancy of the context.
assert active_model in ('stock.picking', 'stock.picking.in', 'stock.picking.out', 'purchase.order', 'sale.order'), 'Bad context propagation'
picking_id, = picking_ids picking_id, = picking_ids
if 'picking_id' in fields: if 'picking_id' in fields:
res.update(picking_id=picking_id) res.update(picking_id=picking_id)

View File

@ -30,7 +30,7 @@
<t t-name="LinkedIn.DisabledWarning"> <t t-name="LinkedIn.DisabledWarning">
<div> <div>
LinkedIn access was not enabled on this server. LinkedIn access was not enabled on this server.
Please ask your administrator to configure it in Settings > Configuration > Linkedin. Please ask your administrator to configure it in Settings > Configuration > Sales > Social Network Integration.
</div> </div>
</t> </t>
</templates> </templates>