[MERGE] forward port of branch 8.0 up to fd4fd35
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
[](http://runbot.odoo.com/runbot)
|
||||
[](http://runbot.odoo.com/runbot)
|
||||
|
||||
Odoo
|
||||
----
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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."),
|
||||
}
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -61,7 +61,7 @@
|
||||
<group>
|
||||
<field domain="[('company_id', '=', parent.company_id), ('journal_id', '=', parent.journal_id), ('type', '<>', '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','<>','view'), ('company_id', '=', parent.company_id)]" name="account_analytic_id" groups="analytic.group_analytic_accounting"/>
|
||||
<field domain="[('type','<>','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','<>','view'), ('company_id', '=', parent.company_id)]" groups="analytic.group_analytic_accounting"/>
|
||||
<field name="account_analytic_id" domain="[('type','<>','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>
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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"/>
|
||||
|
||||
@@ -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"/>
|
||||
|
||||
@@ -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)]}"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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),
|
||||
}
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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"),
|
||||
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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"/>
|
||||
|
||||
@@ -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 & 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.
|
||||
|
||||
@@ -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']:
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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 = {}
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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')
|
||||
|
||||
+2
-2
@@ -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):
|
||||
|
||||
+1
-1
@@ -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")
|
||||
|
||||
+2
-2
@@ -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. Save it as a .SXW file and open it with OpenOffice. Don't forget to install the OpenERP SA OpenOffice package to modify it. 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. Save it as a .SXW file and open it with OpenOffice. Don't forget to install the Odoo SA OpenOffice package to modify it. Once it is modified, re-upload it in Odoo using this wizard." align="0.0"/>
|
||||
</group>
|
||||
</form>
|
||||
</field>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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
@@ -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,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)
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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
@@ -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:
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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':
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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'}" />
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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."),
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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">
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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=""Is there any link to download old versions of OpenERP?"" name="description"/>
|
||||
<field name="name">Download old version of Odoo? </field>
|
||||
<field eval=""Is there any link to download old versions of Odoo?"" 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=""How can I create new module in OpenERP?"" name="description"/>
|
||||
<field eval=""How can I create new module in Odoo?"" name="description"/>
|
||||
</record>
|
||||
</data>
|
||||
</openerp>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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,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>
|
||||
|
||||
@@ -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_':
|
||||
}
|
||||
|
||||
@@ -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')
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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
@@ -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': {
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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">
|
||||
|
||||
@@ -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
Reference in New Issue
Block a user