[MERGE] forward port of branch 8.0 up to fd4fd35

This commit is contained in:
Christophe Simonis
2014-07-30 20:52:43 +02:00
366 changed files with 2163 additions and 1801 deletions
+1 -1
View File
@@ -1,4 +1,4 @@
[![Build Status](http://runbot.odoo.com/runbot/badge/default/1/master.svg)](http://runbot.odoo.com/runbot)
[![Build Status](http://runbot.odoo.com/runbot/badge/default/1/8.0.svg)](http://runbot.odoo.com/runbot)
Odoo
----
+2 -2
View File
@@ -669,7 +669,7 @@ class account_account(osv.osv):
# For legal reason (forbiden to modify journal entries which belongs to a closed fy or period), Forbid to modify
# the code of an account if journal entries have been already posted on this account. This cannot be simply
# 'configurable' since it can lead to a lack of confidence in OpenERP and this is what we want to change.
# 'configurable' since it can lead to a lack of confidence in Odoo and this is what we want to change.
def _check_allow_code_change(self, cr, uid, ids, context=None):
line_obj = self.pool.get('account.move.line')
for account in self.browse(cr, uid, ids, context=context):
@@ -2488,7 +2488,7 @@ class account_account_template(osv.osv):
('other','Regular'),
('closed','Closed'),
], 'Internal Type', required=True,help="This type is used to differentiate types with "\
"special effects in OpenERP: view can not have entries, consolidation are accounts that "\
"special effects in Odoo: view can not have entries, consolidation are accounts that "\
"can have children accounts for multi-company consolidations, payable/receivable are for "\
"partners accounts (for debit/credit computations), closed for depreciated accounts."),
'user_type': fields.many2one('account.account.type', 'Account Type', required=True,
+23 -7
View File
@@ -326,16 +326,26 @@ class account_bank_statement(osv.osv):
or (not st.journal_id.default_debit_account_id):
raise osv.except_osv(_('Configuration Error!'), _('Please verify that an account is defined in the journal.'))
for line in st.move_line_ids:
if line.state <> 'valid':
if line.state != 'valid':
raise osv.except_osv(_('Error!'), _('The account entries lines are not in valid state.'))
move_ids = []
for st_line in st.line_ids:
if not st_line.amount:
continue
if not st_line.journal_entry_id.id:
if st_line.account_id and not st_line.journal_entry_id.id:
#make an account move as before
vals = {
'debit': st_line.amount < 0 and -st_line.amount or 0.0,
'credit': st_line.amount > 0 and st_line.amount or 0.0,
'account_id': st_line.account_id.id,
'name': st_line.name
}
self.pool.get('account.bank.statement.line').process_reconciliation(cr, uid, st_line.id, [vals], context=context)
elif not st_line.journal_entry_id.id:
raise osv.except_osv(_('Error!'), _('All the account entries lines must be processed in order to close the statement.'))
move_ids.append(st_line.journal_entry_id.id)
self.pool.get('account.move').post(cr, uid, move_ids, context=context)
if move_ids:
self.pool.get('account.move').post(cr, uid, move_ids, context=context)
self.message_post(cr, uid, [st.id], body=_('Statement %s confirmed, journal items were created.') % (st.name,), context=context)
self.link_bank_to_partner(cr, uid, ids, context=context)
return self.write(cr, uid, ids, {'state': 'confirm'}, context=context)
@@ -728,7 +738,12 @@ class account_bank_statement_line(osv.osv):
move_id = am_obj.create(cr, uid, move_vals, context=context)
# Create the move line for the statement line
amount = currency_obj.compute(cr, uid, st_line.statement_id.currency.id, company_currency.id, st_line.amount, context=context)
if st_line.statement_id.currency.id != company_currency.id:
ctx = context.copy()
ctx['date'] = st_line.date
amount = currency_obj.compute(cr, uid, st_line.statement_id.currency.id, company_currency.id, st_line.amount_currency, context=ctx)
else:
amount = st_line.amount
bank_st_move_vals = bs_obj._prepare_bank_move_line(cr, uid, st_line, move_id, amount, company_currency.id, context=context)
aml_obj.create(cr, uid, bank_st_move_vals, context=context)
# Complete the dicts
@@ -805,18 +820,19 @@ class account_bank_statement_line(osv.osv):
_description = "Bank Statement Line"
_inherit = ['ir.needaction_mixin']
_columns = {
'name': fields.char('Description', required=True, copy=False),
'date': fields.date('Date', required=True, copy=False),
'name': fields.char('Description', required=True),
'date': fields.date('Date', required=True),
'amount': fields.float('Amount', digits_compute=dp.get_precision('Account')),
'partner_id': fields.many2one('res.partner', 'Partner'),
'bank_account_id': fields.many2one('res.partner.bank','Bank Account'),
'account_id': fields.many2one('account.account', 'Account', help="This technical field can be used at the statement line creation/import time in order to avoid the reconciliation process on it later on. The statement line will simply create a counterpart on this account"),
'statement_id': fields.many2one('account.bank.statement', 'Statement', select=True, required=True, ondelete='cascade'),
'journal_id': fields.related('statement_id', 'journal_id', type='many2one', relation='account.journal', string='Journal', store=True, readonly=True),
'ref': fields.char('Structured Communication'),
'note': fields.text('Notes'),
'sequence': fields.integer('Sequence', select=True, help="Gives the sequence order when displaying a list of bank statement lines."),
'company_id': fields.related('statement_id', 'company_id', type='many2one', relation='res.company', string='Company', store=True, readonly=True),
'journal_entry_id': fields.many2one('account.move', 'Journal Entry'),
'journal_entry_id': fields.many2one('account.move', 'Journal Entry', copy=False),
'amount_currency': fields.float('Amount Currency', help="The amount expressed in an optional other currency if it is a multi-currency entry.", digits_compute=dp.get_precision('Account')),
'currency_id': fields.many2one('res.currency', 'Currency', help="The optional other currency if it is a multi-currency entry."),
}
+1 -1
View File
@@ -47,7 +47,7 @@
Configure your company's bank account and select those that must
appear on the report footer.
</p><p>
If you use the accounting application of OpenERP, journals and
If you use the accounting application of Odoo, journals and
accounts will be created automatically based on these data.
</p>
</field>
+8 -5
View File
@@ -1005,15 +1005,18 @@ class account_invoice(models.Model):
#TODO: implement messages system
return True
@api.one
def _compute_display_name(self):
@api.multi
def name_get(self):
TYPES = {
'out_invoice': _('Invoice'),
'in_invoice': _('Supplier Invoice'),
'out_refund': _('Refund'),
'in_refund': _('Supplier Refund'),
}
self.display_name = "%s %s" % (self.number or TYPES[self.type], self.name or '')
result = []
for inv in self:
result.append((inv.id, "%s %s" % (inv.number or TYPES[inv.type], inv.name or '')))
return result
@api.model
def name_search(self, name, args=None, operator='ilike', limit=100):
@@ -1627,8 +1630,8 @@ class mail_compose_message(models.Model):
context.get('default_res_id') and context.get('mark_invoice_as_sent'):
invoice = self.env['account.invoice'].browse(context['default_res_id'])
invoice = invoice.with_context(mail_post_autofollow=True)
self.write({'sent': True})
self.message_post(body=_("Invoice sent"))
invoice.write({'sent': True})
invoice.message_post(body=_("Invoice sent"))
return super(mail_compose_message, self).send_mail()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
+6 -6
View File
@@ -61,7 +61,7 @@
<group>
<field domain="[('company_id', '=', parent.company_id), ('journal_id', '=', parent.journal_id), ('type', '&lt;&gt;', 'view')]" name="account_id" on_change="onchange_account_id(product_id, parent.partner_id, parent.type, parent.fiscal_position,account_id)" groups="account.group_account_user"/>
<field name="invoice_line_tax_id" context="{'type':parent.get('type')}" domain="[('parent_id','=',False),('company_id', '=', parent.company_id)]" widget="many2many_tags"/>
<field domain="[('type','&lt;&gt;','view'), ('company_id', '=', parent.company_id)]" name="account_analytic_id" groups="analytic.group_analytic_accounting"/>
<field domain="[('type','&lt;&gt;','view'), ('company_id', '=', parent.company_id)], ('state','not in',('close','cancelled'))]" name="account_analytic_id" groups="analytic.group_analytic_accounting"/>
<field name="company_id" groups="base.group_multi_company" readonly="1"/>
</group>
</group>
@@ -95,7 +95,7 @@
<field name="name"/>
<field name="sequence"/>
<field name="account_id" groups="account.group_account_user"/>
<field name="account_analytic_id" domain="[('type','&lt;&gt;','view'), ('company_id', '=', parent.company_id)]" groups="analytic.group_analytic_accounting"/>
<field name="account_analytic_id" domain="[('type','&lt;&gt;','view'), ('company_id', '=', parent.company_id), ('state','not in',('close','cancelled')]" groups="analytic.group_analytic_accounting"/>
<field name="manual"/>
<field name="amount"/>
<field name="base" readonly="0"/>
@@ -201,7 +201,7 @@
domain="[('company_id', '=', parent.company_id), ('journal_id', '=', parent.journal_id), ('type', '=', 'other')]"
on_change="onchange_account_id(product_id, parent.partner_id, parent.type, parent.fiscal_position,account_id)"/>
<field name="account_analytic_id" groups="analytic.group_analytic_accounting"
domain="[('type','!=','view'), ('company_id', '=', parent.company_id)]"/>
domain="[('type','!=','view'), ('company_id', '=', parent.company_id), ('state','not in',('close','cancelled'))]"/>
<field name="quantity"/>
<field name="uos_id" groups="product.group_uom"
on_change="uos_id_change(product_id, uos_id, quantity, name, parent.type, parent.partner_id, parent.fiscal_position, price_unit, parent.currency_id, context, parent.company_id)"/>
@@ -358,7 +358,7 @@
domain="[('company_id', '=', parent.company_id), ('journal_id', '=', parent.journal_id), ('type', '=', 'other')]"
on_change="onchange_account_id(product_id, parent.partner_id, parent.type, parent.fiscal_position,account_id)"/>
<field name="account_analytic_id" groups="analytic.group_analytic_accounting"
domain="[('type','!=','view'), ('company_id', '=', parent.company_id)]"/>
domain="[('type','!=','view'), ('company_id', '=', parent.company_id), ('state','not in',('close','cancelled'))]"/>
<field name="quantity"/>
<field name="uos_id" groups="product.group_uom"
on_change="uos_id_change(product_id, uos_id, quantity, name, parent.type, parent.partner_id, parent.fiscal_position, price_unit, parent.currency_id, context, parent.company_id)"/>
@@ -523,7 +523,7 @@
<p class="oe_view_nocontent_create">
Click to create a customer invoice.
</p><p>
OpenERP's electronic invoicing allows to ease and fasten the
Odoo's electronic invoicing allows to ease and fasten the
collection of customer payments. Your customer receives the
invoice by email and he can pay online and/or import it
in his own system.
@@ -564,7 +564,7 @@
Click to record a new supplier invoice.
</p><p>
You can control the invoice from your supplier according to
what you purchased or received. OpenERP can also generate
what you purchased or received. Odoo can also generate
draft invoices automatically from purchase orders or receipts.
</p>
</field>
+4 -2
View File
@@ -583,7 +583,7 @@ class account_move_line(osv.osv):
def _check_no_view(self, cr, uid, ids, context=None):
lines = self.browse(cr, uid, ids, context=context)
for l in lines:
if l.account_id.type == 'view':
if l.account_id.type in ('view', 'consolidation'):
return False
return True
@@ -635,7 +635,7 @@ class account_move_line(osv.osv):
return True
_constraints = [
(_check_no_view, 'You cannot create journal items on an account of type view.', ['account_id']),
(_check_no_view, 'You cannot create journal items on an account of type view or consolidation.', ['account_id']),
(_check_no_closed, 'You cannot create journal items on closed account.', ['account_id']),
(_check_company_id, 'Account and Period must belong to the same company.', ['company_id']),
(_check_date, 'The date of your Journal Entry is not in the defined period! You should change the date or remove this constraint from the journal.', ['date']),
@@ -1038,6 +1038,8 @@ class account_move_line(osv.osv):
all_moves = list(set(all_moves) - set(move_ids))
if unlink_ids:
if opening_reconciliation:
raise osv.except_osv(_('Warning!'),
_('Opening Entries have already been generated. Please run "Cancel Closing Entries" wizard to cancel those entries and then run this wizard.'))
obj_move_rec.write(cr, uid, unlink_ids, {'opening_reconciliation': False})
obj_move_rec.unlink(cr, uid, unlink_ids)
if len(all_moves) >= 2:
+6 -6
View File
@@ -650,7 +650,7 @@
occurring over a given period of time on a bank account. You
should receive this periodicaly from your bank.
</p><p>
OpenERP allows you to reconcile a statement line directly with
Odoo allows you to reconcile a statement line directly with
the related sale or puchase invoices.
</p>
</field>
@@ -920,7 +920,7 @@
Click to define a new tax code.
</p><p>
Depending on the country, a tax code is usually a cell to fill
in your legal tax statement. OpenERP allows you to define the
in your legal tax statement. Odoo allows you to define the
tax structure and each tax computation will be registered in
one or several tax code.
</p>
@@ -1269,8 +1269,8 @@
Select the period and the journal you want to fill.
</p><p>
This view can be used by accountants in order to quickly record
entries in OpenERP. If you want to record a supplier invoice,
start by recording the line of the expense account. OpenERP
entries in Odoo. If you want to record a supplier invoice,
start by recording the line of the expense account. Odoo
will propose to you automatically the Tax related to this
account and the counterpart "Account Payable".
</p>
@@ -1506,7 +1506,7 @@
A journal entry consists of several journal items, each of
which is either a debit or a credit transaction.
</p><p>
OpenERP automatically creates one journal entry per accounting
Odoo automatically creates one journal entry per accounting
document: invoice, refund, supplier payment, bank statements,
etc. So, you should record journal entries manually only/mainly
for miscellaneous operations.
@@ -1925,7 +1925,7 @@
<field name="arch" type="xml">
<search string="Search Account Templates">
<field name="name" filter_domain="['|', ('name','ilike',self), ('code','ilike',self)]" string="Account Template"/>
<filter icon="terp-sale" string="Receivale Accounts" domain="[('type','=','receivable')]"/>
<filter icon="terp-sale" string="Receivable Accounts" domain="[('type','=','receivable')]"/>
<filter icon="terp-purchase" string="Payable Accounts" domain="[('type','=','payable')]"/>
<field name="parent_id"/>
<field name="user_type"/>
+1 -1
View File
@@ -381,7 +381,7 @@
<!--
Usually, cash payment methods requires a control at opening and closing.
Bot for demo data, it's better to avoid the control step so that people
that test OpenERP arrive directly in the touchscreen UI.
that test Odoo arrive directly in the touchscreen UI.
-->
<field name="cash_control" eval="False"/>
<field name="sequence_id" ref="sequence_cash_journal"/>
+1
View File
@@ -74,6 +74,7 @@
<xpath expr="//div[@name='buttons']" position="inside">
<button type="action"
class="oe_stat_button"
id="invoice_button"
icon="fa-pencil-square-o"
name="%(account.action_invoice_tree)d"
attrs="{'invisible': [('customer', '=', False)]}"
+1 -1
View File
@@ -18,7 +18,7 @@
<field name="property_account_income" domain="[('type','=','other')]" groups="account.group_account_user"
attrs="{'readonly': [('is_product_variant', '=', True)]}"/>
<field name="taxes_id" colspan="2" widget="many2many_tags"
attrs="{'readonly':[ '|', ('sale_ok','=',0), ('is_product_variant', '=', True)]}"/>
attrs="{'readonly':[('sale_ok','=',0)]}"/>
</group>
<group>
<field name="property_account_expense" domain="[('type','=','other')]" groups="account.group_account_user"
+1 -1
View File
@@ -28,7 +28,7 @@ class account_analytic_journal(osv.osv):
'name': fields.char('Journal Name', required=True),
'code': fields.char('Journal Code', size=8),
'active': fields.boolean('Active', help="If the active field is set to False, it will allow you to hide the analytic journal without removing it."),
'type': fields.selection([('sale','Sale'), ('purchase','Purchase'), ('cash','Cash'), ('general','General'), ('situation','Situation')], 'Type', required=True, help="Gives the type of the analytic journal. When it needs for a document (eg: an invoice) to create analytic entries, OpenERP will look for a matching journal of the same type."),
'type': fields.selection([('sale','Sale'), ('purchase','Purchase'), ('cash','Cash'), ('general','General'), ('situation','Situation')], 'Type', required=True, help="Gives the type of the analytic journal. When it needs for a document (eg: an invoice) to create analytic entries, Odoo will look for a matching journal of the same type."),
'line_ids': fields.one2many('account.analytic.line', 'journal_id', 'Lines'),
'company_id': fields.many2one('res.company', 'Company', required=True),
}
+1 -1
View File
@@ -114,7 +114,7 @@
term of costs/revenues reporting.
</p><p>
They are usually structured by contracts, projects, products or
departements. Most of the OpenERP operations (invoices,
departements. Most of the Odoo operations (invoices,
timesheets, expenses, etc) generate analytic entries on the
related account.
</p>
@@ -20,9 +20,7 @@
<filter string="Product" icon="terp-accessories-archiver" context="{'group_by':'product_id'}"/>
<filter string="Product Unit of Measure" icon="terp-mrp" context="{'group_by':'product_uom_id'}"/>
<filter string="Company" icon="terp-go-home" context="{'group_by':'company_id'}" groups="base.group_multi_company"/>
<filter string="Date (day)" icon="terp-go-today" context="{'group_by':'date:day'}"/>
<filter string="Date (month)" name="Month" icon="terp-go-month" context="{'group_by':'date:month'}"/>
<filter string="Date (year)" icon="terp-go-year" context="{'group_by':'date:year'}"/>
<filter string="Date" name="Month" icon="terp-go-month" context="{'group_by':'date:month'}"/>
</group>
</search>
</field>
@@ -37,14 +37,8 @@ class account_entries_report(osv.osv):
'debit': fields.float('Debit', readonly=True),
'credit': fields.float('Credit', readonly=True),
'balance': fields.float('Balance', readonly=True),
'day': fields.char('Day', size=128, readonly=True),
'year': fields.char('Year', size=4, readonly=True),
'date': fields.date('Date', size=128, readonly=True),
'currency_id': fields.many2one('res.currency', 'Currency', readonly=True),
'amount_currency': fields.float('Amount Currency', digits_compute=dp.get_precision('Account'), readonly=True),
'month':fields.selection([('01','January'), ('02','February'), ('03','March'), ('04','April'),
('05','May'), ('06','June'), ('07','July'), ('08','August'), ('09','September'),
('10','October'), ('11','November'), ('12','December')], 'Month', readonly=True),
'period_id': fields.many2one('account.period', 'Period', readonly=True),
'account_id': fields.many2one('account.account', 'Account', readonly=True),
'journal_id': fields.many2one('account.journal', 'Journal', readonly=True),
@@ -53,7 +47,7 @@ class account_entries_report(osv.osv):
'product_uom_id': fields.many2one('product.uom', 'Product Unit of Measure', readonly=True),
'move_state': fields.selection([('draft','Unposted'), ('posted','Posted')], 'Status', readonly=True),
'move_line_state': fields.selection([('draft','Unbalanced'), ('valid','Valid')], 'State of Move Line', readonly=True),
'reconcile_id': fields.many2one('account.move.reconcile', readonly=True),
'reconcile_id': fields.many2one('account.move.reconcile', 'Reconciliation number', readonly=True),
'partner_id': fields.many2one('res.partner','Partner', readonly=True),
'analytic_account_id': fields.many2one('account.analytic.account', 'Analytic Account', readonly=True),
'quantity': fields.float('Products Quantity', digits=(16,2), readonly=True),
@@ -67,7 +61,7 @@ class account_entries_report(osv.osv):
('other', 'Regular'),
('closed', 'Closed'),
], 'Internal Type', readonly=True, help="This type is used to differentiate types with "\
"special effects in OpenERP: view can not have entries, consolidation are accounts that "\
"special effects in Odoo: view can not have entries, consolidation are accounts that "\
"can have children accounts for multi-company consolidations, payable/receivable are for "\
"partners accounts (for debit/credit computations), closed for depreciated accounts."),
'company_id': fields.many2one('res.company', 'Company', readonly=True),
@@ -123,9 +117,6 @@ class account_entries_report(osv.osv):
am.state as move_state,
l.state as move_line_state,
l.reconcile_id as reconcile_id,
to_char(am.date, 'YYYY') as year,
to_char(am.date, 'MM') as month,
to_char(am.date, 'YYYY-MM-DD') as day,
l.partner_id as partner_id,
l.product_id as product_id,
l.product_uom_id as product_uom_id,
@@ -18,9 +18,6 @@
<field name="credit"/>
<field name="balance"/>
<field name="move_state" invisible="1"/>
<field name="day" invisible="1"/>
<field name="month" invisible="1"/>
<field name="year" invisible="1"/>
<field name="partner_id" invisible="1"/>
<field name="product_id" invisible="1"/>
<field name="product_uom_id" invisible="1"/>
@@ -86,9 +86,7 @@
<filter string="Journal" icon="terp-folder-orange" context="{'group_by':'journal_id'}"/>
<filter string="Account" icon="terp-folder-orange" context="{'group_by':'account_line_id'}"/>
<filter string="Company" icon="terp-go-home" context="{'group_by':'company_id'}" groups="base.group_multi_company"/>
<filter string="Invoice Date (day)" name="day" icon="terp-go-today" context="{'group_by':'date:day'}" help="Group by Invoice Date"/>
<filter string="Invoice Date (month)" name="month" icon="terp-go-month" context="{'group_by':'date:month'}" help="Group by month of Invoice Date"/>
<filter string="Invoice Date (year)" name="group_year" icon="terp-go-year" context="{'group_by':'date:year'}" help="Group by year of Invoice Date"/>
<filter string="Invoice Date" name="month" icon="terp-go-month" context="{'group_by':'date'}" help="Group by month of Invoice Date"/>
</group>
</search>
</field>
+1 -1
View File
@@ -42,7 +42,7 @@ class account_config_settings(osv.osv_memory):
'currency_id': fields.related('company_id', 'currency_id', type='many2one', relation='res.currency', required=True,
string='Default company currency', help="Main currency of the company."),
'paypal_account': fields.related('company_id', 'paypal_account', type='char', size=128,
string='Paypal account', help="Paypal account (email) for receiving online payments (credit card, etc.) If you set a paypal account, the customer will be able to pay your invoices or quotations with a button \"Pay with Paypal\" in automated emails or through the OpenERP portal."),
string='Paypal account', help="Paypal account (email) for receiving online payments (credit card, etc.) If you set a paypal account, the customer will be able to pay your invoices or quotations with a button \"Pay with Paypal\" in automated emails or through the Odoo portal."),
'company_footer': fields.related('company_id', 'rml_footer', type='text', readonly=True,
string='Bank accounts footer preview', help="Bank accounts as printed in the footer of each printed document"),
+1 -1
View File
@@ -243,7 +243,7 @@
</div>
<div name='payment_acquirer'>
<label for="paypal_account"/>
<field name="paypal_account" placeholder="e.g. sales@openerp.com" class="oe_inline"/>
<field name="paypal_account" placeholder="e.g. sales@odoo.com" class="oe_inline"/>
</div>
</div>
</group>
+6 -6
View File
@@ -12,7 +12,7 @@
</div>
<div class="oe_span6">
<p class='oe_mt32'>
By far the most beautiful and full featured accounting software. OpenERP Accounting allows a better way to collaborate with your accountants, your customers and control your suppliers.</p>
By far the most beautiful and full featured accounting software. Odoo Accounting allows a better way to collaborate with your accountants, your customers and control your suppliers.</p>
<p>
Activate features on demand, from integrated analytic accounting to budget, assets and multiple companies consolidation.
</p>
@@ -29,7 +29,7 @@ Activate features on demand, from integrated analytic accounting to budget, asse
<div class="oe_span6">
<p class='oe_mt32'>
Record transactions in a few clicks and easily manage all financial activities
in one place. OpenERP's user interface is designed with productivity in mind.
in one place. Odoo's user interface is designed with productivity in mind.
</p>
</div>
<div class="oe_span6">
@@ -135,7 +135,7 @@ Integrate your analytic accounting operations with timesheets, projects, invoice
</div>
<div class="oe_span6">
<p class='oe_mt32'>
Manage your assets, track expenses, control budgets, multi-level analytic accounting; OpenERP has all the features you need to sustain all your business activities.
Manage your assets, track expenses, control budgets, multi-level analytic accounting; Odoo has all the features you need to sustain all your business activities.
</p>
</div>
</div>
@@ -148,7 +148,7 @@ Manage your assets, track expenses, control budgets, multi-level analytic accoun
<h3 class="oe_slogan">Used by very small to very large organizations</h3>
<div class="oe_span6">
<p class='oe_mt32'>
OpenERP supports multiple currencies, multiple users with different access rights, multiple companies with real time consolidation and unlimited analytic plans.
Odoo supports multiple currencies, multiple users with different access rights, multiple companies with real time consolidation and unlimited analytic plans.
</p>
</div>
<div class="oe_span6">
@@ -166,7 +166,7 @@ OpenERP supports multiple currencies, multiple users with different access right
<div class="oe_span6">
<div class="oe_quote">
<q>
OpenERP Accounting is a great way to record all business transactions
Odoo Accounting is a great way to record all business transactions
right when they happen. Awesome and cost-effective!
</q>
<cite class="oe_cite oe_clearfix oe_ml64">
@@ -178,7 +178,7 @@ OpenERP supports multiple currencies, multiple users with different access right
<div class="oe_span6">
<div class="oe_quote">
<q>
We have found accounting module of OpenERP to be user
We have found accounting module of Odoo to be user
friendly and highly customizable. It proved to be an accounting gem.
</q>
<cite class="oe_cite oe_clearfix">
@@ -139,7 +139,7 @@ openerp.account = function (instance) {
}
// Retreive statement infos and reconciliation data from the model
var lines_filter = [['journal_entry_id', '=', false]];
var lines_filter = [['journal_entry_id', '=', false], ['account_id', '=', false]];
var deferred_promises = [];
if (self.statement_id) {
@@ -8,7 +8,7 @@
<field name="arch" type="xml">
<form string="Reconciliation">
<separator string="Reconciliation"/>
<label string="For an invoice to be considered as paid, the invoice entries must be reconciled with counterparts, usually payments. With the automatic reconciliation functionality, OpenERP makes its own search for entries to reconcile in a series of accounts. It finds entries for each partner where the amounts correspond."/>
<label string="For an invoice to be considered as paid, the invoice entries must be reconciled with counterparts, usually payments. With the automatic reconciliation functionality, Odoo makes its own search for entries to reconcile in a series of accounts. It finds entries for each partner where the amounts correspond."/>
<field name="account_ids" domain="[('reconcile','=',1)]"/>
<group col="4">
<field name="power"/>
@@ -9,7 +9,7 @@
<field name="arch" type="xml">
<form string="Report Options">
<separator string="Aged Partner Balance"/>
<label string="Aged Partner Balance is a more detailed report of your receivables by intervals. When opening that report, OpenERP asks for the name of the company, the fiscal period and the size of the interval to be analyzed (in days). OpenERP then calculates a table of credit balance by period. So if you request an interval of 30 days OpenERP generates an analysis of creditors for the past month, past two months, and so on. "/>
<label string="Aged Partner Balance is a more detailed report of your receivables by intervals. When opening that report, Odoo asks for the name of the company, the fiscal period and the size of the interval to be analyzed (in days). Odoo then calculates a table of credit balance by period. So if you request an interval of 30 days Odoo generates an analysis of creditors for the past month, past two months, and so on. "/>
<group col="4">
<field name="chart_account_id" widget='selection' on_change="onchange_chart_id(chart_account_id, context)"/>
<field name="fiscalyear_id" invisible="1"/>
+1 -1
View File
@@ -7,7 +7,7 @@
<field name="model">account.vat.declaration</field>
<field name="arch" type="xml">
<form string="Taxes Report">
<label colspan="4" string="This menu prints a tax declaration based on invoices or payments. Select one or several periods of the fiscal year. The information required for a tax declaration is automatically generated by OpenERP from invoices (or payments, in some countries). This data is updated in real time. That’s very useful because it enables you to preview at any time the tax that you owe at the start and end of the month or quarter."/>
<label colspan="4" string="This menu prints a tax declaration based on invoices or payments. Select one or several periods of the fiscal year. The information required for a tax declaration is automatically generated by Odoo from invoices (or payments, in some countries). This data is updated in real time. That’s very useful because it enables you to preview at any time the tax that you owe at the start and end of the month or quarter."/>
<group string="Taxes Report" col="4">
<field name="chart_tax_id" widget='selection'/>
<field name="fiscalyear_id"/>
@@ -28,8 +28,8 @@
<field name="type">notification</field>
<field name="subtype_id" ref="mail.mt_comment"/>
<field name="subject">Accounting and Finance application installed!</field>
<field name="body"><![CDATA[<p>With OpenERP's accounting, you get instant access to your financial data, and can setup analytic accounting, forecast taxes, control budgets, easily create and send invoices, record bank statements, etc.</p>
<p>The accounting features are fully integrated with other OpenERP applications to automate all your processes: creation of customer invoices, control of supplier invoices, point-of-sale integration, automated follow-ups, etc.</p>]]></field>
<field name="body"><![CDATA[<p>With Odoo's accounting, you get instant access to your financial data, and can setup analytic accounting, forecast taxes, control budgets, easily create and send invoices, record bank statements, etc.</p>
<p>The accounting features are fully integrated with other Odoo applications to automate all your processes: creation of customer invoices, control of supplier invoices, point-of-sale integration, automated follow-ups, etc.</p>]]></field>
</record>
</data>
</openerp>
@@ -67,7 +67,7 @@ Hello ${object.name},
<pre>
--
OpenERP Automatic Email
Odoo Automatic Email
</pre>
]]></field>
@@ -131,7 +131,7 @@
</table>
<group name='invoice_on_timesheets'>
<p name='invoice_on_timesheets_label' class="oe_grey oe_edit_only" colspan="2" attrs="{'invisible': [('invoice_on_timesheets','=',False)]}">
When reinvoicing costs, OpenERP uses the
When reinvoicing costs, Odoo uses the
pricelist of the contract which uses the price
defined on the product related (e.g timesheet
products are defined on each employee).
@@ -264,7 +264,7 @@
Click to create a new contract.
</p><p>
Use contracts to follow tasks, issues, timesheets or invoicing based on
work done, expenses and/or sales orders. OpenERP will automatically manage
work done, expenses and/or sales orders. Odoo will automatically manage
the alerts for the renewal of the contracts to the right salesperson.
</p>
</field>
@@ -310,7 +310,7 @@
end date is passed or the working effort is higher than the
maximum authorized one.
</p><p>
OpenERP automatically sets contracts to be renewed in a pending
Odoo automatically sets contracts to be renewed in a pending
state. After the negociation, the salesman should close or renew
pending contracts.
</p>
@@ -130,4 +130,27 @@ class product_product(osv.Model):
'rules_count': fields.function(_rules_count, string='# Analytic Rules', type='integer'),
}
class product_template(osv.Model):
_inherit = 'product.template'
def _rules_count(self, cr, uid, ids, field_name, arg, context=None):
Analytic = self.pool['account.analytic.default']
res = {}
for product_tmpl_id in self.browse(cr, uid, ids, context=context):
res[product_tmpl_id.id] = sum([p.rules_count for p in product_tmpl_id.product_variant_ids])
return res
_columns = {
'rules_count': fields.function(_rules_count, string='# Analytic Rules', type='integer'),
}
def action_view_rules(self, cr, uid, ids, context=None):
products = self._get_products(cr, uid, ids, context=context)
result = self._get_act_window_dict(cr, uid, 'account_analytic_default.action_product_default_list', context=context)
result['domain'] = "[('product_id','in',[" + ','.join(map(str, products)) + "])]"
# Remove context so it is not going to filter on product_id with active_id of template
result['context'] = "{}"
return result
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
@@ -87,6 +87,20 @@
</xpath>
</field>
</record>
<record model="ir.ui.view" id="product_template_view_default_analytic_button">
<field name="name">product.template.stock.move</field>
<field name="model">product.template</field>
<field name="inherit_id" ref="product.product_template_only_form_view"/>
<field name="arch" type="xml">
<xpath expr="//div[@name='buttons']" position="inside">
<button class="oe_inline oe_stat_button" name= "action_view_rules" type="object"
groups="analytic.group_analytic_accounting" icon="fa-xing">
<field string="Analytic Rules" name="rules_count" widget="statinfo" />
</button>
</xpath>
</field>
</record>
<act_window
name="Entries"
@@ -124,7 +124,7 @@
-
!workflow {model: purchase.order, ref: purchase_order_001, action: purchase_confirm}
-
Reception is ready for process so now done the reception.
Receipt is ready for process so now we do it.
-
!python {model: stock.picking}: |
picking_id = self.pool.get('purchase.order').browse(cr, uid, ref("purchase_order_001"), context=context).picking_ids[0]
@@ -132,7 +132,7 @@
-
!workflow {model: purchase.order, ref: purchase_order_001_fifo, action: purchase_confirm}
-
Reception is ready for process so now done the reception.
Receipt is ready for process so now we do it.
-
!python {model: stock.picking}: |
picking_id = self.pool.get('purchase.order').browse(cr, uid, ref("purchase_order_001_fifo"), context=context).picking_ids[0]
@@ -39,7 +39,7 @@
</p><p>
The check payment form allows you to track the payment you do
to your suppliers using checks. When you select a supplier, the
payment method and an amount for the payment, OpenERP will
payment method and an amount for the payment, Odoo will
propose to reconcile your payment with the open supplier
invoices or bills.
</p>
@@ -31,7 +31,7 @@ class account_sequence_installer(osv.osv_memory):
'suffix': fields.char('Suffix', size=64, help="Suffix value of the record for the sequence"),
'number_next': fields.integer('Next Number', required=True, help="Next number of this sequence"),
'number_increment': fields.integer('Increment Number', required=True, help="The next number of the sequence will be incremented by this number"),
'padding' : fields.integer('Number padding', required=True, help="OpenERP will automatically adds some '0' on the left of the 'Next Number' to get the required padding size."),
'padding' : fields.integer('Number padding', required=True, help="Odoo will automatically adds some '0' on the left of the 'Next Number' to get the required padding size."),
'company_id': fields.many2one('res.company', 'Company'),
}
_defaults = {
@@ -946,6 +946,8 @@ class account_voucher(osv.osv):
# refresh to make sure you don't unlink an already removed move
voucher.refresh()
for line in voucher.move_ids:
# refresh to make sure you don't unreconcile an already unreconciled entry
line.refresh()
if line.reconcile_id:
move_lines = [move_line.id for move_line in line.reconcile_id.line_id]
move_lines.remove(line.id)
@@ -9,7 +9,7 @@
<field name="type">notification</field>
<field name="subtype_id" ref="mail.mt_comment"/>
<field name="subject">eInvoicing &amp; Payments application installed!</field>
<field name="body"><![CDATA[<p>OpenERP's electronic invoicing accelerates the creation of invoices and collection of customer payments. Invoices are created in a few clicks and your customers receive them by email. They can pay online and/or import them in their own system.</p>
<field name="body"><![CDATA[<p>Odoo's electronic invoicing accelerates the creation of invoices and collection of customer payments. Invoices are created in a few clicks and your customers receive them by email. They can pay online and/or import them in their own system.</p>
<p>You can track customer payments easily and automate follow-ups. You get an overview of the discussion with your customers on each invoice for easier traceability. For advanced accounting features, you should install the "Accounting and Finance" module.</p>]]></field>
</record>
@@ -28,11 +28,6 @@ class sale_receipt_report(osv.osv):
_rec_name = 'date'
_columns = {
'date': fields.date('Date', readonly=True),
'year': fields.char('Year', size=4, readonly=True),
'day': fields.char('Day', size=128, readonly=True),
'month': fields.selection([('01','January'), ('02','February'), ('03','March'), ('04','April'),
('05','May'), ('06','June'), ('07','July'), ('08','August'), ('09','September'),
('10','October'), ('11','November'), ('12','December')], 'Month', readonly=True),
'currency_id': fields.many2one('res.currency', 'Currency', readonly=True),
'journal_id': fields.many2one('account.journal', 'Journal', readonly=True),
'partner_id': fields.many2one('res.partner', 'Partner', readonly=True),
@@ -69,9 +64,6 @@ class sale_receipt_report(osv.osv):
create or replace view sale_receipt_report as (
select min(avl.id) as id,
av.date as date,
to_char(av.date, 'YYYY') as year,
to_char(av.date, 'MM') as month,
to_char(av.date, 'YYYY-MM-DD') as day,
av.partner_id as partner_id,
aj.currency as currency_id,
av.journal_id as journal_id,
@@ -107,9 +99,6 @@ class sale_receipt_report(osv.osv):
group by
av.date,
av.id,
to_char(av.date, 'YYYY'),
to_char(av.date, 'MM'),
to_char(av.date, 'YYYY-MM-DD'),
av.partner_id,
aj.currency,
av.journal_id,
@@ -1,34 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<openerp>
<data>
<!-- <record id="view_sale_receipt_report_tree" model="ir.ui.view">
<field name="name">sale.receipt.report.tree</field>
<field name="model">sale.receipt.report</field>
<field name="arch" type="xml">
<tree colors="blue:state == 'draft';gray:state in ('cancel','paid');black:state in ('proforma','proforma2')" create="false" string="Sales Receipts Analysis">
<field name="date" invisible="1"/>
<field name="user_id" invisible="1"/>
<field name="year" invisible="1"/>
<field name="day" invisible="1"/>
<field name="month" invisible="1"/>
<field name="type" invisible="1"/>
<field name="company_id" invisible="1"/>
<field name="partner_id" invisible="1"/>
<field name="state" invisible="1"/>
<field name="currency_id" invisible="1"/>
<field name="journal_id" invisible="1"/>
<field name="date_due" invisible="1"/>
<field name="account_id" invisible="1"/>
<field name="nbr" sum="# of Voucher Lines"/>
<field name="price_total" sum="Total Without Tax"/>
<field name="price_total_tax" sum="Total With Tax"/>
<field name="due_delay" sum="Avg. Due Delay"/>
<field name="delay_to_pay" sum="Avg. Delay To Pay"/>
</tree>
</field>
</record>
-->
<record id="view_sale_receipt_report_graph" model="ir.ui.view">
<field name="name">sale.receipt.report.graph</field>
<field name="model">sale.receipt.report</field>
@@ -65,9 +38,7 @@
<filter string="Journal" icon="terp-folder-orange" context="{'group_by':'journal_id'}"/>
<filter string="Due Month" icon="terp-go-today" context="{'group_by':'date_due'}"/>
<filter string="Company" icon="terp-go-home" context="{'group_by':'company_id'}" groups="base.group_multi_company"/>
<filter string="Day" name="day" icon="terp-go-today" context="{'group_by':'day'}" help="Group by Invoice Date"/>
<filter string="Month" name="month" icon="terp-go-month" context="{'group_by':'month'}" help="Group by month of Invoice Date"/>
<filter string="Year" name="year" icon="terp-go-year" context="{'group_by':'year'}" help="Group by year of Invoice Date"/>
<filter string="Invoice Date" name="month" icon="terp-go-month" context="{'group_by':'date'}" help="Group by month of Invoice Date"/>
</group>
</search>
</field>
@@ -112,7 +112,7 @@ material. Define recurrencies to produce recurring invoice automatically.
<div class="oe_span6">
<div class="oe_quote">
<q>
OpenERP allowed us to automate sending 10.000 invoices per month.
Odoo allowed us to automate sending 10.000 invoices per month.
</q>
<cite class="oe_cite oe_clearfix">
<img class="oe_photo" src="bazile.png">
@@ -124,7 +124,7 @@ material. Define recurrencies to produce recurring invoice automatically.
<div class="oe_span6">
<div class="oe_quote">
<q>
We have found invoicing module of OpenERP to be user
We have found invoicing module of Odoo to be user
friendly and highly customizable.
</q>
<cite class="oe_cite oe_clearfix">
@@ -270,7 +270,7 @@
<p class="oe_view_nocontent_create">
Click to create a new supplier payment.
</p><p>
OpenERP helps you easily track payments you make and the remaining balances you need to pay your suppliers.
Odoo helps you easily track payments you make and the remaining balances you need to pay your suppliers.
</p>
</field>
</record>
@@ -554,7 +554,7 @@
Click to register a new payment.
</p><p>
Enter the customer and the payment method and then, either
create manually a payment record or OpenERP will propose to you
create manually a payment record or Odoo will propose to you
automatically the reconciliation of this payment with the open
invoices or sales receipts.
</p>
@@ -47,7 +47,7 @@
of the default values when invoicing the customer.
</p>
<p class="oe_grey oe_edit_only">
OpenERP will recursively search on parent accounts
Odoo will recursively search on parent accounts
to check if specific conditions are defined for a
specific user. This allows to set invoicing
conditions for a group of contracts.
+1 -1
View File
@@ -190,7 +190,7 @@ class CompanyLDAP(osv.osv):
if res[1]:
user_id = res[0]
elif conf['create_user']:
_logger.debug("Creating new OpenERP user \"%s\" from LDAP" % login)
_logger.debug("Creating new Odoo user \"%s\" from LDAP" % login)
user_obj = self.pool['res.users']
values = self.map_ldap_attributes(cr, uid, conf, login, ldap_entry)
if conf['user']:
+1 -1
View File
@@ -173,7 +173,7 @@ class OAuthController(http.Controller):
@http.route('/auth_oauth/oea', type='http', auth='none')
def oea(self, **kw):
"""login user via OpenERP Account provider"""
"""login user via Odoo Account provider"""
dbname = kw.pop('db', None)
if not dbname:
dbname = db_monodb()
+4 -4
View File
@@ -28,7 +28,7 @@
<field name="email_to">${object.email|safe}</field>
<field name="subject">Password reset</field>
<field name="body_html"><![CDATA[
<p>A password reset was requested for the OpenERP account linked to this email.</p>
<p>A password reset was requested for the Odoo account linked to this email.</p>
<p>You may change your password by following <a href="${object.signup_url}">this link</a>.</p>
@@ -37,18 +37,18 @@
<!-- Email template for new users -->
<record id="set_password_email" model="email.template">
<field name="name">OpenERP Enterprise Connection</field>
<field name="name">Odoo Enterprise Connection</field>
<field name="model_id" ref="base.model_res_users"/>
<field name="email_from"><![CDATA[${object.company_id.name} <${(object.company_id.email or user.email)|safe}>]]></field>
<field name="email_to">${object.email|safe}</field>
<field name="subject"><![CDATA[${object.company_id.name} invitation to connect on OpenERP]]></field>
<field name="subject"><![CDATA[${object.company_id.name} invitation to connect on Odoo]]></field>
<field name="body_html">
<![CDATA[
<p>
${object.name},
</p>
<p>
You have been invited to connect to "${object.company_id.name}" in order to get access to your documents in OpenERP.
You have been invited to connect to "${object.company_id.name}" in order to get access to your documents in Odoo.
</p>
<p>
To accept the invitation, click on the following link:
+2
View File
@@ -1,4 +1,5 @@
from openerp.osv import fields, osv
from openerp import api
AVAILABLE_STATES = [
('draft', 'New'),
@@ -25,6 +26,7 @@ class lead_test(osv.Model):
'active' : True,
}
@api.cr_uid_ids_context
def message_post(self, cr, uid, thread_id, body='', subject=None, type='notification', subtype=None, parent_id=False, attachments=None, context=None, **kwargs):
pass
@@ -18,17 +18,18 @@ class website_gengo(http.Controller):
@http.route('/website/gengo_callback', type='http', auth='none')
def gengo_callback(self, **post):
print "IN website/gengo_callback"
cr, uid, context = request.cr, openerp.SUPERUSER_ID, request.context
translation_pool = request.registry['ir.translation']
if post and post.get('job') and post.get('pgk'):
if post.get('pgk') != self.get_gengo_key(cr):
return Response("Bad authentication - 403/412", status=412)
return Response("Bad authentication", status=104)
job = json.loads(post['job'], 'utf-8')
tid = job.get('custom_data', False)
if (job.get('status') == 'approved') and tid:
term = translation_pool.browse(cr, uid, int(tid), context=context)
if term.src != job.get('body_src'):
return Response("Text Altered - Not saved", status=100)
return Response("Text Altered - Not saved", status=418)
domain = [
'|',
('id', "=", int(tid)),
@@ -49,5 +50,5 @@ class website_gengo(http.Controller):
translation_pool.write(cr, uid, all_ir_tanslations, vals, context=context)
return Response("OK", status=200)
else:
return Response("No terms found", status=104)
return Response("Not saved", status=100)
return Response("No terms found", status=412)
return Response("Not saved", status=418)
@@ -8,7 +8,7 @@
<field name="interval_number">6</field>
<field name="interval_type">hours</field>
<field name="numbercall">-1</field>
<field name="doall">0</field>
<field name="doall" eval="False" />
<field eval="'base.gengo.translations'" name="model"></field>
<field eval="'_sync_response'" name="function"/>
<field eval="'(20,)'" name="args"/>
@@ -21,7 +21,7 @@
<field name="interval_number">6</field>
<field name="interval_type">hours</field>
<field name="numbercall">-1</field>
<field name="doall">0</field>
<field name="doall" eval="False"/>
<field eval="'base.gengo.translations'" name="model"></field>
<field eval="'_sync_request'" name="function"/>
<field eval="'(20,)'" name="args"/>
@@ -119,7 +119,7 @@ class base_gengo_translations(osv.osv_memory):
"""
This method will be called by cron services to get translations from
Gengo. It will read translated terms and comments from Gengo and will
update respective ir.translation in openerp.
update respective ir.translation in Odoo.
"""
translation_pool = self.pool.get('ir.translation')
flag, gengo = self.gengo_authentication(cr, uid, context=context)
@@ -245,7 +245,7 @@ class base_gengo_translations(osv.osv_memory):
A special key 'gengo_language' can be passed in the context in order to
request only translations of that language only. Its value is the language
ID in openerp.
ID in Odoo.
"""
if context is None:
context = {}
+1 -1
View File
@@ -48,7 +48,7 @@ class ir_import(orm.TransientModel):
.. attribute:: name (str)
The field's logical (OpenERP) name within the scope of
The field's logical (Odoo) name within the scope of
its parent.
.. attribute:: string (str)
+15 -15
View File
@@ -52,7 +52,7 @@
</div>
<div class="oe_import_with_file oe_padding">
<h2>Map your data to OpenERP</h2>
<h2>Map your data to Odoo</h2>
<div title="If the model uses openchatter, history tracking
will set up subscriptions and send notifications
during the import, but lead to a slower import.">
@@ -67,7 +67,7 @@
<label for="oe_import_has_header">The first row of the
file contains the label of the column</label>
<p class="oe_import_noheaders">If the file contains
the column names, OpenERP can try auto-detecting the
the column names, Odoo can try auto-detecting the
field corresponding to the column. This makes imports
simpler especially when the file has many columns.</p>
@@ -85,7 +85,7 @@
different records, you should use the unique
identifier from the original application and
map it to the <abbr title="External ID">ID</abbr>
column in OpenERP. When you
column in Odoo. When you
import an other record that links to the first
one, use <abbr title="XXX/External ID">XXX/ID</abbr>
to the original unique identifier.</p>
@@ -108,7 +108,7 @@
settings, you can modify the File Format Options
(displayed under the Browse CSV file bar after you
select your file).</p> <p>Note that if your CSV file
has a tabulation as separator, OpenERP will not
has a tabulation as separator, Odoo will not
detect the separations. You will need to change the
file format options in your spreadsheet application.
See the following question.</p>
@@ -141,15 +141,15 @@
<p>Some fields define a relationship with another
object. For example, the country of a contact is a
link to a record of the 'Country' object. When you
want to import such fields, OpenERP will have to
want to import such fields, Odoo will have to
recreate links between the different records.
To help you import such fields, OpenERP provides 3
To help you import such fields, Odoo provides 3
mechanisms. You must use one and only one mechanism
per field you want to import.</p> <p>For example, to
reference the country of a contact, OpenERP proposes
reference the country of a contact, Odoo proposes
you 3 different fields to import: <ul>
<li>Country: the name or code of the country</li>
<li>Country/Database ID: the unique OpenERP ID for a
<li>Country/Database ID: the unique Odoo ID for a
record, defined by the ID postgresql column</li>
<li>Country/External ID: the ID of this record
referenced in another application (or the .XML file
@@ -254,10 +254,10 @@
have already been imported will be modified instead of
being created. This is very usefull as it allows you
to import several times the same CSV file while having
made some changes in between two imports. OpenERP will
made some changes in between two imports. Odoo will
take care of creating or modifying each record
depending if it's new or not.</p> <p> This feature
allows you to use the Import/Export tool of OpenERP to
allows you to use the Import/Export tool of Odoo to
modify a batch of records in your favorite spreadsheet
application.</p>
</dd>
@@ -269,9 +269,9 @@
specific field?</a></dt>
<dd>
<p>If you do not set all fields in your CSV file,
OpenERP will assign the default value for every non
Odoo will assign the default value for every non
defined fields. But if you
set fields with empty values in your CSV file, OpenERP
set fields with empty values in your CSV file, Odoo
will set the EMPTY value in the field, instead of
assigning the default value.</p>
</dd>
@@ -280,7 +280,7 @@
<dl>
<dt><a href="#" class="oe_import_toggle">
How to export/import different tables from an SQL
application to OpenERP?</a></dt>
application to Odoo?</a></dt>
<dd>
<p>If you need to import data from different tables,
you will have to recreate relations between records
@@ -288,7 +288,7 @@
companies and persons, you will have to recreate the
link between each person and the company they work
for).</p> <p>To manage relations between tables,
you can use the "External ID" facilities of OpenERP.
you can use the "External ID" facilities of Odoo.
The "External ID" of a record is the unique identifier
of this record in another application. This "External
ID" must be unique accoss all the records of all
@@ -337,7 +337,7 @@
and company_1 who shared the same ID 1 in the orignial
database).</p>
<p>The two files produced are ready to be imported in
OpenERP without any modifications. After having
Odoo without any modifications. After having
imported these two CSV files, you will have 4 contacts
and 3 companies. (the firsts two contacts are linked
to the first company). You must first import the
+3 -13
View File
@@ -11,18 +11,10 @@ ID_FIELD = {
'required': False,
'fields': [],
}
DISPLAY_NAME_FIELD = {
'id': 'display_name',
'name': 'display_name',
'string': "Name",
'required': False,
'fields': [],
}
def make_field(name='value', string='unknown', required=False, fields=[]):
return [
ID_FIELD,
DISPLAY_NAME_FIELD,
{'id': name, 'name': name, 'string': string, 'required': required, 'fields': fields},
]
@@ -50,7 +42,7 @@ class test_basic_fields(BaseImportCase):
def test_readonly(self):
""" Readonly fields should be filtered out"""
self.assertEqualFields(self.get_fields('char.readonly'), [ID_FIELD, DISPLAY_NAME_FIELD])
self.assertEqualFields(self.get_fields('char.readonly'), [ID_FIELD])
def test_readonly_states(self):
""" Readonly fields with states should not be filtered out"""
@@ -59,12 +51,12 @@ class test_basic_fields(BaseImportCase):
def test_readonly_states_noreadonly(self):
""" Readonly fields with states having nothing to do with
readonly should still be filtered out"""
self.assertEqualFields(self.get_fields('char.noreadonly'), [ID_FIELD, DISPLAY_NAME_FIELD])
self.assertEqualFields(self.get_fields('char.noreadonly'), [ID_FIELD])
def test_readonly_states_stillreadonly(self):
""" Readonly fields with readonly states leaving them readonly
always... filtered out"""
self.assertEqualFields(self.get_fields('char.stillreadonly'), [ID_FIELD, DISPLAY_NAME_FIELD])
self.assertEqualFields(self.get_fields('char.stillreadonly'), [ID_FIELD])
def test_m2o(self):
""" M2O fields should allow import of themselves (name_get),
@@ -92,7 +84,6 @@ class test_o2m(BaseImportCase):
def test_shallow(self):
self.assertEqualFields(self.get_fields('o2m'), make_field(fields=[
ID_FIELD,
DISPLAY_NAME_FIELD,
# FIXME: should reverse field be ignored?
{'id': 'parent_id', 'name': 'parent_id', 'string': 'unknown', 'required': False, 'fields': [
{'id': 'parent_id', 'name': 'id', 'string': 'External ID', 'required': False, 'fields': []},
@@ -250,7 +241,6 @@ class test_preview(TransactionCase):
# Order depends on iteration order of fields_get
self.assertItemsEqual(result['fields'], [
ID_FIELD,
DISPLAY_NAME_FIELD,
{'id': 'name', 'name': 'name', 'string': 'Name', 'required':False, 'fields': []},
{'id': 'somevalue', 'name': 'somevalue', 'string': 'Some Value', 'required':True, 'fields': []},
{'id': 'othervalue', 'name': 'othervalue', 'string': 'Other Variable', 'required':False, 'fields': []},
@@ -2,16 +2,16 @@
<openerp>
<data>
<record id="view_report_designer_installer" model="ir.ui.view">
<field name="name">Form View: OpenERP Report Designer Installation</field>
<field name="name">Form View: Odoo Report Designer Installation</field>
<field name="model">base_report_designer.installer</field>
<field name="inherit_id" ref="base.res_config_installer"/>
<field name="arch" type="xml">
<data>
<form position="attributes">
<attribute name="string">OpenERP Report Designer Configuration</attribute>
<attribute name="string">Odoo Report Designer Configuration</attribute>
</form>
<separator string="title" position="before">
<label string="This plug-in allows you to create/modify OpenERP Reports into OpenOffice Writer."/>
<label string="This plug-in allows you to create/modify Odoo Reports into OpenOffice Writer."/>
</separator>
<xpath expr="//button[@string='Install Modules']" position="replace">
<button name="action_next" type="object" string="Configure" invisible="context.get('menu',False)" class="oe_highlight"/>
@@ -30,13 +30,13 @@
</group>
</xpath>
<separator string="title" position="attributes">
<attribute name="string">OpenERP Report Designer</attribute>
<attribute name="string">Odoo Report Designer</attribute>
</separator>
</data>
</field>
</record>
<record id="action_report_designer_installer" model="ir.actions.act_window">
<field name="name">OpenERP Report Designer Installation</field>
<field name="name">Odoo Report Designer Installation</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">base_report_designer.installer</field>
<field name="view_id" ref="view_report_designer_installer"/>
@@ -50,7 +50,7 @@
<field name="type">automatic</field>
</record>
<record id="action_report_designer_wizard" model="ir.actions.act_window">
<field name="name">OpenERP Report Designer</field>
<field name="name">Odoo Report Designer</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">base_report_designer.installer</field>
<field name="view_id" ref="view_report_designer_installer"/>
@@ -337,7 +337,7 @@ def sxw2rml(sxw_file, xsl, output='.', save_pict=False):
if __name__ == "__main__":
import optparse
parser = optparse.OptionParser(
version="OpenERP Report v%s" % __version__,
version="Odoo Report v%s" % __version__,
usage = 'openerp_sxw2rml.py [options] file.sxw')
parser.add_option("-v", "--verbose", default=False, dest="verbose", help="enable basic debugging")
parser.add_option("-o", "--output", dest="output", default='.', help="directory of image output")
@@ -32,7 +32,7 @@ class About(unohelper.Base, XJobExecutor):
self.ctx = ctx
self.module = "openerp_report"
self.version = "0.1"
self.win = DBModalDialog(60, 50, 175, 115, "About OpenERP Report Designer")
self.win = DBModalDialog(60, 50, 175, 115, "About Odoo Report Designer")
fdBigFont = createUnoStruct("com.sun.star.awt.FontDescriptor")
fdBigFont.Width = 20
@@ -61,7 +61,7 @@ class About(unohelper.Base, XJobExecutor):
oLabelProdDesc.Model.Align = 1
oLabelProdDesc.Model.FontRelief = 1
oLabelProdDesc.Model.MultiLine = True
oLabelProdDesc.Text = "This package helps you to create or modify\nreports in OpenERP. Once connected to the\nserver, you can design your template of reports\nusing fields and expressions and browsing the\ncomplete structure of OpenERP object database."
oLabelProdDesc.Text = "This package helps you to create or modify\nreports in Odoo. Once connected to the\nserver, you can design your template of reports\nusing fields and expressions and browsing the\ncomplete structure of Odoo object database."
oLabelFooter = self.win.addFixedText("lblFooter", -1, -1, 173, 25)
oLabelFooter.Model.TextColor = 255
@@ -75,7 +75,7 @@ class About(unohelper.Base, XJobExecutor):
oLabelFooter.Model.Align = 1
oLabelFooter.Model.FontRelief = 1
oLabelFooter.Model.MultiLine = True
sMessage = "OpenERP Report Designer v1.0 \nCopyright 2007-TODAY Tiny sprl \nThis product is free software, under the GNU Affero General Public License."
sMessage = "Odoo Report Designer v1.0 \nCopyright 2007-TODAY Tiny sprl \nThis product is free software, under the GNU Affero General Public License."
oLabelFooter.Text = sMessage
self.win.doModalDialog("",None)
@@ -63,7 +63,7 @@ class Change( unohelper.Base, XJobExecutor ):
break
else:
protocol='XML-RPC'
self.win=DBModalDialog(60, 50, 120, 90, "Connect to Open ERP Server")
self.win=DBModalDialog(60, 50, 120, 90, "Connect to Odoo Server")
self.win.addFixedText("lblVariable", 38, 12, 25, 15, "Server ")
self.win.addEdit("txtHost",-2,9,60,15, host or 'localhost')
@@ -67,7 +67,7 @@ class ExportToRML( unohelper.Base, XJobExecutor ):
data = read_data_from_file( get_absolute_file_path( doc.getURL()[7:] ) )
file_type = doc.getURL()[7:].split(".")[-1]
if docinfo.getUserFieldValue(2) == "":
ErrorDialog("Please Save this file on server","Use Send To Server Option in OpenERP Report Menu","Error")
ErrorDialog("Please Save this file on server","Use Send To Server Option in Odoo Report Menu","Error")
exit(1)
filename = self.GetAFileName()
if not filename:
@@ -89,7 +89,7 @@ class ExportToRML( unohelper.Base, XJobExecutor ):
sFilePickerArgs = Array(10)
oFileDialog = createUnoService("com.sun.star.ui.dialogs.FilePicker")
oFileDialog.initialize(sFilePickerArgs)
oFileDialog.appendFilter("OpenERP Report File Save To ....","*.rml")
oFileDialog.appendFilter("Odoo Report File Save To ....","*.rml")
f_path = "OpenERP-"+ os.path.basename( tempfile.mktemp("","") ) + ".rml"
initPath = tempfile.gettempdir()
@@ -178,7 +178,7 @@ class RepeatIn( unohelper.Base, XJobExecutor ):
self.win.doModalDialog("lstFields",self.sValue)
else:
ErrorDialog("Please Select Appropriate module" ,"Create new report from: \nOpenERP -> Open a New Report")
ErrorDialog("Please Select Appropriate module" ,"Create new report from: \nOdoo -> Open a New Report")
self.win.endExecute()
def lstbox_selected(self, oItemEvent):
@@ -90,7 +90,7 @@ class SendtoServer(unohelper.Base, XJobExecutor):
report_name = docinfo.getUserFieldValue(3) + "." + result
else:
ErrorDialog("Please select appropriate module...","Note: use OpenERP Report -> Open a new Report", "Module selection ERROR");
ErrorDialog("Please select appropriate module...","Note: use Odoo Report -> Open a new Report", "Module selection ERROR");
exit(1)
self.win = DBModalDialog(60, 50, 180, 100, "Send To Server")
@@ -229,8 +229,8 @@ def GetAFileName():
oUcb=None
oFileDialog = createUnoService("com.sun.star.ui.dialogs.FilePicker")
oUcb = createUnoService("com.sun.star.ucb.SimpleFileAccess")
oFileDialog.appendFilter("OpenERP Report File","*.sxw")
oFileDialog.setCurrentFilter("OpenERP Report File")
oFileDialog.appendFilter("Odoo Report File","*.sxw")
oFileDialog.setCurrentFilter("Odoo Report File")
if InitPath == "":
InitPath =tempfile.gettempdir()
#End If
@@ -42,7 +42,7 @@
<newline/>
<field name="file_sxw_upload"/>
<newline/>
<label colspan="4" string="This is the template of your requested report.&#10;Save it as a .SXW file and open it with OpenOffice.&#10;Don't forget to install the OpenERP SA OpenOffice package to modify it.&#10;Once it is modified, re-upload it in OpenERP using this wizard." align="0.0"/>
<label colspan="4" string="This is the template of your requested report.&#10;Save it as a .SXW file and open it with OpenOffice.&#10;Don't forget to install the Odoo SA OpenOffice package to modify it.&#10;Once it is modified, re-upload it in Odoo using this wizard." align="0.0"/>
</group>
</form>
</field>
+3 -6
View File
@@ -160,10 +160,10 @@
<field name="module_crm" invisible="1"/>
<separator string="Emails Integration" attrs="{'invisible': [('module_crm','=',False)]}"/>
<p name="config_email_integration" attrs="{'invisible': [('module_crm','=',False)]}">
OpenERP allows to automatically create leads (or others documents)
from incoming emails. You can automatically synchronize emails with OpenERP
Odoo allows to automatically create leads (or others documents)
from incoming emails. You can automatically synchronize emails with Odoo
using regular POP/IMAP accounts, using a direct email integration script for your
email server, or by manually pushing emails to OpenERP using specific
email server, or by manually pushing emails to Odoo using specific
plugins for your preferred email application.
</p>
</div>
@@ -180,8 +180,5 @@
<field name="view_mode">form</field>
<field name="target">inline</field>
</record>
</data>
</openerp>
+39 -3
View File
@@ -63,6 +63,7 @@ _ref_vat = {
'mx': 'MXABC123456T1B',
'nl': 'NL123456782B90',
'no': 'NO123456785',
'pe': 'PER10254824220 or PED10254824220',
'pl': 'PL1234567883',
'pt': 'PT123456789',
'ro': 'RO1234567897',
@@ -144,10 +145,11 @@ class res_partner(osv.osv):
return cn[0] in string.ascii_lowercase and cn[1] in string.ascii_lowercase
vat_country, vat_number = self._split_vat(self.browse(cr, uid, ids)[0].vat)
vat_no = "'CC##' (CC=Country Code, ##=VAT Number)"
error_partner = self.browse(cr, uid, ids, context=context)
if default_vat_check(vat_country, vat_number):
vat_no = _ref_vat[vat_country] if vat_country in _ref_vat else vat_no
#Retrieve the current partner for wich the VAT is not valid
error_partner = self.browse(cr, uid, ids, context=context)
if self.pool['res.users'].browse(cr, uid, uid).company_id.vat_check_vies:
return '\n' + _('The VAT number [%s] for partner [%s] either failed the VIES VAT validation check or did not respect the expected format %s.') % (error_partner[0].vat, error_partner[0].name, vat_no)
return '\n' + _('The VAT number [%s] for partner [%s] does not seem to be valid. \nNote: the expected format is %s') % (error_partner[0].vat, error_partner[0].name, vat_no)
_constraints = [(check_vat, _construct_constraint_msg, ["vat"])]
@@ -218,7 +220,7 @@ class res_partner(osv.osv):
return vat[7] == self._ie_check_char(vat[2:7] + vat[0] + vat[8])
return False
# Mexican VAT verification, contributed by <moylop260@hotmail.com>
# Mexican VAT verification, contributed by Vauxoo
# and Panos Christeas <p_christ@hol.gr>
__check_vat_mx_re = re.compile(r"(?P<primeras>[A-Za-z\xd1\xf1&]{3,4})" \
r"[ \-_]?" \
@@ -275,5 +277,39 @@ class res_partner(osv.osv):
return False
return check == int(vat[8])
# Peruvian VAT validation, contributed by Vauxoo
def check_vat_pe(self, vat):
vat_type,vat = vat and len(vat)>=2 and (vat[0], vat[1:]) or (False, False)
if vat_type and vat_type.upper() == 'D':
#DNI
return True
elif vat_type and vat_type.upper() == 'R':
#verify RUC
factor = '5432765432'
sum = 0
dig_check = False
if len(vat) != 11:
return False
try:
int(vat)
except ValueError:
return False
for f in range(0,10):
sum += int(factor[f]) * int(vat[f])
subtraction = 11 - (sum % 11)
if subtraction == 10:
dig_check = 0
elif subtraction == 11:
dig_check = 1
else:
dig_check = subtraction
return int(vat[10]) == dig_check
else:
return False
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
+1 -1
View File
@@ -51,8 +51,8 @@ class ImBus(osv.Model):
"channel" : json_dump(channel),
"message" : json_dump(message)
}
cr.commit()
self.pool['bus.bus'].create(cr, openerp.SUPERUSER_ID, values)
cr.commit()
if random.random() < 0.01:
self.gc(cr, uid)
if channels:
+11 -1
View File
@@ -11,6 +11,7 @@ from datetime import datetime, timedelta
from dateutil import parser
from dateutil import rrule
from dateutil.relativedelta import relativedelta
from openerp import api
from openerp import tools, SUPERUSER_ID
from openerp.osv import fields, osv
from openerp.tools import DEFAULT_SERVER_DATE_FORMAT, DEFAULT_SERVER_DATETIME_FORMAT
@@ -162,7 +163,7 @@ class calendar_attendee(osv.Model):
elif interval == 'minutes':
delta = timedelta(minutes=duration)
trigger.value = delta
valarm.add('DESCRIPTION').value = alarm.name or 'OpenERP'
valarm.add('DESCRIPTION').value = alarm.name or 'Odoo'
for attendee in event_obj.attendee_ids:
attendee_add = event.add('attendee')
attendee_add.value = 'MAILTO:' + (attendee.email or '')
@@ -745,6 +746,8 @@ class calendar_event(osv.Model):
def _compute(self, cr, uid, ids, fields, arg, context=None):
res = {}
if not isinstance(fields, list):
fields = [fields]
for meeting_id in ids:
res[meeting_id] = {}
attendee = self._find_my_attendee(cr, uid, [meeting_id], context)
@@ -1321,6 +1324,7 @@ class calendar_event(osv.Model):
('user_id', '=', uid),
]
@api.cr_uid_ids_context
def message_post(self, cr, uid, thread_id, body='', subject=None, type='notification', subtype=None, parent_id=False, attachments=None, context=None, **kwargs):
if isinstance(thread_id, str):
thread_id = get_real_ids(thread_id)
@@ -1567,6 +1571,12 @@ class calendar_event(osv.Model):
select = [ids]
else:
select = ids
# FIXME: find a better way to not push virtual ids in the cache
# (leading to their prefetching and ultimately a type error when
# postgres tries to convert '14-3489274297' to an integer)
self.invalidate_cache(cr, uid, context=context)
select = map(lambda x: (x, calendar_id2real_id(x)), select)
result = []
real_data = super(calendar_event, self).read(cr, uid, [real_id for calendar_id, real_id in select], fields=fields2, context=context, load=load)
+1 -1
View File
@@ -14,7 +14,7 @@
<p class="oe_view_nocontent_create">
Click to add a contact in your address book.
</p><p>
OpenERP helps you easily track all activities related to
Odoo helps you easily track all activities related to
a customer; discussions, history of business opportunities,
documents, etc.
</p>
+1 -1
View File
@@ -65,7 +65,7 @@
<p class="oe_grey" attrs="{'invisible': [('state', '!=', ('option'))]}">
Select the list of fields used to search for
duplicated records. If you select several fields,
OpenERP will propose you to merge only those having
Odoo will propose you to merge only those having
all these fields in common. (not one of the fields).
</p>
<group attrs="{'invisible': ['|', ('state', 'not in', ('selection', 'finished')), ('number_group', '=', 0)]}">
+19 -17
View File
@@ -71,9 +71,9 @@ class crm_tracking_mixin(osv.AbstractModel):
_columns = {
'campaign_id': fields.many2one('crm.tracking.campaign', 'Campaign', # old domain ="['|',('section_id','=',section_id),('section_id','=',False)]"
help="This is a name that helps you keep track of your different campaign efforts Example: Fall_Drive, Christmas_Special"),
'source_id': fields.many2one('crm.tracking.source', 'Source', help="This is the source of the link Example: Search Engine, another domain, or name of email list"),
'medium_id': fields.many2one('crm.tracking.medium', 'Channel', help="This is the method of delivery. EX: Postcard, Email, or Banner Ad"),
help="This is a name that helps you keep track of your different campaign efforts Ex: Fall_Drive, Christmas_Special"),
'source_id': fields.many2one('crm.tracking.source', 'Source', help="This is the source of the link Ex: Search Engine, another domain, or name of email list"),
'medium_id': fields.many2one('crm.tracking.medium', 'Channel', help="This is the method of delivery. Ex: Postcard, Email, or Banner Ad"),
}
def tracking_fields(self):
@@ -82,15 +82,17 @@ class crm_tracking_mixin(osv.AbstractModel):
def tracking_get_values(self, cr, uid, vals, context=None):
for key, field in self.tracking_fields():
column = self._all_columns[field].column
value = vals.get(field) or (request and request.session.get(key)) # params.get sould be always in session by the dispatch from ir_http
if column._type in ['many2one'] and isinstance(value, basestring): # if we receive a string for a many2one, we search / create the id
value = vals.get(field) or (request and request.session.get(key)) # params.get should be always in session by the dispatch from ir_http
if column._type in ['many2one'] and isinstance(value, basestring): # if we receive a string for a many2one, we search / create the id
if value:
Model = self.pool[column._obj]
rel_id = Model.name_search(cr, uid, value, context=context)
if not rel_id:
if rel_id:
rel_id = rel_id[0][0]
else:
rel_id = Model.create(cr, uid, {'name': value}, context=context)
vals[field] = rel_id
# Here the code for other cases that many2one
# Here the code for others cases that many2one
else:
vals[field] = value
return vals
@@ -123,17 +125,15 @@ class crm_case_stage(osv.osv):
'on_change': fields.boolean('Change Probability Automatically', help="Setting this stage will change the probability automatically on the opportunity."),
'requirements': fields.text('Requirements'),
'section_ids': fields.many2many('crm.case.section', 'section_stage_rel', 'stage_id', 'section_id', string='Sections',
help="Link between stages and sales teams. When set, this limitate the current stage to the selected sales teams."),
help="Link between stages and sales teams. When set, this limitate the current stage to the selected sales teams."),
'case_default': fields.boolean('Default to New Sales Team',
help="If you check this field, this stage will be proposed by default on each sales team. It will not assign this stage to existing teams."),
help="If you check this field, this stage will be proposed by default on each sales team. It will not assign this stage to existing teams."),
'fold': fields.boolean('Folded in Kanban View',
help='This stage is folded in the kanban view when'
'there are no records in that stage to display.'),
'type': fields.selection([('lead', 'Lead'),
('opportunity', 'Opportunity'),
('both', 'Both')],
string='Type', required=True,
help="This field is used to distinguish stages related to Leads from stages related to Opportunities, or to specify stages available for both types."),
'type': fields.selection([('lead', 'Lead'), ('opportunity', 'Opportunity'), ('both', 'Both')],
string='Type', required=True,
help="This field is used to distinguish stages related to Leads from stages related to Opportunities, or to specify stages available for both types."),
}
_defaults = {
@@ -145,6 +145,7 @@ class crm_case_stage(osv.osv):
'case_default': True,
}
class crm_case_categ(osv.osv):
""" Category of Case """
_name = "crm.case.categ"
@@ -154,16 +155,18 @@ class crm_case_categ(osv.osv):
'section_id': fields.many2one('crm.case.section', 'Sales Team'),
'object_id': fields.many2one('ir.model', 'Object Name'),
}
def _find_object_id(self, cr, uid, context=None):
"""Finds id for case object"""
context = context or {}
object_id = context.get('object_id', False)
ids = self.pool.get('ir.model').search(cr, uid, ['|',('id', '=', object_id),('model', '=', context.get('object_name', False))])
ids = self.pool.get('ir.model').search(cr, uid, ['|', ('id', '=', object_id), ('model', '=', context.get('object_name', False))])
return ids and ids[0] or False
_defaults = {
'object_id' : _find_object_id
'object_id': _find_object_id
}
class crm_payment_mode(osv.osv):
""" Payment Mode for Fund """
_name = "crm.payment.mode"
@@ -173,5 +176,4 @@ class crm_payment_mode(osv.osv):
'section_id': fields.many2one('crm.case.section', 'Sales Team'),
}
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
+1 -1
View File
@@ -3,7 +3,7 @@
<data noupdate="1">
<record model="crm.segmentation" id="crm_segmentation0">
<field name="name">OpenERP partners</field>
<field name="name">Odoo partners</field>
<field name="exclusif">True</field>
<field name="categ_id" ref="base.res_partner_category_2"/>
</record>
+1 -1
View File
@@ -45,7 +45,7 @@
<field name="search_view_id" ref="crm.view_crm_case_opportunities_filter"/>
<field name="help" type="html">
<p>
OpenERP helps you keep track of your sales pipeline to follow
Odoo helps you keep track of your sales pipeline to follow
up potential sales and better forecast your future revenues.
</p><p>
You will be able to plan meetings and phone calls from
+3
View File
@@ -349,6 +349,9 @@
<filter string="Sales Team" domain="[]" context="{'group_by':'section_id'}" groups="base.group_multi_salesteams"/>
<filter string="Stage" domain="[]" context="{'group_by':'stage_id'}"/>
<filter string="Customer" help="Partner" domain="[]" context="{'group_by':'partner_id'}"/>
<filter string="Campaign" domain="[]" context="{'group_by':'campaign_id'}"/>
<filter string="Source" domain="[]" context="{'group_by':'source_id'}"/>
<filter string="Channel" domain="[]" context="{'group_by':'medium_id'}"/>
<filter string="Expected Closing" domain="[]" context="{'group_by':'date_deadline:week'}"/>
<filter string="Last Message" name="group_message_last_post" domain="[]" context="{'group_by':'message_last_post:week'}"/>
</group>
+1
View File
@@ -141,6 +141,7 @@ class crm_phonecall(osv.osv):
'partner_phone' : call.partner_phone,
'partner_mobile' : call.partner_mobile,
'priority': call.priority,
'opportunity_id': call.opportunity_id and call.opportunity_id.id or False,
}
new_id = self.create(cr, uid, vals, context=context)
if action == 'log':
+2 -2
View File
@@ -64,7 +64,7 @@
<p class="oe_view_nocontent_create">
Click to log the summary of a phone call.
</p><p>
OpenERP allows you to log inbound calls on the fly to track the
Odoo allows you to log inbound calls on the fly to track the
history of the communication with a customer or to inform another
team member.
</p><p>
@@ -112,7 +112,7 @@
<p class="oe_view_nocontent_create">
Click to schedule a call
</p><p>
OpenERP allows you to easily define all the calls to be done
Odoo allows you to easily define all the calls to be done
by your sales team and follow up based on their summary.
</p><p>
You can use the import feature to massively import a new list of
-3
View File
@@ -23,9 +23,6 @@
<menuitem id="menu_crm_config_phonecall" name="Phone Calls"
parent="base.menu_base_config" sequence="45" groups="base.group_sale_salesman"/>
<menuitem id="base.next_id_64" name="Sales"
parent="base.menu_reporting" sequence="1"/>
<!-- crm.tracking.medium -->
<record id="crm_tracking_medium_view_tree" model="ir.ui.view">
<field name="name">crm.tracking.medium.tree</field>
+4 -4
View File
@@ -88,10 +88,10 @@ class crm_lead_report(osv.osv):
id,
c.date_deadline,
to_char(c.date_open, 'YYYY-MM-DD') as opening_date,
to_char(c.date_closed, 'YYYY-mm-dd') as date_closed,
date(c.date_open) as opening_date,
date(c.date_closed) as date_closed,
date_trunc('day',c.date_last_stage_update) as date_last_stage_update,
c.date_last_stage_update as date_last_stage_update,
c.user_id,
c.probability,
@@ -107,7 +107,7 @@ class crm_lead_report(osv.osv):
c.country_id,
c.planned_revenue,
c.planned_revenue*(c.probability/100) as probable_revenue,
date_trunc('day',c.create_date) as create_date,
c.create_date as create_date,
extract('epoch' from (c.date_closed-c.create_date))/(3600*24) as delay_close,
abs(extract('epoch' from (c.date_deadline - c.date_closed))/(3600*24)) as delay_expected,
extract('epoch' from (c.date_open-c.create_date))/(3600*24) as delay_open
+1 -4
View File
@@ -100,10 +100,7 @@
<filter string="Stage" domain="[]" context="{'group_by':'stage_id'}"/>
<filter string="Priority" domain="[]" context="{'group_by':'priority'}" />
<separator orientation="vertical" />
<filter string="Creation date (day)" domain="[]" context="{'group_by':'create_date:day'}"/>
<filter string="Creation date (week)" domain="[]" context="{'group_by':'create_date:week'}"/>
<filter string="Creation date (month)" domain="[]" context="{'group_by':'create_date:month'}" name="month"/>
<filter string="Creation date (year)" domain="[]" context="{'group_by':'create_date:year'}"/>
<filter string="Creation date" domain="[]" context="{'group_by':'create_date'}" name="month"/>
<separator orientation="vertical" />
<filter string="Exp. Closing" domain="[]" context="{'group_by':'date_deadline'}"/>
<filter string="Last Stage Update" context="{'group_by':'date_last_stage_update'}" />
+3 -5
View File
@@ -55,7 +55,6 @@ class crm_phonecall_report(osv.osv):
'partner_id': fields.many2one('res.partner', 'Partner' , readonly=True),
'company_id': fields.many2one('res.company', 'Company', readonly=True),
'opening_date': fields.date('Opening Date', readonly=True, select=True),
'creation_date': fields.date('Creation Date', readonly=True, select=True),
'date_closed': fields.date('Close Date', readonly=True, select=True),
}
@@ -69,9 +68,8 @@ class crm_phonecall_report(osv.osv):
create or replace view crm_phonecall_report as (
select
id,
to_char(c.create_date, 'YYYY-MM-DD') as creation_date,
to_char(c.date_open, 'YYYY-MM-DD') as opening_date,
to_char(c.date_closed, 'YYYY-mm-dd') as date_closed,
date(c.date_open) as opening_date,
date(c.date_closed) as date_closed,
c.state,
c.user_id,
c.section_id,
@@ -81,7 +79,7 @@ class crm_phonecall_report(osv.osv):
c.company_id,
c.priority,
1 as nbr,
date_trunc('day',c.create_date) as create_date,
c.create_date as create_date,
extract('epoch' from (c.date_closed-c.create_date))/(3600*24) as delay_close,
extract('epoch' from (c.date_open-c.create_date))/(3600*24) as delay_open
from
@@ -41,7 +41,6 @@
<group expand="0" string="Extended Filters...">
<field name="partner_id" filter_domain="[('partner_id','child_of',self)]"/>
<field name="company_id" groups="base.group_multi_company"/>
<field name="creation_date"/>
<field name="opening_date"/>
<field name="date_closed"/>
</group>
@@ -53,9 +52,7 @@
<filter string="Category" icon="terp-stock_symbol-selection" domain="[]" context="{'group_by':'categ_id'}" />
<filter string="Status" icon="terp-stock_effects-object-colorize" domain="[]" context="{'group_by':'state'}" />
<filter string="Company" icon="terp-go-home" domain="[]" context="{'group_by':'company_id'}" groups="base.group_multi_company"/>
<filter string="Creation Date (day)" icon="terp-go-today" domain="[]" context="{'group_by':'create_date:day'}" help="Date of call"/>
<filter string="Creation Date (month)" icon="terp-go-month" domain="[]" context="{'group_by':'create_date:month'}" help="Month of call"/>
<filter string="Creation Date (year)" icon="terp-go-year" domain="[]" context="{'group_by':'create_date:name'}" help="Year of call"/>
<filter string="Creation Date" icon="terp-go-month" domain="[]" context="{'group_by':'create_date:month'}" help="Month of call"/>
</group>
</search>
</field>
+2 -2
View File
@@ -44,10 +44,10 @@ class crm_case_section(osv.Model):
help="The first contact you get with a potential customer is a lead you qualify before converting it into a real business opportunity. Check this box to manage leads in this sales team."),
'use_opportunities': fields.boolean('Opportunities', help="Check this box to manage opportunities in this sales team."),
'monthly_open_leads': fields.function(_get_opportunities_data,
type="any", readonly=True, multi='_get_opportunities_data',
type="char", readonly=True, multi='_get_opportunities_data',
string='Open Leads per Month'),
'monthly_planned_revenue': fields.function(_get_opportunities_data,
type="any", readonly=True, multi='_get_opportunities_data',
type="char", readonly=True, multi='_get_opportunities_data',
string='Planned Revenue per Month'),
'alias_id': fields.many2one('mail.alias', 'Alias', ondelete="restrict", required=True, help="The email address associated with this team. New emails received will automatically create new leads assigned to the team."),
}
+1 -1
View File
@@ -50,7 +50,7 @@
</field>
<field name="help" type="html">
<p>
OpenERP helps you keep track of your sales pipeline to follow
Odoo helps you keep track of your sales pipeline to follow
up potential sales and better forecast your future revenues.
</p><p>
You will be able to plan meetings and phone calls from
+3 -3
View File
@@ -101,7 +101,7 @@ Follow opportunities that interest you to get notified upon specific events: dea
<p class="oe_mt32">
Work with the email applications you already use every day. Whether your company uses Microsoft Outlook or Gmail, no one needs to change the way they work, so everyone stays productive.
</p><p>
Route, sort and filter incoming emails automatically. OpenERP CRM handles incoming emails and route them to the right opportunities or sales team. New leads are created on the fly and interested salespersons are notified automatically.
Route, sort and filter incoming emails automatically. Odoo CRM handles incoming emails and route them to the right opportunities or sales team. New leads are created on the fly and interested salespersons are notified automatically.
</p>
</div>
<div class="oe_span6">
@@ -209,7 +209,7 @@ Customize your sales cycle by configuring sales stages that perfectly fit your s
<div class="oe_span6">
<div class="oe_quote">
<q>
With OpenERP CRM I keep all the information about leads and customers
With Odoo CRM I keep all the information about leads and customers
in a single place, and share it with my colleagues. It's great and effective.
</q>
<cite class="oe_cite oe_clearfix">
@@ -222,7 +222,7 @@ Customize your sales cycle by configuring sales stages that perfectly fit your s
<div class="oe_span6">
<div class="oe_quote">
<q>
I am surprised by how good OpenERP CRM is. Awesome product.
I am surprised by how good Odoo CRM is. Awesome product.
</q>
<cite class="oe_cite oe_clearfix">
<img class="oe_photo" src="Stephan-Keller.jpg">
+6 -15
View File
@@ -37,19 +37,12 @@ class crm_claim_report(osv.osv):
_description = "CRM Claim Report"
_columns = {
'name': fields.char('Year', required=False, readonly=True),
'user_id':fields.many2one('res.users', 'User', readonly=True),
'section_id':fields.many2one('crm.case.section', 'Section', readonly=True),
'nbr': fields.integer('# of Cases', readonly=True),
'month':fields.selection([('01', 'January'), ('02', 'February'), \
('03', 'March'), ('04', 'April'),\
('05', 'May'), ('06', 'June'), \
('07', 'July'), ('08', 'August'),\
('09', 'September'), ('10', 'October'),\
('11', 'November'), ('12', 'December')], 'Month', readonly=True),
'company_id': fields.many2one('res.company', 'Company', readonly=True),
'create_date': fields.datetime('Create Date', readonly=True, select=True),
'day': fields.char('Day', size=128, readonly=True),
'claim_date': fields.datetime('Claim Date', readonly=True),
'delay_close': fields.float('Delay to close', digits=(16,2),readonly=True, group_operator="avg",help="Number of Days to close the case"),
'stage_id': fields.many2one ('crm.case.stage', 'Stage', readonly=True,domain="[('section_ids','=',section_id)]"),
'categ_id': fields.many2one('crm.case.categ', 'Category',\
@@ -76,11 +69,9 @@ class crm_claim_report(osv.osv):
create or replace view crm_claim_report as (
select
min(c.id) as id,
to_char(c.date, 'YYYY') as name,
to_char(c.date, 'MM') as month,
to_char(c.date, 'YYYY-MM-DD') as day,
to_char(c.date_closed, 'YYYY-MM-DD') as date_closed,
to_char(c.date_deadline, 'YYYY-MM-DD') as date_deadline,
c.date as claim_date,
date(c.date_closed) as date_closed,
c.date_deadline as date_deadline,
c.user_id,
c.stage_id,
c.section_id,
@@ -90,13 +81,13 @@ class crm_claim_report(osv.osv):
count(*) as nbr,
c.priority as priority,
c.type_action as type_action,
date_trunc('day',c.create_date) as create_date,
c.create_date as create_date,
avg(extract('epoch' from (c.date_closed-c.create_date)))/(3600*24) as delay_close,
(SELECT count(id) FROM mail_message WHERE model='crm.claim' AND res_id=c.id) AS email,
extract('epoch' from (c.date_deadline - c.date_closed))/(3600*24) as delay_expected
from
crm_claim c
group by to_char(c.date, 'YYYY'), to_char(c.date, 'MM'),to_char(c.date, 'YYYY-MM-DD'),\
group by c.date,\
c.user_id,c.section_id, c.stage_id,\
c.categ_id,c.partner_id,c.company_id,c.create_date,
c.priority,c.type_action,c.date_deadline,c.date_closed,c.id
@@ -53,9 +53,7 @@
<filter string="Category" icon="terp-stock_symbol-selection" domain="[]" context="{'group_by':'categ_id'}" />
<filter string="Type" icon="terp-stock_symbol-selection" domain="[]" context="{'group_by':'type_action'}" help="Action Type"/>
<filter string="Company" icon="terp-go-home" domain="[]" context="{'group_by':'company_id'}" groups="base.group_multi_company"/>
<filter string="Day" icon="terp-go-today" domain="[]" context="{'group_by':'day'}" help="Date of claim"/>
<filter string="Month" icon="terp-go-month" domain="[]" context="{'group_by':'month'}" help="Month of claim"/>
<filter string="Year" icon="terp-go-year" domain="[]" context="{'group_by':'name'}" help="Year of claim"/>
<filter string="Claim Date" icon="terp-go-month" domain="[]" context="{'group_by':'claim_date'}" help="Month of claim"/>
</group>
</search>
</field>
@@ -81,13 +79,8 @@
<field name="act_window_id" ref="action_report_crm_claim"/>
</record>
<menuitem id="base.menu_project_report" name="Project"
groups="base.group_no_one"
parent="base.menu_reporting" sequence="30"/>
<menuitem name="Claims Analysis" id="menu_report_crm_claim_tree"
action="action_report_crm_claim" parent="base.menu_project_report" sequence="15"/>
action="action_report_crm_claim" parent="base.next_id_64" sequence="15"/>
</data>
</openerp>
+3 -3
View File
@@ -9,8 +9,8 @@
<field name="state">draft</field>
<field name="section_id" ref="sales_team.section_sales_department"/>
<field name="date" eval="time.strftime('%Y-%m-04 11:10:36')"/>
<field name="name">Download old version of OpenERP? </field>
<field eval="&quot;Is there any link to download old versions of OpenERP?&quot;" name="description"/>
<field name="name">Download old version of Odoo? </field>
<field eval="&quot;Is there any link to download old versions of Odoo?&quot;" name="description"/>
</record>
<record id="crm_helpdesk_2" model="crm.helpdesk">
@@ -46,7 +46,7 @@
<field name="state">draft</field>
<field name="date" eval="time.strftime('%Y-%m-12 11:15:17')"/>
<field name="name">How to create a new module</field>
<field eval="&quot;How can I create new module in OpenERP?&quot;" name="description"/>
<field eval="&quot;How can I create new module in Odoo?&quot;" name="description"/>
</record>
</data>
</openerp>
+1 -1
View File
@@ -23,7 +23,7 @@
</p><p>
Helpdesk and Support allow you to track your interventions.
</p><p>
Use the OpenERP Issues system to manage your support
Use the Odoo Issues system to manage your support
activities. Issues can be connected to the email gateway: new
emails may create issues, each of them automatically gets the
history of the conversation with the customer.
@@ -39,17 +39,11 @@ class crm_helpdesk_report(osv.osv):
_auto = False
_columns = {
'name': fields.char('Year', required=False, readonly=True),
'date': fields.datetime('Date', readonly=True),
'user_id':fields.many2one('res.users', 'User', readonly=True),
'section_id':fields.many2one('crm.case.section', 'Section', readonly=True),
'nbr': fields.integer('# of Cases', readonly=True),
'state': fields.selection(AVAILABLE_STATES, 'Status', readonly=True),
'month':fields.selection([('01', 'January'), ('02', 'February'), \
('03', 'March'), ('04', 'April'),\
('05', 'May'), ('06', 'June'), \
('07', 'July'), ('08', 'August'),\
('09', 'September'), ('10', 'October'),\
('11', 'November'), ('12', 'December')], 'Month', readonly=True),
'delay_close': fields.float('Delay to Close',digits=(16,2),readonly=True, group_operator="avg"),
'partner_id': fields.many2one('res.partner', 'Partner' , readonly=True),
'company_id': fields.many2one('res.company', 'Company', readonly=True),
@@ -64,7 +58,6 @@ class crm_helpdesk_report(osv.osv):
'create_date': fields.date('Creation Date' , readonly=True, select=True),
'date_closed': fields.date('Close Date', readonly=True, select=True),
'delay_expected': fields.float('Overpassed Deadline',digits=(16,2),readonly=True, group_operator="avg"),
'day': fields.char('Day', size=128, readonly=True),
'email': fields.integer('# Emails', size=128, readonly=True),
}
@@ -80,11 +73,9 @@ class crm_helpdesk_report(osv.osv):
create or replace view crm_helpdesk_report as (
select
min(c.id) as id,
to_char(c.date, 'YYYY') as name,
to_char(c.date, 'MM') as month,
to_char(c.date, 'YYYY-MM-DD') as day,
to_char(c.create_date, 'YYYY-MM-DD') as create_date,
to_char(c.date_closed, 'YYYY-mm-dd') as date_closed,
c.date as date,
date(c.create_date) as create_date,
date(c.date_closed) as date_closed,
c.state,
c.user_id,
c.section_id,
@@ -102,7 +93,7 @@ class crm_helpdesk_report(osv.osv):
from
crm_helpdesk c
where c.active = 'true'
group by to_char(c.date, 'YYYY'), to_char(c.date, 'MM'),to_char(c.date, 'YYYY-MM-DD'),\
group by c.date,\
c.state, c.user_id,c.section_id,c.priority,\
c.partner_id,c.company_id,c.date_deadline,c.create_date,c.date,c.date_closed,\
c.categ_id,c.channel_id,c.planned_cost,c.id
@@ -49,9 +49,7 @@
<filter string="Channel" icon="terp-call-start" domain="[]" context="{'group_by':'channel_id'}" />
<filter string="Status" icon="terp-stock_effects-object-colorize" domain="[]" context="{'group_by':'state'}" />
<filter string="Company" icon="terp-go-home" domain="[]" groups="base.group_multi_company" context="{'group_by':'company_id'}" />
<filter string="Day" icon="terp-go-today" domain="[]" context="{'group_by':'day'}" help="Date of helpdesk requests"/>
<filter string="Month" icon="terp-go-month" domain="[]" context="{'group_by':'month'}" help="Month of helpdesk requests"/>
<filter string="Year" icon="terp-go-year" domain="[]" context="{'group_by':'name'}" help="Year of helpdesk requests" />
<filter string="Date" icon="terp-go-month" domain="[]" context="{'group_by':'date'}" help="Month of helpdesk requests"/>
</group>
</search>
</field>
@@ -77,12 +75,8 @@
<field name="act_window_id" ref="action_report_crm_helpdesk"/>
</record>
<menuitem id="base.menu_project_report" name="Project"
groups="base.group_no_one"
parent="base.menu_reporting" sequence="30"/>
<menuitem name="Helpdesk Analysis" action="action_report_crm_helpdesk"
id="menu_report_crm_helpdesks_tree" parent="base.menu_project_report" sequence="20"/>
id="menu_report_crm_helpdesks_tree" parent="base.next_id_64" sequence="20"/>
</data>
</openerp>
@@ -48,7 +48,6 @@ class crm_lead_report_assign(osv.osv):
'stage_id': fields.many2one ('crm.case.stage', 'Stage', domain="[('section_ids', '=', section_id)]"),
'partner_id': fields.many2one('res.partner', 'Customer' , readonly=True),
'opening_date': fields.date('Opening Date', readonly=True),
'creation_date': fields.date('Creation Date', readonly=True),
'date_closed': fields.date('Close Date', readonly=True),
'nbr': fields.integer('# of Cases', readonly=True),
'company_id': fields.many2one('res.company', 'Company', readonly=True),
@@ -69,9 +68,8 @@ class crm_lead_report_assign(osv.osv):
CREATE OR REPLACE VIEW crm_lead_report_assign AS (
SELECT
c.id,
to_char(c.create_date, 'YYYY-MM-DD') as creation_date,
to_char(c.date_open, 'YYYY-MM-DD') as opening_date,
to_char(c.date_closed, 'YYYY-mm-dd') as date_closed,
date(c.date_open) as opening_date,
date(c.date_closed) as date_closed,
c.date_assign,
c.user_id,
c.probability,
@@ -89,7 +87,7 @@ class crm_lead_report_assign(osv.osv):
p.date as partner_date,
c.planned_revenue*(c.probability/100) as probable_revenue,
1 as nbr,
date_trunc('day',c.create_date) as create_date,
c.create_date as create_date,
extract('epoch' from (c.write_date-c.create_date))/(3600*24) as delay_close,
extract('epoch' from (c.date_deadline - c.date_closed))/(3600*24) as delay_expected,
extract('epoch' from (c.date_open-c.create_date))/(3600*24) as delay_open
@@ -18,7 +18,6 @@
<field name="stage_id" widget="selection" domain="[('section_ids', '=', 'section_id')]"/>
<separator />
<field name="company_id" widget="selection" groups="base.group_multi_company"/>
<field name="creation_date"/>
<field name="opening_date"/>
<field name="date_closed"/>
</group>
@@ -35,9 +34,7 @@
<filter string="Stage" icon="terp-stage" domain="[]" context="{'group_by':'stage_id'}"/>
<filter string="Priority" icon="terp-rating-rated" domain="[]" context="{'group_by':'priority'}" />
<filter string="Company" icon="terp-go-home" domain="[]" context="{'group_by':'company_id'}" />
<filter string="Assign Date (day)" icon="terp-go-today" domain="[]" context="{'group_by':'date_assign:day'}"/>
<filter string="Assign Date (month)" icon="terp-go-month" domain="[]" context="{'group_by':'date_assign:month'}"/>
<filter string="Assign Date (year)" icon="terp-go-year" domain="[]" context="{'group_by':'date_assign:year'}"/>
<filter string="Assign Date" icon="terp-go-month" domain="[]" context="{'group_by':'date_assign:month'}"/>
</group>
</search>
</field>
+2 -2
View File
@@ -17,7 +17,7 @@
<field name="name">Partner level?</field>
</record>
<record model="crm_profiling.question" id="partner_tiny">
<field name="name">OpenERP partner?</field>
<field name="name">Odoo partner?</field>
</record>
<!--
@@ -95,7 +95,7 @@
-->
<record model="crm.segmentation" id="crm.crm_segmentation0">
<field name="name">OpenERP partners</field>
<field name="name">Odoo partners</field>
<field name="answer_yes" eval="[(6,0,[partner_tiny1])]" />
<field name="categ_id" ref="base.res_partner_category_2"/>
<field name="profiling_active">True</field>
+19 -4
View File
@@ -19,11 +19,14 @@
#
##############################################################################
import logging
import time
from openerp.osv import fields,osv
from openerp.tools.translate import _
import openerp.addons.decimal_precision as dp
_logger = logging.getLogger(__name__)
class delivery_carrier(osv.osv):
_name = "delivery.carrier"
_description = "Carrier"
@@ -51,14 +54,24 @@ class delivery_carrier(osv.osv):
for carrier in self.browse(cr, uid, ids, context=context):
order_id=context.get('order_id',False)
price=False
available = False
if order_id:
order = sale_obj.browse(cr, uid, order_id, context=context)
carrier_grid=self.grid_get(cr,uid,[carrier.id],order.partner_shipping_id.id,context)
if carrier_grid:
price=grid_obj.get_price(cr, uid, carrier_grid, order, time.strftime('%Y-%m-%d'), context)
try:
price=grid_obj.get_price(cr, uid, carrier_grid, order, time.strftime('%Y-%m-%d'), context)
available = True
except osv.except_osv, e:
# no suitable delivery method found, probably configuration error
_logger.error("Carrier %s: %s\n%s" % (carrier.name, e.name, e.value))
price = 0.0
else:
price = 0.0
res[carrier.id]=price
res[carrier.id] = {
'price': price,
'available': available
}
return res
_columns = {
@@ -66,7 +79,9 @@ class delivery_carrier(osv.osv):
'partner_id': fields.many2one('res.partner', 'Transport Company', required=True, help="The partner that is doing the delivery service."),
'product_id': fields.many2one('product.product', 'Delivery Product', required=True),
'grids_id': fields.one2many('delivery.grid', 'carrier_id', 'Delivery Grids'),
'price' : fields.function(get_price, string='Price'),
'available' : fields.function(get_price, string='Available',type='boolean', multi='price',
help="Is the carrier method possible with the current order."),
'price' : fields.function(get_price, string='Price', multi='price'),
'active': fields.boolean('Active', help="If the active field is set to False, it will allow you to hide the delivery carrier without removing it."),
'normal_price': fields.float('Normal Price', help="Keep empty if the pricing depends on the advanced pricing per destination"),
'free_if_more_than': fields.boolean('Free If Order Total Amount Is More Than', help="If the order is more expensive than a certain amount, the customer can benefit from a free shipping"),
@@ -196,7 +211,7 @@ class delivery_grid(osv.osv):
for line in order.order_line:
if not line.product_id or line.is_delivery:
continue
q = product_uom_obj._compute_qty(cr, uid, line.product_uom.id, line.product_uos_qty, line.product_id.uom_id.id)
q = product_uom_obj._compute_qty(cr, uid, line.product_uom.id, line.product_uom_qty, line.product_id.uom_id.id)
weight += (line.product_id.weight or 0.0) * q
volume += (line.product_id.volume or 0.0) * q
quantity += q
@@ -12,7 +12,7 @@
</form>
<group string="res_config_contents" position="replace">
<separator string="Configure Directories"/>
<p>OpenERP's Document Management System supports mapping virtual folders with documents. The virtual folder of a document can be used to manage the files attached to the document, or to print and download any report. This tool will create directories automatically according to modules installed.</p>
<p>Odoo's Document Management System supports mapping virtual folders with documents. The virtual folder of a document can be used to manage the files attached to the document, or to print and download any report. This tool will create directories automatically according to modules installed.</p>
<p>When executing this wizard, it will configure your directories automatically according to modules installed.</p>
</group>
</data>
+5 -5
View File
@@ -37,7 +37,7 @@ _logger = logging.getLogger(__name__)
EXTERNAL_ID_PATTERN = re.compile(r'^([^.:]+)(?::([^.]+))?\.(\S+)$')
EDI_VIEW_WEB_URL = '%s/edi/view?db=%s&token=%s'
EDI_PROTOCOL_VERSION = 1 # arbitrary ever-increasing version number
EDI_GENERATOR = 'OpenERP ' + release.major_version
EDI_GENERATOR = 'Odoo' + release.major_version
EDI_GENERATOR_VERSION = release.version_info
def split_external_id(ext_id):
@@ -127,7 +127,7 @@ class edi(osv.AbstractModel):
assert module, 'a `__module` or `__import_module` attribute is required in each EDI document.'
if module != 'base' and not ir_module.search(cr, uid, [('name','=',module),('state','=','installed')]):
raise osv.except_osv(_('Missing Application.'),
_("The document you are trying to import requires the OpenERP `%s` application. "
_("The document you are trying to import requires the Odoo `%s` application. "
"You can install it by connecting as the administrator and opening the configuration assistant.")%(module,))
model = edi_document.get('__import_model') or edi_document.get('__model')
assert model, 'a `__model` or `__import_model` attribute is required in each EDI document.'
@@ -185,9 +185,9 @@ class EDIMixin(object):
"""Generate/Retrieve unique external ID for ``record``.
Each EDI record and each relationship attribute in it is identified by a
unique external ID, which includes the database's UUID, as a way to
refer to any record within any OpenERP instance, without conflict.
refer to any record within any Odoo instance, without conflict.
For OpenERP records that have an existing "External ID" (i.e. an entry in
For Odoo records that have an existing "External ID" (i.e. an entry in
ir.model.data), the EDI unique identifier for this record will be made of
"%s:%s:%s" % (module, database UUID, ir.model.data ID). The database's
UUID MUST NOT contain a colon characters (this is guaranteed by the
@@ -266,7 +266,7 @@ class EDIMixin(object):
'__id': 'module:db-uuid:model.id', # unique global external ID for the record
'__last_update': '2011-01-01 10:00:00', # last update date in UTC!
'__version': 1, # EDI spec version
'__generator' : 'OpenERP', # EDI generator
'__generator' : 'Odoo', # EDI generator
'__generator_version' : [6,1,0], # server version, to check compatibility.
'__attachments_':
}
+8 -5
View File
@@ -185,12 +185,15 @@ class event_event(models.Model):
for reg in self.registration_ids
)
@api.one
@api.multi
@api.depends('name', 'date_begin', 'date_end')
def _compute_display_name(self):
dates = [dt.split(' ')[0] for dt in [self.date_begin, self.date_end] if dt]
dates = sorted(set(dates))
self.display_name = '%s (%s)' % (self.name, ' - '.join(dates))
def name_get(self):
result = []
for event in self:
dates = [dt.split(' ')[0] for dt in [event.date_begin, event.date_end] if dt]
dates = sorted(set(dates))
result.append((event.id, '%s (%s)' % (event.name, ' - '.join(dates))))
return result
@api.one
@api.constrains('seats_max', 'seats_available')
+2 -2
View File
@@ -53,8 +53,8 @@
<p><strong>Program:</strong></p>
<p>Conferences, workshops and trainings will be organized in 6 rooms:</p>
<ul>
<li>2 technical rooms: one dedicated to advanced OpenERP developers, one for new developers.</li>
<li>2 technical rooms: one dedicated to advanced OpenERP developers, one for new developers.</li>
<li>2 technical rooms: one dedicated to advanced Odoo developers, one for new developers.</li>
<li>2 technical rooms: one dedicated to advanced Odoo developers, one for new developers.</li>
<li>1 business room: to discuss implementation methodologies, best sales practices, etc.</li>
<li>1 workshop room: mainly for developers.</li>
</ul>
+1 -1
View File
@@ -304,7 +304,7 @@
<p class="oe_view_nocontent_create">
Click to add a new event.
</p><p>
OpenERP helps you schedule and efficiently organize your events:
Odoo helps you schedule and efficiently organize your events:
track subscriptions and participations, automate the confirmation emails,
sell tickets, etc.
</p>
@@ -41,9 +41,7 @@
<filter string="Event State" icon="terp-stock_effects-object-colorize" context="{'group_by':'event_state'}"/>
<filter string="Registration State" icon="terp-stock_effects-object-colorize" context="{'group_by':'registration_state'}"/>
<filter string="Company" icon="terp-go-home" domain="[]" context="{'group_by':'company_id'}" groups="base.group_multi_company"/>
<filter string="Event Date (day)" domain="[]" context="{'group_by':'event_date:day'}" help="Event Beginning Date"/>
<filter string="Event Date (month)" domain="[]" context="{'group_by':'event_date:month'}" help="Event Beginning Date"/>
<filter string="Event Date (year)" domain="[]" context="{'group_by':'event_date:year'}" help="Event Beginning Date"/>
<filter string="Event Date" domain="[]" context="{'group_by':'event_date'}" help="Event Beginning Date"/>
</group>
<group expand="0" string="Display">
<filter icon="terp-camera_test" string="Show Confirmed Registrations"
+1 -11
View File
@@ -53,15 +53,6 @@ class fleet_vehicle_cost(osv.Model):
odometer_id = self.pool.get('fleet.vehicle.odometer').create(cr, uid, data, context=context)
return self.write(cr, uid, id, {'odometer_id': odometer_id}, context=context)
def _year_get_fnc(self, cr, uid, ids, name, unknow_none, context=None):
res = {}
for record in self.browse(cr, uid, ids, context=context):
if (record.date):
res[record.id] = str(time.strptime(record.date, tools.DEFAULT_SERVER_DATE_FORMAT).tm_year)
else:
res[record.id] = _('Unknown')
return res
_columns = {
'name': fields.related('vehicle_id', 'name', type="char", string='Name', store=True),
'vehicle_id': fields.many2one('fleet.vehicle', 'Vehicle', required=True, help='Vehicle concerned by this log'),
@@ -76,7 +67,6 @@ class fleet_vehicle_cost(osv.Model):
'date' :fields.date('Date',help='Date when the cost has been executed'),
'contract_id': fields.many2one('fleet.vehicle.log.contract', 'Contract', help='Contract attached to this cost'),
'auto_generated': fields.boolean('Automatically Generated', readonly=True, required=True),
'year': fields.function(_year_get_fnc, type="char", string='Year', store=True),
}
_defaults ={
@@ -761,7 +751,7 @@ class fleet_vehicle_log_contract(osv.Model):
def on_change_indic_cost(self, cr, uid, ids, cost_ids, context=None):
totalsum = 0.0
for element in cost_ids:
if element and len(element) == 3 and element[2] is not False:
if element and len(element) == 3 and element[2]:
totalsum += element[2].get('amount', 0.0)
return {
'value': {
+4 -4
View File
@@ -10,11 +10,11 @@
<field name="context">{"search_default_parent_false" : True,"search_default_groupby_year" : True, "search_default_groupby_cost_subtype" : True,"search_default_groupby_vehicle_id" : True}</field>
<field name="help" type="html">
<p>
OpenERP helps you managing the costs for your different vehicles
Odoo helps you managing the costs for your different vehicles
Costs are generally created from services and contract and appears here.
</p>
<p>
Thanks to the different filters, OpenERP can only print the effective
Thanks to the different filters, Odoo can only print the effective
costs, sort them by type and by vehicle.
</p>
</field>
@@ -29,11 +29,11 @@
<field name="context">{"search_default_parent_true" : True,"search_default_groupby_cost_subtype" : True,"search_default_groupby_parent_id" : True,}</field>
<field name="help" type="html">
<p>
OpenERP helps you managing the costs for your different vehicles
Odoo helps you managing the costs for your different vehicles
Costs are generally created from services and contract and appears here.
</p>
<p>
Thanks to the different filters, OpenERP can only print the effective
Thanks to the different filters, Odoo can only print the effective
costs, sort them by type and by vehicle.
</p>
</field>
+5 -6
View File
@@ -418,7 +418,7 @@
contracts, services, fixed and recurring costs, odometers and
fuel logs associated to each vehicle.
</p><p>
OpenERP will warn you when services or contract have to be
Odoo will warn you when services or contract have to be
renewed.
</p>
</field>
@@ -558,7 +558,7 @@
Click to create a new contract.
</p><p>
Manage all your contracts (leasing, insurances, etc.) with
their related services, costs. OpenERP will automatically warn
their related services, costs. Odoo will automatically warn
you when some contracts have to be renewed.
</p><p>
Each contract (e.g.: leasing) may include several services
@@ -847,7 +847,7 @@
<p class="oe_view_nocontent_create">
Click to create a new service entry.
</p><p>
OpenERP helps you keeping track of all the services done
Odoo helps you keeping track of all the services done
on your vehicle. Services can be of many type: occasional
repair, fixed maintenance, etc.
</p>
@@ -919,13 +919,12 @@
<search string="Vehicles costs" >
<field name="vehicle_id" />
<field name="cost_subtype_id"/>
<field name="year"/>
<field name="date"/>
<field name="parent_id"/>
<filter name="parent_false" domain="[('parent_id','=',False)]" string="Effective Costs"/>
<filter name="parent_true" domain="[('parent_id','!=',False)]" string="Indicative Costs"/>
<group expand="1" string="Group By">
<filter name="groupby_year" context="{'group_by' : 'year'}" string="Year"/>
<filter name="groupby_year" context="{'group_by' : 'date:year'}" string="Year"/>
<filter name="groupby_date" context="{'group_by' : 'date'}" string="Vehicle Costs Month" help="Vehicle Costs by Month"/>
<filter name="groupby_cost_type" context="{'group_by' : 'cost_type'}" string="Cost Type"/>
<filter name="groupby_cost_subtype_id" context="{'group_by' : 'cost_subtype_id'}" string="Cost Subtype"/>
@@ -980,7 +979,7 @@
<p class="oe_view_nocontent_create">
Click to create a new cost.
</p><p>
OpenERP helps you managing the costs for your different
Odoo helps you managing the costs for your different
vehicles. Costs are created automatically from services,
contracts (fixed or recurring) and fuel logs.
</p>
-1
View File
@@ -40,7 +40,6 @@
<form string="Badge">
<header>
<button string="Grant this Badge" type="action" name="%(action_grant_wizard)d" class="oe_highlight" attrs="{'invisible': [('remaining_sending','=',0)]}" />
<button string="Check Badge" type="object" name="check_automatic" groups="base.group_no_one" />
</header>
<sheet>
<div class="oe_right oe_button_box">
+5 -5
View File
@@ -122,9 +122,9 @@ class SyncEvent(object):
self.OP = Delete('OE', 'Update or delete from GOOGLE')
else:
if not modeFull:
self.OP = Delete('GG', 'Deleted from OpenERP, need to delete it from Gmail if already created')
self.OP = Delete('GG', 'Deleted from Odoo, need to delete it from Gmail if already created')
else:
self.OP = NothingToDo("", "Already Deleted in gmail and unlinked in OpenERP")
self.OP = NothingToDo("", "Already Deleted in gmail and unlinked in Odoo")
elif self.GG.found and not self.OE.found:
tmpSrc = 'GG'
if not self.GG.status and not self.GG.isInstance:
@@ -915,7 +915,7 @@ class res_users(osv.Model):
'google_calendar_token_validity': fields.datetime('Token Validity'),
'google_calendar_last_sync_date': fields.datetime('Last synchro date'),
'google_calendar_cal_id': fields.char('Calendar ID', help='Last Calendar ID who has been synchronized. If it is changed, we remove \
all links between GoogleID and OpenERP Google Internal ID')
all links between GoogleID and Odoo Google Internal ID')
}
@@ -948,7 +948,7 @@ class calendar_event(osv.Model):
return super(calendar_event, self).unlink(cr, uid, ids, can_be_deleted=can_be_deleted, context=context)
_columns = {
'oe_update_date': fields.datetime('OpenERP Update Date'),
'oe_update_date': fields.datetime('Odoo Update Date'),
}
@@ -957,7 +957,7 @@ class calendar_attendee(osv.Model):
_columns = {
'google_internal_event_id': fields.char('Google Calendar Event Id'),
'oe_synchro_date': fields.datetime('OpenERP Synchro Date'),
'oe_synchro_date': fields.datetime('Odoo Synchro Date'),
}
_sql_constraints = [('google_id_uniq', 'unique(google_internal_event_id,partner_id,event_id)', 'Google ID should be unique!')]

Some files were not shown because too many files have changed in this diff Show More