[MERGE]Latest Trunk
bzr revid: dle@openerp.com-20121112151539-lejffs2lmhs641a3
This commit is contained in:
commit
d59abaf0f3
|
@ -541,10 +541,18 @@ class account_account(osv.osv):
|
|||
return False
|
||||
return True
|
||||
|
||||
def _check_company_account(self, cr, uid, ids, context=None):
|
||||
for account in self.browse(cr, uid, ids, context=context):
|
||||
if account.parent_id:
|
||||
if account.company_id != account.parent_id.company_id:
|
||||
return False
|
||||
return True
|
||||
|
||||
_constraints = [
|
||||
(_check_recursion, 'Error!\nYou cannot create recursive accounts.', ['parent_id']),
|
||||
(_check_type, 'Configuration Error!\nYou cannot define children to an account with internal type different of "View".', ['type']),
|
||||
(_check_account_type, 'Configuration Error!\nYou cannot select an account type with a deferral method different of "Unreconciled" for accounts with internal type "Payable/Receivable".', ['user_type','type']),
|
||||
(_check_company_account, 'Error!\nYou cannot create an account which has parent account of different company.', ['parent_id']),
|
||||
]
|
||||
_sql_constraints = [
|
||||
('code_company_uniq', 'unique (code,company_id)', 'The code of the account must be unique per company !')
|
||||
|
|
|
@ -983,13 +983,13 @@ class account_invoice(osv.osv):
|
|||
for i in line:
|
||||
i[2]['period_id'] = period_id
|
||||
|
||||
ctx.update(invoice=inv)
|
||||
move_id = move_obj.create(cr, uid, move, context=ctx)
|
||||
new_move_name = move_obj.browse(cr, uid, move_id, context=ctx).name
|
||||
# make the invoice point to that move
|
||||
self.write(cr, uid, [inv.id], {'move_id': move_id,'period_id':period_id, 'move_name':new_move_name}, context=ctx)
|
||||
# Pass invoice in context in method post: used if you want to get the same
|
||||
# account move reference when creating the same invoice after a cancelled one:
|
||||
ctx.update({'invoice':inv})
|
||||
move_obj.post(cr, uid, [move_id], context=ctx)
|
||||
self._log_event(cr, uid, ids)
|
||||
return True
|
||||
|
|
|
@ -208,7 +208,7 @@ class account_move_line(osv.osv):
|
|||
if type(period_id) == str:
|
||||
ids = period_obj.search(cr, uid, [('name', 'ilike', period_id)])
|
||||
context.update({
|
||||
'period_id': ids[0]
|
||||
'period_id': ids and ids[0] or False
|
||||
})
|
||||
return context
|
||||
|
||||
|
@ -944,7 +944,7 @@ class account_move_line(osv.osv):
|
|||
|
||||
if lines and lines[0]:
|
||||
partner_id = lines[0].partner_id and lines[0].partner_id.id or False
|
||||
if not partner_obj.has_something_to_reconcile(cr, uid, partner_id, context=context):
|
||||
if partner_id and not partner_obj.has_something_to_reconcile(cr, uid, partner_id, context=context):
|
||||
partner_obj.mark_as_reconciled(cr, uid, [partner_id], context=context)
|
||||
return r_id
|
||||
|
||||
|
@ -1002,7 +1002,7 @@ class account_move_line(osv.osv):
|
|||
if context is None:
|
||||
context = {}
|
||||
result = super(account_move_line, self).fields_view_get(cr, uid, view_id, view_type, context=context, toolbar=toolbar, submenu=submenu)
|
||||
if view_type != 'tree':
|
||||
if (view_type != 'tree') or view_id:
|
||||
#Remove the toolbar from the form view
|
||||
if view_type == 'form':
|
||||
if result.get('toolbar', False):
|
||||
|
|
|
@ -41,13 +41,5 @@
|
|||
groups="group_account_user,group_account_manager"
|
||||
parent="account.menu_finance_generic_reporting" sequence="3"/>
|
||||
|
||||
<report id="account_account_balance_landscape"
|
||||
string="Account balance"
|
||||
model="account.account"
|
||||
name="account.account.balance.landscape"
|
||||
rml="account/report/account_balance_landscape.rml"
|
||||
auto="False"
|
||||
menu="False"/>
|
||||
|
||||
</data>
|
||||
</openerp>
|
||||
|
|
|
@ -306,7 +306,7 @@
|
|||
<field name="name">Unrealized Gain or Loss</field>
|
||||
<field name="model">account.account</field>
|
||||
<field name="arch" type="xml">
|
||||
<tree string="Unrealized Gains and losses">
|
||||
<tree string="Unrealized Gains and losses" create="false">
|
||||
<field name="code"/>
|
||||
<field name="name"/>
|
||||
<field name="parent_id" invisible="1"/>
|
||||
|
@ -2210,7 +2210,8 @@
|
|||
<field name="visible" />
|
||||
<field name="complete_tax_set" />
|
||||
</group>
|
||||
<field name="tax_template_ids" colspan="4" readonly="1" nolabel="1"/>
|
||||
<separator string="Default Taxes" colspan="4"/>
|
||||
<field name="tax_template_ids" colspan="4" nolabel="1"/>
|
||||
<separator string="Properties" colspan="4"/>
|
||||
<group col="4">
|
||||
<field name="property_account_receivable" domain="[('id', 'child_of', [account_root_id])]"/>
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
<field name="name">account.fiscal.position.form</field>
|
||||
<field name="model">account.fiscal.position</field>
|
||||
<field name="arch" type="xml">
|
||||
<form string="Fiscal Position">
|
||||
<form string="Fiscal Position" version="7.0">
|
||||
<group col="4">
|
||||
<field name="name"/>
|
||||
<field name="active"/>
|
||||
|
@ -114,7 +114,7 @@
|
|||
context="{'search_default_partner_id':[active_id], 'default_partner_id': active_id}"
|
||||
src_model="res.partner"
|
||||
view_type="form"
|
||||
view_mode="tree,form,calendar"/>
|
||||
view_mode="tree,form"/>
|
||||
|
||||
</data>
|
||||
</openerp>
|
||||
|
|
|
@ -170,12 +170,12 @@
|
|||
<tr>
|
||||
<td><para style="terp_tblheader_General_Centre">Chart of Accounts</para></td>
|
||||
<td><para style="terp_tblheader_General_Centre">Fiscal Year</para></td>
|
||||
<td><para style="terp_tblheader_General_Centre">Filter By [[ get_filter(data)!='No Filter' and get_filter(data) ]]</para></td>
|
||||
<td><para style="terp_tblheader_General_Centre">Filter By [[ get_filter(data)!='No Filters' and get_filter(data) ]]</para></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><para style="terp_default_Centre_8">[[ get_account(data) or removeParentNode('para') ]]</para></td>
|
||||
<td><para style="terp_default_Centre_8">[[ get_fiscalyear(data) or '' ]]</para></td>
|
||||
<td><para style="terp_default_Centre_8">[[ get_filter(data)=='No Filter' and get_filter(data) or removeParentNode('para') ]] </para>
|
||||
<td><para style="terp_default_Centre_8">[[ get_filter(data)=='No Filters' and get_filter(data) or removeParentNode('para') ]] </para>
|
||||
<blockTable colWidths="60.0,60.0" style="Table3">[[ get_filter(data)=='Date' or removeParentNode('blockTable') ]]
|
||||
<tr>
|
||||
<td><para style="terp_tblheader_General_Centre">Start Date</para></td>
|
||||
|
|
|
@ -299,10 +299,10 @@ class general_ledger(report_sxw.rml_parse, common_report_header):
|
|||
|
||||
def _get_sortby(self, data):
|
||||
if self.sortby == 'sort_date':
|
||||
return 'Date'
|
||||
return self._translate('Date')
|
||||
elif self.sortby == 'sort_journal_partner':
|
||||
return 'Journal & Partner'
|
||||
return 'Date'
|
||||
return self._translate('Journal & Partner')
|
||||
return self._translate('Date')
|
||||
|
||||
report_sxw.report_sxw('report.account.general.ledger', 'account.account', 'addons/account/report/account_general_ledger.rml', parser=general_ledger, header='internal')
|
||||
report_sxw.report_sxw('report.account.general.ledger_landscape', 'account.account', 'addons/account/report/account_general_ledger_landscape.rml', parser=general_ledger, header='internal landscape')
|
||||
|
|
|
@ -94,10 +94,10 @@ class common_report_header(object):
|
|||
def _get_filter(self, data):
|
||||
if data.get('form', False) and data['form'].get('filter', False):
|
||||
if data['form']['filter'] == 'filter_date':
|
||||
return 'Date'
|
||||
return self._translate('Date')
|
||||
elif data['form']['filter'] == 'filter_period':
|
||||
return 'Periods'
|
||||
return 'No Filter'
|
||||
return self._translate('Periods')
|
||||
return self._translate('No Filters')
|
||||
|
||||
def _sum_debit_period(self, period_id, journal_id=None):
|
||||
journals = journal_id or self.journal_ids
|
||||
|
|
|
@ -226,7 +226,7 @@ class account_fiscalyear_close(osv.osv_memory):
|
|||
for account in obj_acc_account.browse(cr, uid, account_ids, context={'fiscalyear': fy_id}):
|
||||
balance_in_currency = 0.0
|
||||
if account.currency_id:
|
||||
cr.execute('SELECT sum(amount_currency) as balance_in_currency FROM account_move_line ' \
|
||||
cr.execute('SELECT sum(COALESCE(amount_currency,0.0)) as balance_in_currency FROM account_move_line ' \
|
||||
'WHERE account_id = %s ' \
|
||||
'AND ' + query_line + ' ' \
|
||||
'AND currency_id = %s', (account.id, account.currency_id.id))
|
||||
|
|
|
@ -119,7 +119,11 @@ class account_common_report(osv.osv_memory):
|
|||
|
||||
def _get_fiscalyear(self, cr, uid, context=None):
|
||||
now = time.strftime('%Y-%m-%d')
|
||||
fiscalyears = self.pool.get('account.fiscalyear').search(cr, uid, [('date_start', '<', now), ('date_stop', '>', now)], limit=1 )
|
||||
company_id = None
|
||||
ids = context.get('active_ids', [])
|
||||
for wiz in self.browse(cr, uid, ids, context=context):
|
||||
company_id = wiz.company_id
|
||||
fiscalyears = self.pool.get('account.fiscalyear').search(cr, uid, [('date_start', '<', now), ('date_stop', '>', now), ('company_id', '=', company_id)], limit=1 )
|
||||
return fiscalyears and fiscalyears[0] or False
|
||||
|
||||
def _get_all_journal(self, cr, uid, context=None):
|
||||
|
|
|
@ -21,17 +21,17 @@
|
|||
<field name="inherit_id" ref="account.view_move_form"/>
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr="/form/sheet/notebook/page/field[@name='line_id']/tree/field[@name='analytic_account_id']" position="replace">
|
||||
<field name="analytics_id" context="{'journal_id':journal_id}" groups="analytic.group_analytic_accounting"/>
|
||||
<field name="analytics_id" context="{'journal_id':parent.journal_id}" groups="analytic.group_analytic_accounting"/>
|
||||
</xpath>
|
||||
<xpath expr="/form/sheet/notebook/page/field[@name='line_id']/form/notebook/page/group/group/field[@name='analytic_account_id']" position="replace">
|
||||
<field name="analytics_id" context="{'journal_id':journal_id}" groups="analytic.group_analytic_accounting"/>
|
||||
<field name="analytics_id" context="{'journal_id':parent.journal_id}" groups="analytic.group_analytic_accounting"/>
|
||||
</xpath>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="journal_col11" model="account.journal.column">
|
||||
<field eval=""""Analytic Distribution"""" name="name"/>
|
||||
<field eval="11" name="sequence"/>
|
||||
<field eval="15" name="sequence"/>
|
||||
<field name="view_id" ref="account.account_journal_view"/>
|
||||
<field eval="0" name="required"/>
|
||||
<field eval=""""analytics_id"""" name="field"/>
|
||||
|
|
|
@ -40,7 +40,7 @@ class account_invoice_line(osv.osv):
|
|||
|
||||
if inv.type in ('out_invoice','out_refund'):
|
||||
for i_line in inv.invoice_line:
|
||||
if i_line.product_id:
|
||||
if i_line.product_id and i_line.product_id.valuation == 'real_time':
|
||||
if inv.type == 'out_invoice':
|
||||
# debit account dacc will be the output account
|
||||
# first check the product, if empty check the category
|
||||
|
@ -87,7 +87,7 @@ class account_invoice_line(osv.osv):
|
|||
})
|
||||
elif inv.type in ('in_invoice','in_refund'):
|
||||
for i_line in inv.invoice_line:
|
||||
if i_line.product_id:
|
||||
if i_line.product_id and i_line.product_id.valuation == 'real_time':
|
||||
if i_line.product_id.type != 'service':
|
||||
# get the price difference account at the product
|
||||
acc = i_line.product_id.property_account_creditor_price_difference and i_line.product_id.property_account_creditor_price_difference.id
|
||||
|
|
|
@ -8,14 +8,14 @@ msgstr ""
|
|||
"Project-Id-Version: openobject-addons\n"
|
||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"POT-Creation-Date: 2012-02-08 00:35+0000\n"
|
||||
"PO-Revision-Date: 2012-02-09 19:28+0000\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"PO-Revision-Date: 2012-11-09 12:09+0000\n"
|
||||
"Last-Translator: Pedro Manuel Baeza <pedro.baeza@gmail.com>\n"
|
||||
"Language-Team: Spanish <es@li.org>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-30 05:36+0000\n"
|
||||
"X-Generator: Launchpad (build 16206)\n"
|
||||
"X-Launchpad-Export-Date: 2012-11-10 04:59+0000\n"
|
||||
"X-Generator: Launchpad (build 16251)\n"
|
||||
|
||||
#. module: account_check_writing
|
||||
#: selection:res.company,check_layout:0
|
||||
|
@ -154,7 +154,7 @@ msgstr "Compañías"
|
|||
#. module: account_check_writing
|
||||
#: view:res.company:0
|
||||
msgid "Default Check Layout"
|
||||
msgstr ""
|
||||
msgstr "Comprobar formato por defecto"
|
||||
|
||||
#. module: account_check_writing
|
||||
#: constraint:account.journal:0
|
||||
|
|
|
@ -43,6 +43,18 @@
|
|||
<field eval="True" name="required"/>
|
||||
<field eval="2" name="sequence"/>
|
||||
</record>
|
||||
<record id="sequence_journal" model="ir.sequence.type">
|
||||
<field name="name">Account Journal</field>
|
||||
<field name="code">account.journal</field>
|
||||
</record>
|
||||
|
||||
<record id="sequence_journal_seq" model="ir.sequence">
|
||||
<field name="name">Account journal sequence</field>
|
||||
<field name="code">account.journal</field>
|
||||
<field name="prefix">AJ</field>
|
||||
<field eval="1" name="number_next"/>
|
||||
<field eval="1" name="number_increment"/>
|
||||
</record>
|
||||
</data>
|
||||
|
||||
</openerp>
|
||||
|
|
|
@ -953,6 +953,9 @@ class account_voucher(osv.osv):
|
|||
if voucher_brw.number:
|
||||
name = voucher_brw.number
|
||||
elif voucher_brw.journal_id.sequence_id:
|
||||
if not voucher_brw.journal_id.sequence_id.active:
|
||||
raise osv.except_osv(_('Configuration Error !'),
|
||||
_('Please activate the sequence of selected journal !'))
|
||||
name = seq_obj.next_by_id(cr, uid, voucher_brw.journal_id.sequence_id.id, context=context)
|
||||
else:
|
||||
raise osv.except_osv(_('Error!'),
|
||||
|
|
|
@ -54,6 +54,8 @@
|
|||
<form string="Bill Payment" version="7.0">
|
||||
<group col="6">
|
||||
<field name="partner_id" required="1" on_change="onchange_partner_id(partner_id, journal_id, amount, currency_id, type, date, context)" string="Supplier" context="{'default_customer': 0, 'search_default_supplier': 1, 'default_supplier': 1, 'invoice_currency': currency_id}"/>
|
||||
<field name="state" invisible="1"/>
|
||||
<field name="company_id" invisible="1"/>
|
||||
<field name="amount" on_change="onchange_amount(amount, payment_rate, partner_id, journal_id, currency_id, type, date, payment_rate_currency_id, company_id, context)"/>
|
||||
<field name="journal_id"
|
||||
domain="[('type','in',['bank', 'cash'])]"
|
||||
|
|
|
@ -50,7 +50,7 @@
|
|||
<field name="res_model">account.voucher</field>
|
||||
<field name="view_type">form</field>
|
||||
<field name="domain">[('journal_id.type', 'in', ['bank', 'cash']), ('type','=','receipt'), ('partner_id','=',partner_id)]</field>
|
||||
<field name="context">{'type':'receipt', 'partner_id': partner_id, 'default_reference':reference}</field>
|
||||
<field name="context">{'default_type':'receipt', 'type':'receipt', 'partner_id': partner_id, 'default_reference':reference}</field>
|
||||
<field name="view_id" ref="view_vendor_receipt_form"/>
|
||||
<field name="target">current</field>
|
||||
</record>
|
||||
|
|
|
@ -98,6 +98,10 @@ class account_analytic_account(osv.osv):
|
|||
|
||||
def name_get(self, cr, uid, ids, context=None):
|
||||
res = []
|
||||
if not ids:
|
||||
return res
|
||||
if isinstance(ids, (int, long)):
|
||||
ids = [ids]
|
||||
for id in ids:
|
||||
elmt = self.browse(cr, uid, id, context=context)
|
||||
res.append((id, self._get_one_full_name(elmt)))
|
||||
|
|
|
@ -388,6 +388,8 @@ class audittrail_objects_proxy(object_proxy):
|
|||
}
|
||||
# loop on all the fields
|
||||
for field_name, field_definition in pool.get(model.model)._all_columns.items():
|
||||
if field_name in ('__last_update', 'id'):
|
||||
continue
|
||||
#if the field_list param is given, skip all the fields not in that list
|
||||
if field_list and field_name not in field_list:
|
||||
continue
|
||||
|
|
|
@ -99,7 +99,7 @@
|
|||
<field name="res_id" readonly="1"/>
|
||||
<field name="object_id" readonly="1"/>
|
||||
</group>
|
||||
<field name="line_ids" mode="tree,form"
|
||||
<field name="line_ids" mode="tree"
|
||||
widget="one2many_list" readonly="1">
|
||||
<form string="Log Lines" version="7.0">
|
||||
<group col="4">
|
||||
|
|
|
@ -3,7 +3,7 @@ openerp.auth_anonymous = function(instance) {
|
|||
instance.web.Login.include({
|
||||
start: function() {
|
||||
var self = this;
|
||||
return $.when(this._super()).pipe(function() {
|
||||
return $.when(this._super()).then(function() {
|
||||
var dblist = self._db_list || [];
|
||||
if (!self.session.session_is_valid() && dblist.length === 1) {
|
||||
self.remember_credentials = false;
|
||||
|
|
|
@ -12,7 +12,7 @@ openerp.auth_oauth = function(instance) {
|
|||
} else if(this.params.oauth_error === 2) {
|
||||
this.do_warn("Authentication error","");
|
||||
}
|
||||
return d.then(this.do_oauth_load).fail(function() {
|
||||
return d.done(this.do_oauth_load).fail(function() {
|
||||
self.do_oauth_load([]);
|
||||
});
|
||||
},
|
||||
|
@ -23,7 +23,7 @@ openerp.auth_oauth = function(instance) {
|
|||
do_oauth_load: function() {
|
||||
var db = this.$("form [name=db]").val();
|
||||
if (db) {
|
||||
this.rpc("/auth_oauth/list_providers", { dbname: db }).then(this.on_oauth_loaded);
|
||||
this.rpc("/auth_oauth/list_providers", { dbname: db }).done(this.on_oauth_loaded);
|
||||
}
|
||||
},
|
||||
on_oauth_loaded: function(result) {
|
||||
|
|
|
@ -69,7 +69,7 @@ instance.web.Login = instance.web.Login.extend({
|
|||
_check_error: function() {
|
||||
var self = this;
|
||||
if (this.params.loginerror !== undefined) {
|
||||
this.rpc('/auth_openid/login/status', {}).then(function(result) {
|
||||
this.rpc('/auth_openid/login/status', {}).done(function(result) {
|
||||
if (_.contains(['success', 'failure'], result.status) && result.message) {
|
||||
self.do_warn('Invalid OpenID Login', result.message);
|
||||
}
|
||||
|
@ -106,7 +106,7 @@ instance.web.Login = instance.web.Login.extend({
|
|||
|
||||
do_openid_login: function(db, openid_url) {
|
||||
var self = this;
|
||||
this.rpc('/auth_openid/login/verify', {'db': db, 'url': openid_url}).then(function(result) {
|
||||
this.rpc('/auth_openid/login/verify', {'db': db, 'url': openid_url}).done(function(result) {
|
||||
if (result.error) {
|
||||
self.do_warn(result.title, result.error);
|
||||
return;
|
||||
|
|
|
@ -16,10 +16,10 @@
|
|||
<group col="4">
|
||||
<field name="name"/>
|
||||
<field name="model_id"/>
|
||||
<field name="model" invisible="1"/>
|
||||
<field name="filter_id" domain="[('model_id','=',model)]" context="{'default_model_id': model}"/>
|
||||
<field name="sequence"/>
|
||||
<field name="active"/>
|
||||
<field name="model" invisible="1"/>
|
||||
</group>
|
||||
<notebook>
|
||||
<page string="Conditions">
|
||||
|
|
|
@ -8,15 +8,14 @@ msgstr ""
|
|||
"Project-Id-Version: openobject-addons\n"
|
||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"POT-Creation-Date: 2012-02-08 00:36+0000\n"
|
||||
"PO-Revision-Date: 2012-05-10 17:24+0000\n"
|
||||
"Last-Translator: Jordi Esteve (www.zikzakmedia.com) "
|
||||
"<jesteve@zikzakmedia.com>\n"
|
||||
"PO-Revision-Date: 2012-11-09 12:09+0000\n"
|
||||
"Last-Translator: Pedro Manuel Baeza <pedro.baeza@gmail.com>\n"
|
||||
"Language-Team: Spanish <es@li.org>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-30 05:32+0000\n"
|
||||
"X-Generator: Launchpad (build 16206)\n"
|
||||
"X-Launchpad-Export-Date: 2012-11-10 04:59+0000\n"
|
||||
"X-Generator: Launchpad (build 16251)\n"
|
||||
|
||||
#. module: base_action_rule
|
||||
#: help:base.action.rule,act_mail_to_user:0
|
||||
|
@ -340,7 +339,7 @@ msgstr "Activo"
|
|||
#: code:addons/base_action_rule/base_action_rule.py:329
|
||||
#, python-format
|
||||
msgid "No Email ID Found for your Company address!"
|
||||
msgstr ""
|
||||
msgstr "¡No se ha encontrado Id del e-mail para la dirección de su compañía!"
|
||||
|
||||
#. module: base_action_rule
|
||||
#: field:base.action.rule,act_remind_user:0
|
||||
|
|
|
@ -139,7 +139,7 @@ openerp.base_import = function (instance) {
|
|||
this._super(),
|
||||
this.Import.call('create', [{
|
||||
'res_model': this.res_model
|
||||
}]).then(function (id) {
|
||||
}]).done(function (id) {
|
||||
self.id = id;
|
||||
self.$('input[name=import_id]').val(id);
|
||||
})
|
||||
|
@ -200,7 +200,7 @@ openerp.base_import = function (instance) {
|
|||
!this.$('input.oe_import_has_header').prop('checked'));
|
||||
this.Import.call(
|
||||
'parse_preview', [this.id, this.import_options()])
|
||||
.then(function (result) {
|
||||
.done(function (result) {
|
||||
var signal = result.error ? 'preview_failed' : 'preview_succeeded';
|
||||
self[signal](result);
|
||||
});
|
||||
|
@ -341,11 +341,11 @@ openerp.base_import = function (instance) {
|
|||
},
|
||||
onvalidate: function () {
|
||||
return this.call_import({ dryrun: true })
|
||||
.then(this.proxy('validated'));
|
||||
.done(this.proxy('validated'));
|
||||
},
|
||||
onimport: function () {
|
||||
var self = this;
|
||||
return this.call_import({ dryrun: false }).then(function (message) {
|
||||
return this.call_import({ dryrun: false }).done(function (message) {
|
||||
if (!_.any(message, function (message) {
|
||||
return message.type === 'error' })) {
|
||||
self['import_succeeded']();
|
||||
|
|
|
@ -60,14 +60,14 @@ class sale_config_settings(osv.osv_memory):
|
|||
'module_web_linkedin': fields.boolean('Get contacts automatically from linkedIn',
|
||||
help="""When you create a new contact (person or company), you will be able to load all the data from LinkedIn (photos, address, etc)."""),
|
||||
'module_crm': fields.boolean('CRM'),
|
||||
'module_plugin_thunderbird': fields.boolean('Enable Thunderbird plugin',
|
||||
'module_plugin_thunderbird': fields.boolean('Enable Thunderbird plug-in',
|
||||
help="""The plugin allows you archive email and its attachments to the selected
|
||||
OpenERP objects. You can select a partner, or a lead and
|
||||
attach the selected mail as a .eml file in
|
||||
the attachment of a selected record. You can create documents for CRM Lead,
|
||||
Partner from the selected emails.
|
||||
This installs the module plugin_thunderbird."""),
|
||||
'module_plugin_outlook': fields.boolean('Enable Outlook plugin',
|
||||
'module_plugin_outlook': fields.boolean('Enable Outlook plug-in',
|
||||
help="""The Outlook plugin allows you to select an object that you would like to add
|
||||
to your email and its attachments from MS Outlook. You can select a partner,
|
||||
or a lead object and archive a selected
|
||||
|
|
|
@ -46,7 +46,7 @@ instance.web.form.DashBoard = instance.web.form.FormWidget.extend({
|
|||
delete(action.attrs.colspan);
|
||||
var action_id = _.str.toNumber(action.attrs.name);
|
||||
if (!_.isNaN(action_id)) {
|
||||
self.rpc('/web/action/load', {action_id: action_id}).then(function(result) {
|
||||
self.rpc('/web/action/load', {action_id: action_id}).done(function(result) {
|
||||
self.on_load_action(result, column_index + '_' + action_index, action.attrs);
|
||||
});
|
||||
}
|
||||
|
@ -81,7 +81,7 @@ instance.web.form.DashBoard = instance.web.form.FormWidget.extend({
|
|||
this.rpc('/web/view/undo_custom', {
|
||||
view_id: this.view.fields_view.view_id,
|
||||
reset: true
|
||||
}).then(this.do_reload);
|
||||
}).done(this.do_reload);
|
||||
},
|
||||
on_change_layout: function() {
|
||||
var self = this;
|
||||
|
@ -242,7 +242,7 @@ instance.web.form.DashBoard = instance.web.form.FormWidget.extend({
|
|||
};
|
||||
var list = am.inner_widget.views.list;
|
||||
if (list) {
|
||||
list.deferred.then(function() {
|
||||
list.deferred.done(function() {
|
||||
$(list.controller.groups).off('row_link').on('row_link', function(e, id) {
|
||||
new_form_action(id);
|
||||
});
|
||||
|
@ -250,7 +250,7 @@ instance.web.form.DashBoard = instance.web.form.FormWidget.extend({
|
|||
}
|
||||
var kanban = am.inner_widget.views.kanban;
|
||||
if (kanban) {
|
||||
kanban.deferred.then(function() {
|
||||
kanban.deferred.done(function() {
|
||||
kanban.controller.open_record = function(id, editable) {
|
||||
new_form_action(id, editable);
|
||||
};
|
||||
|
@ -335,7 +335,7 @@ instance.board.AddToDashboard = instance.web.search.Input.extend({
|
|||
e.preventDefault();
|
||||
self.add_dashboard();
|
||||
});
|
||||
return this.load_data().then(this.proxy("render_data"));
|
||||
return this.load_data().done(this.proxy("render_data"));
|
||||
},
|
||||
load_data:function(){
|
||||
var board = new instance.web.Model('board.board');
|
||||
|
@ -347,7 +347,7 @@ instance.board.AddToDashboard = instance.web.search.Input.extend({
|
|||
return new instance.web.Model('ir.model.data')
|
||||
.query(['res_id'])
|
||||
.filter([['name','=','menu_reporting_dashboard']])
|
||||
.first().pipe(function (result) {
|
||||
.first().then(function (result) {
|
||||
var menu = _(dashboard_menu).chain()
|
||||
.pluck('children')
|
||||
.flatten(true)
|
||||
|
@ -382,7 +382,7 @@ instance.board.AddToDashboard = instance.web.search.Input.extend({
|
|||
domain: domain,
|
||||
view_mode: view_parent.active_view,
|
||||
name: this.$el.find("input").val()
|
||||
}).then(function(r) {
|
||||
}).done(function(r) {
|
||||
if (r === false) {
|
||||
self.do_warn("Could not add filter to dashboard");
|
||||
} else {
|
||||
|
|
|
@ -56,6 +56,7 @@ added to partners that match the segmentation criterions after computation.'),
|
|||
@param uid: the current user’s ID for security checks,
|
||||
@param ids: List of Process continue’s IDs"""
|
||||
|
||||
partner_obj = self.pool.get('res.partner')
|
||||
categs = self.read(cr, uid, ids, ['categ_id', 'exclusif', 'partner_id',\
|
||||
'sales_purchase_active', 'profiling_active'])
|
||||
for categ in categs:
|
||||
|
@ -80,9 +81,11 @@ added to partners that match the segmentation criterions after computation.'),
|
|||
for pid in to_remove_list:
|
||||
partners.remove(pid)
|
||||
|
||||
for partner_id in partners:
|
||||
cr.execute('insert into res_partner_res_partner_category_rel (category_id,partner_id) \
|
||||
values (%s,%s)', (categ['categ_id'][0], partner_id))
|
||||
for partner in partner_obj.browse(cr, uid, partners):
|
||||
category_ids = [categ_id.id for categ_id in partner.category_id]
|
||||
if categ['categ_id'][0] not in category_ids:
|
||||
cr.execute('insert into res_partner_res_partner_category_rel (category_id,partner_id) \
|
||||
values (%s,%s)', (categ['categ_id'][0], partner.id))
|
||||
|
||||
self.write(cr, uid, [id], {'state':'not running', 'partner_id':0})
|
||||
return True
|
||||
|
|
|
@ -26,7 +26,7 @@
|
|||
<menuitem id="base.next_id_64" name="Sales"
|
||||
parent="base.menu_reporting" sequence="1" />
|
||||
|
||||
<menuitem id="base.menu_sales_configuration_misc" name="Miscellaneous" parent="base.menu_base_config" sequence="75"/>
|
||||
<menuitem id="base.menu_sales_configuration_misc" name="Miscellaneous" parent="base.menu_base_config" sequence="81"/>
|
||||
|
||||
|
||||
<!-- crm.case.channel -->
|
||||
|
|
|
@ -7,14 +7,14 @@ msgstr ""
|
|||
"Project-Id-Version: OpenERP Server 6.0dev\n"
|
||||
"Report-Msgid-Bugs-To: support@openerp.com\n"
|
||||
"POT-Creation-Date: 2012-02-08 01:37+0100\n"
|
||||
"PO-Revision-Date: 2012-02-10 17:48+0000\n"
|
||||
"Last-Translator: Carlos Ch. <Unknown>\n"
|
||||
"PO-Revision-Date: 2012-11-09 12:10+0000\n"
|
||||
"Last-Translator: Pedro Manuel Baeza <pedro.baeza@gmail.com>\n"
|
||||
"Language-Team: \n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-30 04:57+0000\n"
|
||||
"X-Generator: Launchpad (build 16206)\n"
|
||||
"X-Launchpad-Export-Date: 2012-11-10 04:59+0000\n"
|
||||
"X-Generator: Launchpad (build 16251)\n"
|
||||
|
||||
#. module: crm
|
||||
#: view:crm.lead.report:0
|
||||
|
@ -172,7 +172,7 @@ msgstr "Mes esperado de cierre"
|
|||
#. module: crm
|
||||
#: view:crm.lead2opportunity.partner.mass:0
|
||||
msgid "Assigned Opportunities to"
|
||||
msgstr ""
|
||||
msgstr "Oportunidades asignadas a"
|
||||
|
||||
#. module: crm
|
||||
#: view:crm.lead:0 field:crm.lead,partner_id:0 view:crm.lead.report:0
|
||||
|
@ -598,7 +598,7 @@ msgstr "Fecha de fin"
|
|||
#. module: crm
|
||||
#: view:crm.opportunity2phonecall:0 view:crm.phonecall2phonecall:0
|
||||
msgid "Schedule/Log a Call"
|
||||
msgstr ""
|
||||
msgstr "Planificar/Registrar una llamada"
|
||||
|
||||
#. module: crm
|
||||
#: constraint:base.action.rule:0
|
||||
|
@ -792,7 +792,7 @@ msgstr "Siguiente"
|
|||
#. module: crm
|
||||
#: field:crm.segmentation,som_interval:0
|
||||
msgid "Days per Period"
|
||||
msgstr ""
|
||||
msgstr "Días por periodo"
|
||||
|
||||
#. module: crm
|
||||
#: field:crm.meeting,byday:0
|
||||
|
@ -959,7 +959,7 @@ msgstr "Días para abrir"
|
|||
#. module: crm
|
||||
#: view:crm.meeting:0
|
||||
msgid "Show Time as"
|
||||
msgstr ""
|
||||
msgstr "Mostrar hora como"
|
||||
|
||||
#. module: crm
|
||||
#: view:crm.phonecall2partner:0
|
||||
|
@ -1342,7 +1342,7 @@ msgstr "Fecha escritura"
|
|||
#. module: crm
|
||||
#: view:crm.meeting:0
|
||||
msgid "End of Recurrency"
|
||||
msgstr ""
|
||||
msgstr "Fin de recurrencia"
|
||||
|
||||
#. module: crm
|
||||
#: view:crm.meeting:0
|
||||
|
@ -1392,6 +1392,12 @@ msgid ""
|
|||
" \n"
|
||||
"If the call needs to be done then the state is set to 'Not Held'."
|
||||
msgstr ""
|
||||
"El estado se establece a 'Para hacer' cuando se crea el caso.\n"
|
||||
"Si es caso está en marcha, el estado se establece a 'Abierto.\n"
|
||||
"Cuando la llamada se termina, el estado se establece en 'Realizada'. "
|
||||
" \n"
|
||||
"Si la llamada está pendiente de ser realizada, entonces el estado se "
|
||||
"establece en 'Pendiente'."
|
||||
|
||||
#. module: crm
|
||||
#: selection:crm.meeting,week_list:0
|
||||
|
@ -1449,7 +1455,7 @@ msgstr "Oportunidades por categorías"
|
|||
#. module: crm
|
||||
#: model:crm.case.section,name:crm.section_sales_marketing_department
|
||||
msgid "Sales Marketing Department"
|
||||
msgstr ""
|
||||
msgstr "Departamento de ventas y marketing"
|
||||
|
||||
#. module: crm
|
||||
#: view:crm.phonecall.report:0
|
||||
|
@ -1900,7 +1906,7 @@ msgstr "Responder a"
|
|||
#. module: crm
|
||||
#: view:crm.case.section:0
|
||||
msgid "Select Stages for this Sales Team"
|
||||
msgstr ""
|
||||
msgstr "Seleccione etapas para este equipo de ventas"
|
||||
|
||||
#. module: crm
|
||||
#: view:board.board:0
|
||||
|
@ -2015,7 +2021,7 @@ msgstr "Ubicación"
|
|||
#. module: crm
|
||||
#: model:ir.model,name:crm.model_crm_lead2opportunity_partner_mass
|
||||
msgid "Mass Lead To Opportunity Partner"
|
||||
msgstr ""
|
||||
msgstr "Transformación masiva de iniciativa a oportunidad"
|
||||
|
||||
#. module: crm
|
||||
#: view:crm.lead:0
|
||||
|
@ -2777,7 +2783,7 @@ msgstr "e-mail del contacto"
|
|||
#. module: crm
|
||||
#: field:crm.lead,referred:0
|
||||
msgid "Referred by"
|
||||
msgstr ""
|
||||
msgstr "Referido por"
|
||||
|
||||
#. module: crm
|
||||
#: view:crm.lead:0 model:ir.model,name:crm.model_crm_add_note
|
||||
|
@ -3541,7 +3547,7 @@ msgstr "Nuevas oportunidades"
|
|||
#: code:addons/crm/crm_action_rule.py:61
|
||||
#, python-format
|
||||
msgid "No E-Mail Found for your Company address!"
|
||||
msgstr ""
|
||||
msgstr "No se encontró dirección de e-mail para el contacto de su compañía"
|
||||
|
||||
#. module: crm
|
||||
#: field:crm.lead.report,email:0
|
||||
|
@ -3561,7 +3567,7 @@ msgstr "Oportunidades por usuario y equipo"
|
|||
#. module: crm
|
||||
#: view:crm.phonecall:0
|
||||
msgid "Reset to Todo"
|
||||
msgstr ""
|
||||
msgstr "Cambiar a 'Para hacer'"
|
||||
|
||||
#. module: crm
|
||||
#: field:crm.case.section,working_hours:0
|
||||
|
@ -3643,6 +3649,10 @@ msgid ""
|
|||
"partner. From the phone call form, you can trigger a request for another "
|
||||
"call, a meeting or an opportunity."
|
||||
msgstr ""
|
||||
"Esta herramienta permite registrar sus llamadas entrantes sobre la marcha. "
|
||||
"Cada llamada que recibe aparecerá en el formulario de la empresa para trazar "
|
||||
"cada contacto que tiene con una empresa. Desde el formulario de llamadas, "
|
||||
"puede lanzar una petición para otra llamada, una reunión u oportunidad."
|
||||
|
||||
#. module: crm
|
||||
#: selection:crm.lead.report,creation_month:0
|
||||
|
@ -3673,6 +3683,10 @@ msgid ""
|
|||
"channels that will be maintained at the creation of a document in the "
|
||||
"system. Some examples of channels can be: Website, Phone Call, Reseller, etc."
|
||||
msgstr ""
|
||||
"Controle el origen de sus iniciativas y oportunidades de venta mediante la "
|
||||
"creación de canales específicos que se usarán en la creación de documentos "
|
||||
"en el sistema. Algunos ejemplos de canales son: Sitio web, llamada "
|
||||
"telefónica, distribuidores, ..."
|
||||
|
||||
#. module: crm
|
||||
#: selection:crm.lead2opportunity.partner,name:0
|
||||
|
@ -3740,7 +3754,7 @@ msgstr "Año"
|
|||
#. module: crm
|
||||
#: constraint:res.partner:0
|
||||
msgid "Error ! You cannot create recursive associated members."
|
||||
msgstr ""
|
||||
msgstr "¡Error! No puede crear miembros asociados recursivamente."
|
||||
|
||||
#. module: crm
|
||||
#: model:crm.case.resource.type,name:crm.type_lead8
|
||||
|
|
|
@ -91,7 +91,7 @@
|
|||
<field name="res_model">crm.phonecall.report</field>
|
||||
<field name="view_type">form</field>
|
||||
<field name="view_mode">tree,graph</field>
|
||||
<field name="context">{"search_default_year":1,"search_default_User":1,"search_default_This Month":1,'group_by_no_leaf':1,'group_by':[]}</field>
|
||||
<field name="context">{"search_default_year":1,"search_default_Salesperson":1,"search_default_This Month":1,'group_by_no_leaf':1,'group_by':[]}</field>
|
||||
<field name="view_id" ref="view_report_crm_phonecall_tree"/>
|
||||
<field name="search_view_id" ref="view_report_crm_phonecall_filter"/>
|
||||
<field name="help">From this report, you can analyse the performance of your sales team, based on their phone calls. You can group or filter the information according to several criteria and drill down the information, by adding more groups in the report.</field>
|
||||
|
|
|
@ -105,7 +105,7 @@ class crm_claim(base_stage, osv.osv):
|
|||
'email_from': fields.char('Email', size=128, help="Destination email for email gateway."),
|
||||
'partner_phone': fields.char('Phone', size=32),
|
||||
'stage_id': fields.many2one ('crm.claim.stage', 'Stage',
|
||||
domain="['|', ('section_ids', '=', section_id), ('case_default', '=', True)]"),
|
||||
domain="['&',('fold', '=', False),'|', ('section_ids', '=', section_id), ('case_default', '=', True)]"),
|
||||
'cause': fields.text('Root Cause'),
|
||||
'state': fields.related('stage_id', 'state', type="selection", store=True,
|
||||
selection=crm.AVAILABLE_STATES, string="Status", readonly=True,
|
||||
|
|
|
@ -43,38 +43,32 @@
|
|||
-->
|
||||
|
||||
<record model="crm.claim.stage" id="stage_claim1">
|
||||
<field name="name">Draft claim</field>
|
||||
<field name="name">New</field>
|
||||
<field name="state">draft</field>
|
||||
<field name="sequence">26</field>
|
||||
<field name="case_default" eval="True"/>
|
||||
</record>
|
||||
<record model="crm.claim.stage" id="stage_claim5">
|
||||
<field name="name">Actions Defined</field>
|
||||
<field name="name">In Progress</field>
|
||||
<field name="state">open</field>
|
||||
<field name="sequence">27</field>
|
||||
<field name="case_default" eval="True"/>
|
||||
</record>
|
||||
<record model="crm.claim.stage" id="stage_claim2">
|
||||
<field name="name">Actions Done</field>
|
||||
<field name="name">Settled</field>
|
||||
<field name="state">done</field>
|
||||
<field name="sequence">28</field>
|
||||
<field name="case_default" eval="True"/>
|
||||
</record>
|
||||
<record model="crm.claim.stage" id="stage_claim3">
|
||||
<field name="name">Refused</field>
|
||||
<field name="state">done</field>
|
||||
<field name="name">Rejected</field>
|
||||
<field name="state">cancel</field>
|
||||
<field name="sequence">29</field>
|
||||
<field name="case_default" eval="True"/>
|
||||
<field name="case_refused" eval="True"/>
|
||||
<field name="fold" eval="True"/>
|
||||
</record>
|
||||
<record model="crm.claim.stage" id="stage_claim3">
|
||||
<field name="name">Cancelled</field>
|
||||
<field name="state">cancel</field>
|
||||
<field name="sequence">30</field>
|
||||
<field name="case_default" eval="True"/>
|
||||
<field name="fold" eval="True"/>
|
||||
</record>
|
||||
|
||||
|
||||
</data>
|
||||
</openerp>
|
||||
|
|
|
@ -52,7 +52,7 @@
|
|||
<!-- Claim Stages -->
|
||||
<menuitem id="base.menu_definitions" name="Configuration" parent="base.menu_main_pm" sequence="60"/>
|
||||
<menuitem id="base.menu_project_config_project" name="Stages" parent="base.menu_definitions" sequence="1"/>
|
||||
<menuitem id="menu_claim_stage_view" name="Claim Stages" action="crm_claim_stage_act" parent="base.menu_project_config_project" sequence="20"/>
|
||||
<menuitem id="menu_claim_stage_view" name="Stages" action="crm_claim_stage_act" parent="menu_config_claim" sequence="20"/>
|
||||
|
||||
</data>
|
||||
</openerp>
|
||||
|
|
|
@ -102,16 +102,11 @@
|
|||
<field name="arch" type="xml">
|
||||
<form string="Claim" version="7.0">
|
||||
<header>
|
||||
<button name="case_open" string="Open" type="object" class="oe_highlight"
|
||||
states="draft,pending" groups="base.group_user"/>
|
||||
<button name="case_close" string="Done" type="object" class="oe_highlight"
|
||||
states="open,pending" groups="base.group_user"/>
|
||||
<button name="case_reset" string="Reset to Draft" type="object" groups="base.group_user"
|
||||
states="cancel,done"/>
|
||||
<button name="case_cancel" string="Cancel" type="object" groups="base.group_user"
|
||||
<button name="case_close" string="Settle" type="object" class="oe_highlight"
|
||||
states="draft,open,pending" groups="base.group_user"/>
|
||||
<button name="case_cancel" string="Reject" type="object" groups="base.group_user"
|
||||
states="draft,open,pending"/>
|
||||
<field name="stage_id" widget="statusbar"
|
||||
on_change="onchange_stage_id(stage_id)"/>
|
||||
<field name="stage_id" widget="statusbar" clickable="True"/>
|
||||
</header>
|
||||
<sheet string="Claims">
|
||||
<group>
|
||||
|
|
|
@ -8,14 +8,14 @@ msgstr ""
|
|||
"Project-Id-Version: openobject-addons\n"
|
||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"POT-Creation-Date: 2012-02-08 00:36+0000\n"
|
||||
"PO-Revision-Date: 2011-01-16 17:13+0000\n"
|
||||
"Last-Translator: mgaja (GrupoIsep.com) <Unknown>\n"
|
||||
"PO-Revision-Date: 2012-11-09 12:10+0000\n"
|
||||
"Last-Translator: Pedro Manuel Baeza <pedro.baeza@gmail.com>\n"
|
||||
"Language-Team: Spanish <es@li.org>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-30 05:33+0000\n"
|
||||
"X-Generator: Launchpad (build 16206)\n"
|
||||
"X-Launchpad-Export-Date: 2012-11-10 04:59+0000\n"
|
||||
"X-Generator: Launchpad (build 16251)\n"
|
||||
|
||||
#. module: crm_partner_assign
|
||||
#: field:crm.lead.forward.to.partner,send_to:0
|
||||
|
@ -25,12 +25,12 @@ msgstr "Enviar a"
|
|||
#. module: crm_partner_assign
|
||||
#: field:crm.lead.forward.to.partner,subtype:0
|
||||
msgid "Message type"
|
||||
msgstr ""
|
||||
msgstr "Tipo de mensaje"
|
||||
|
||||
#. module: crm_partner_assign
|
||||
#: help:crm.lead.forward.to.partner,auto_delete:0
|
||||
msgid "Permanently delete emails after sending"
|
||||
msgstr ""
|
||||
msgstr "Eliminar permanentemente los emails depués de su envío"
|
||||
|
||||
#. module: crm_partner_assign
|
||||
#: field:crm.lead.report.assign,delay_close:0
|
||||
|
@ -40,7 +40,7 @@ msgstr "Retraso para cerrar"
|
|||
#. module: crm_partner_assign
|
||||
#: help:crm.lead.forward.to.partner,email_to:0
|
||||
msgid "Message recipients"
|
||||
msgstr ""
|
||||
msgstr "Destinatarios del mensaje"
|
||||
|
||||
#. module: crm_partner_assign
|
||||
#: field:crm.lead.report.assign,planned_revenue:0
|
||||
|
@ -61,7 +61,7 @@ msgstr "Agrupar por..."
|
|||
#. module: crm_partner_assign
|
||||
#: field:crm.lead.forward.to.partner,template_id:0
|
||||
msgid "Template"
|
||||
msgstr ""
|
||||
msgstr "Plantilla"
|
||||
|
||||
#. module: crm_partner_assign
|
||||
#: view:crm.lead:0
|
||||
|
@ -76,12 +76,12 @@ msgstr "Geo localizar"
|
|||
#. module: crm_partner_assign
|
||||
#: help:crm.lead.forward.to.partner,body:0
|
||||
msgid "Plain-text version of the message"
|
||||
msgstr ""
|
||||
msgstr "Versión en texto plano del mensaje"
|
||||
|
||||
#. module: crm_partner_assign
|
||||
#: view:crm.lead.forward.to.partner:0
|
||||
msgid "Body"
|
||||
msgstr ""
|
||||
msgstr "Cuerpo"
|
||||
|
||||
#. module: crm_partner_assign
|
||||
#: selection:crm.lead.report.assign,month:0
|
||||
|
@ -101,7 +101,7 @@ msgstr "Demora cierre"
|
|||
#. module: crm_partner_assign
|
||||
#: view:crm.partner.report.assign:0
|
||||
msgid "#Partner"
|
||||
msgstr ""
|
||||
msgstr "Nº empresa"
|
||||
|
||||
#. module: crm_partner_assign
|
||||
#: selection:crm.lead.forward.to.partner,history:0
|
||||
|
@ -137,7 +137,7 @@ msgstr "Más alta"
|
|||
#. module: crm_partner_assign
|
||||
#: field:crm.lead.forward.to.partner,body:0
|
||||
msgid "Text contents"
|
||||
msgstr ""
|
||||
msgstr "Contenido del texto"
|
||||
|
||||
#. module: crm_partner_assign
|
||||
#: view:crm.lead.report.assign:0
|
||||
|
@ -148,7 +148,7 @@ msgstr "Día"
|
|||
#. module: crm_partner_assign
|
||||
#: help:crm.lead.forward.to.partner,message_id:0
|
||||
msgid "Message unique identifier"
|
||||
msgstr ""
|
||||
msgstr "Identificador único del mensaje"
|
||||
|
||||
#. module: crm_partner_assign
|
||||
#: selection:crm.lead.forward.to.partner,history:0
|
||||
|
@ -167,6 +167,8 @@ msgid ""
|
|||
"Add here all attachments of the current document you want to include in the "
|
||||
"Email."
|
||||
msgstr ""
|
||||
"Añada aquí todos los datos adjuntos del documento que quiere incluir en el "
|
||||
"correo."
|
||||
|
||||
#. module: crm_partner_assign
|
||||
#: selection:crm.lead.report.assign,state:0
|
||||
|
@ -195,17 +197,17 @@ msgstr ""
|
|||
#. module: crm_partner_assign
|
||||
#: help:crm.lead.forward.to.partner,body_html:0
|
||||
msgid "Rich-text/HTML version of the message"
|
||||
msgstr ""
|
||||
msgstr "Versión en texto enriquecido / HTML del mensaje"
|
||||
|
||||
#. module: crm_partner_assign
|
||||
#: field:crm.lead.forward.to.partner,auto_delete:0
|
||||
msgid "Auto Delete"
|
||||
msgstr ""
|
||||
msgstr "Auto eliminar"
|
||||
|
||||
#. module: crm_partner_assign
|
||||
#: help:crm.lead.forward.to.partner,email_bcc:0
|
||||
msgid "Blind carbon copy message recipients"
|
||||
msgstr ""
|
||||
msgstr "Destinatarios de la copia oculta"
|
||||
|
||||
#. module: crm_partner_assign
|
||||
#: field:crm.lead.forward.to.partner,partner_id:0
|
||||
|
@ -254,7 +256,7 @@ msgstr "Sección"
|
|||
#. module: crm_partner_assign
|
||||
#: view:crm.lead.forward.to.partner:0
|
||||
msgid "Send"
|
||||
msgstr ""
|
||||
msgstr "Enviar"
|
||||
|
||||
#. module: crm_partner_assign
|
||||
#: view:res.partner:0
|
||||
|
@ -286,7 +288,7 @@ msgstr "Tipo"
|
|||
#. module: crm_partner_assign
|
||||
#: view:crm.partner.report.assign:0
|
||||
msgid "Name"
|
||||
msgstr ""
|
||||
msgstr "Nombre"
|
||||
|
||||
#. module: crm_partner_assign
|
||||
#: selection:crm.lead.report.assign,priority:0
|
||||
|
@ -299,11 +301,13 @@ msgid ""
|
|||
"Type of message, usually 'html' or 'plain', used to select plaintext or rich "
|
||||
"text contents accordingly"
|
||||
msgstr ""
|
||||
"Tipo de mensaje, normalmente 'html' o 'plano', utilizado para seleccionar "
|
||||
"contenidos en texto plano o en texto enriquecido"
|
||||
|
||||
#. module: crm_partner_assign
|
||||
#: view:crm.lead.report.assign:0
|
||||
msgid "Assign Date"
|
||||
msgstr ""
|
||||
msgstr "Fecha de asignación"
|
||||
|
||||
#. module: crm_partner_assign
|
||||
#: view:crm.lead.report.assign:0
|
||||
|
@ -318,7 +322,7 @@ msgstr "Fecha creación"
|
|||
#. module: crm_partner_assign
|
||||
#: field:crm.lead.forward.to.partner,res_id:0
|
||||
msgid "Related Document ID"
|
||||
msgstr ""
|
||||
msgstr "ID del docuemtno relacionado"
|
||||
|
||||
#. module: crm_partner_assign
|
||||
#: view:crm.lead.report.assign:0
|
||||
|
@ -349,7 +353,7 @@ msgstr "Etapa"
|
|||
#. module: crm_partner_assign
|
||||
#: field:crm.lead.forward.to.partner,model:0
|
||||
msgid "Related Document model"
|
||||
msgstr ""
|
||||
msgstr "Modelo del documento relacionado"
|
||||
|
||||
#. module: crm_partner_assign
|
||||
#: code:addons/crm_partner_assign/wizard/crm_forward_to_partner.py:192
|
||||
|
@ -392,7 +396,7 @@ msgstr "Cerrar"
|
|||
#. module: crm_partner_assign
|
||||
#: field:crm.lead.forward.to.partner,use_template:0
|
||||
msgid "Use Template"
|
||||
msgstr ""
|
||||
msgstr "Usar plantilla"
|
||||
|
||||
#. module: crm_partner_assign
|
||||
#: model:ir.actions.act_window,name:crm_partner_assign.action_report_crm_opportunity_assign
|
||||
|
@ -464,12 +468,12 @@ msgstr "nº oportunidades"
|
|||
#. module: crm_partner_assign
|
||||
#: view:crm.lead:0
|
||||
msgid "Team"
|
||||
msgstr ""
|
||||
msgstr "Equipo"
|
||||
|
||||
#. module: crm_partner_assign
|
||||
#: view:crm.lead:0
|
||||
msgid "Referred Partner"
|
||||
msgstr ""
|
||||
msgstr "Empresa referida"
|
||||
|
||||
#. module: crm_partner_assign
|
||||
#: selection:crm.lead.report.assign,state:0
|
||||
|
@ -490,7 +494,7 @@ msgstr "Cerrado"
|
|||
#. module: crm_partner_assign
|
||||
#: model:ir.actions.act_window,name:crm_partner_assign.action_crm_send_mass_forward
|
||||
msgid "Mass forward to partner"
|
||||
msgstr ""
|
||||
msgstr "Envío masivo a empresa"
|
||||
|
||||
#. module: crm_partner_assign
|
||||
#: view:res.partner:0
|
||||
|
@ -570,7 +574,7 @@ msgstr "Longitud Geo"
|
|||
#. module: crm_partner_assign
|
||||
#: field:crm.partner.report.assign,opp:0
|
||||
msgid "# of Opportunity"
|
||||
msgstr ""
|
||||
msgstr "Nº oportunidad"
|
||||
|
||||
#. module: crm_partner_assign
|
||||
#: view:crm.lead.report.assign:0
|
||||
|
@ -600,12 +604,12 @@ msgstr "Empresa a la que este caso ha sido reenviado/asignado."
|
|||
#. module: crm_partner_assign
|
||||
#: field:crm.lead.forward.to.partner,date:0
|
||||
msgid "Date"
|
||||
msgstr ""
|
||||
msgstr "Fecha"
|
||||
|
||||
#. module: crm_partner_assign
|
||||
#: field:crm.lead.forward.to.partner,body_html:0
|
||||
msgid "Rich-text contents"
|
||||
msgstr ""
|
||||
msgstr "Contenido en texto enriquecido"
|
||||
|
||||
#. module: crm_partner_assign
|
||||
#: view:crm.lead.report.assign:0
|
||||
|
@ -620,18 +624,18 @@ msgstr "res.empresa.nivel"
|
|||
#. module: crm_partner_assign
|
||||
#: field:crm.lead.forward.to.partner,message_id:0
|
||||
msgid "Message-Id"
|
||||
msgstr ""
|
||||
msgstr "Id del mensaje"
|
||||
|
||||
#. module: crm_partner_assign
|
||||
#: view:crm.lead.forward.to.partner:0
|
||||
#: field:crm.lead.forward.to.partner,attachment_ids:0
|
||||
msgid "Attachments"
|
||||
msgstr ""
|
||||
msgstr "Adjuntos"
|
||||
|
||||
#. module: crm_partner_assign
|
||||
#: field:crm.lead.forward.to.partner,email_cc:0
|
||||
msgid "Cc"
|
||||
msgstr ""
|
||||
msgstr "Cc"
|
||||
|
||||
#. module: crm_partner_assign
|
||||
#: selection:crm.lead.report.assign,month:0
|
||||
|
@ -641,7 +645,7 @@ msgstr "Septiembre"
|
|||
#. module: crm_partner_assign
|
||||
#: field:crm.lead.forward.to.partner,references:0
|
||||
msgid "References"
|
||||
msgstr ""
|
||||
msgstr "Referencias"
|
||||
|
||||
#. module: crm_partner_assign
|
||||
#: view:crm.lead.report.assign:0
|
||||
|
@ -668,7 +672,7 @@ msgstr "Abierto"
|
|||
#. module: crm_partner_assign
|
||||
#: help:crm.lead.forward.to.partner,email_cc:0
|
||||
msgid "Carbon copy message recipients"
|
||||
msgstr ""
|
||||
msgstr "Destinatarios de la copia"
|
||||
|
||||
#. module: crm_partner_assign
|
||||
#: help:crm.lead.forward.to.partner,headers:0
|
||||
|
@ -676,6 +680,8 @@ msgid ""
|
|||
"Full message headers, e.g. SMTP session headers (usually available on "
|
||||
"inbound messages only)"
|
||||
msgstr ""
|
||||
"Cabeceras completas del mensaje, por ejemplo las cabeceras de sesión SMTP "
|
||||
"(normalmente disponibles sólo en mensajes entrantes)"
|
||||
|
||||
#. module: crm_partner_assign
|
||||
#: field:res.partner,date_localization:0
|
||||
|
@ -698,11 +704,13 @@ msgid ""
|
|||
"Message sender, taken from user preferences. If empty, this is not a mail "
|
||||
"but a message."
|
||||
msgstr ""
|
||||
"Remitente del mensaje, proveniente de las preferencias del usuario. Si está "
|
||||
"vacío, esto no es correo electrónico, sino un mensaje."
|
||||
|
||||
#. module: crm_partner_assign
|
||||
#: field:crm.partner.report.assign,nbr:0
|
||||
msgid "# of Partner"
|
||||
msgstr ""
|
||||
msgstr "Nº empresa"
|
||||
|
||||
#. module: crm_partner_assign
|
||||
#: view:crm.lead.forward.to.partner:0
|
||||
|
@ -713,7 +721,7 @@ msgstr "Reenviar a empresa"
|
|||
#. module: crm_partner_assign
|
||||
#: field:crm.partner.report.assign,name:0
|
||||
msgid "Partner name"
|
||||
msgstr ""
|
||||
msgstr "Nombre de la empresa"
|
||||
|
||||
#. module: crm_partner_assign
|
||||
#: selection:crm.lead.report.assign,month:0
|
||||
|
@ -728,7 +736,7 @@ msgstr "Ingreso estimado"
|
|||
#. module: crm_partner_assign
|
||||
#: field:crm.lead.forward.to.partner,reply_to:0
|
||||
msgid "Reply-To"
|
||||
msgstr ""
|
||||
msgstr "Responder a"
|
||||
|
||||
#. module: crm_partner_assign
|
||||
#: field:crm.lead,partner_assigned_id:0
|
||||
|
@ -748,7 +756,7 @@ msgstr "Oportunidad"
|
|||
#. module: crm_partner_assign
|
||||
#: view:crm.lead.forward.to.partner:0
|
||||
msgid "Send Mail"
|
||||
msgstr ""
|
||||
msgstr "Enviar correo"
|
||||
|
||||
#. module: crm_partner_assign
|
||||
#: field:crm.lead.report.assign,partner_id:0
|
||||
|
@ -776,7 +784,7 @@ msgstr "País"
|
|||
#. module: crm_partner_assign
|
||||
#: field:crm.lead.forward.to.partner,headers:0
|
||||
msgid "Message headers"
|
||||
msgstr ""
|
||||
msgstr "Cabeceras del mensaje"
|
||||
|
||||
#. module: crm_partner_assign
|
||||
#: view:res.partner:0
|
||||
|
@ -786,7 +794,7 @@ msgstr "Convertir en oportunidad"
|
|||
#. module: crm_partner_assign
|
||||
#: field:crm.lead.forward.to.partner,email_bcc:0
|
||||
msgid "Bcc"
|
||||
msgstr ""
|
||||
msgstr "Cco"
|
||||
|
||||
#. module: crm_partner_assign
|
||||
#: view:crm.lead:0
|
||||
|
@ -802,7 +810,7 @@ msgstr "Abril"
|
|||
#: model:ir.actions.act_window,name:crm_partner_assign.action_report_crm_partner_assign
|
||||
#: model:ir.ui.menu,name:crm_partner_assign.menu_report_crm_partner_assign_tree
|
||||
msgid "Partnership Analysis"
|
||||
msgstr ""
|
||||
msgstr "Análisis de la relación"
|
||||
|
||||
#. module: crm_partner_assign
|
||||
#: model:ir.model,name:crm_partner_assign.model_crm_lead
|
||||
|
@ -817,7 +825,7 @@ msgstr "Pendiente"
|
|||
#. module: crm_partner_assign
|
||||
#: view:crm.partner.report.assign:0
|
||||
msgid "Partner assigned Analysis"
|
||||
msgstr ""
|
||||
msgstr "Análisis de la empresa asignada"
|
||||
|
||||
#. module: crm_partner_assign
|
||||
#: model:ir.model,name:crm_partner_assign.model_crm_lead_report_assign
|
||||
|
@ -828,11 +836,12 @@ msgstr "Informe de iniciativas CRM"
|
|||
#: help:crm.lead.forward.to.partner,references:0
|
||||
msgid "Message references, such as identifiers of previous messages"
|
||||
msgstr ""
|
||||
"Referencias del mensaje, tales como identificadores de mensajes anteriores"
|
||||
|
||||
#. module: crm_partner_assign
|
||||
#: constraint:res.partner:0
|
||||
msgid "Error ! You cannot create recursive associated members."
|
||||
msgstr ""
|
||||
msgstr "¡Error! No puede crear miembros asociados recursivamente."
|
||||
|
||||
#. module: crm_partner_assign
|
||||
#: selection:crm.lead.forward.to.partner,history:0
|
||||
|
@ -847,12 +856,12 @@ msgstr "Secuencia"
|
|||
#. module: crm_partner_assign
|
||||
#: model:ir.model,name:crm_partner_assign.model_crm_partner_report_assign
|
||||
msgid "CRM Partner Report"
|
||||
msgstr ""
|
||||
msgstr "Informe de la empresa CRM"
|
||||
|
||||
#. module: crm_partner_assign
|
||||
#: model:ir.model,name:crm_partner_assign.model_crm_lead_forward_to_partner
|
||||
msgid "Email composition wizard"
|
||||
msgstr ""
|
||||
msgstr "Asistente de composición de e-mail"
|
||||
|
||||
#. module: crm_partner_assign
|
||||
#: selection:crm.lead.report.assign,priority:0
|
||||
|
@ -873,7 +882,7 @@ msgstr "Fecha de creación"
|
|||
#. module: crm_partner_assign
|
||||
#: field:crm.lead.forward.to.partner,filter_id:0
|
||||
msgid "Filters"
|
||||
msgstr ""
|
||||
msgstr "Filtros"
|
||||
|
||||
#. module: crm_partner_assign
|
||||
#: view:crm.lead.report.assign:0
|
||||
|
@ -884,7 +893,7 @@ msgstr "Año"
|
|||
#. module: crm_partner_assign
|
||||
#: help:crm.lead.forward.to.partner,reply_to:0
|
||||
msgid "Preferred response address for the message"
|
||||
msgstr ""
|
||||
msgstr "Dirección de correo de respuesta preferida para este mensaje"
|
||||
|
||||
#~ msgid "Reply-to of the Sales team defined on this case"
|
||||
#~ msgstr "\"Responder a\" del equipo de ventas definido en este caso"
|
||||
|
@ -941,3 +950,6 @@ msgstr ""
|
|||
#~ "partners o asesores,\n"
|
||||
#~ "basándose en geo-localización.\n"
|
||||
#~ " "
|
||||
|
||||
#~ msgid "E-mail composition wizard"
|
||||
#~ msgstr "Asistente de composición de e-mail"
|
||||
|
|
|
@ -244,6 +244,7 @@ class crm_segmentation(osv.osv):
|
|||
@param uid: the current user’s ID for security checks,
|
||||
@param ids: List of crm segmentation’s IDs """
|
||||
|
||||
partner_obj = self.pool.get('res.partner')
|
||||
categs = self.read(cr,uid,ids,['categ_id','exclusif','partner_id', \
|
||||
'sales_purchase_active', 'profiling_active'])
|
||||
for categ in categs:
|
||||
|
@ -280,8 +281,10 @@ class crm_segmentation(osv.osv):
|
|||
for pid in to_remove_list:
|
||||
partners.remove(pid)
|
||||
|
||||
for partner_id in partners:
|
||||
cr.execute('insert into res_partner_res_partner_category_rel (category_id,partner_id) values (%s,%s)', (categ['categ_id'][0],partner_id))
|
||||
for partner in partner_obj.browse(cr, uid, partners):
|
||||
category_ids = [categ_id.id for categ_id in partner.category_id]
|
||||
if categ['categ_id'][0] not in category_ids:
|
||||
cr.execute('insert into res_partner_res_partner_category_rel (category_id,partner_id) values (%s,%s)', (categ['categ_id'][0],partner.id))
|
||||
|
||||
self.write(cr, uid, [id], {'state':'not running', 'partner_id':0})
|
||||
return True
|
||||
|
|
|
@ -823,6 +823,7 @@ class node_res_dir(node_class):
|
|||
uid = self.context.uid
|
||||
ctx = self.context.context.copy()
|
||||
ctx.update(self.dctx)
|
||||
ctx.update(self.context.extra_ctx)
|
||||
where = []
|
||||
if self.domain:
|
||||
app = safe_eval(self.domain, ctx)
|
||||
|
|
|
@ -43,7 +43,7 @@ class showdiff(osv.osv_memory):
|
|||
|
||||
elif len(ids) == 1:
|
||||
old = history.browse(cr, uid, ids[0])
|
||||
nids = history.search(cr, uid, [('document_id', '=', old.document_id.id)])
|
||||
nids = history.search(cr, uid, [('page_id', '=', old.page_id.id)])
|
||||
nids.sort()
|
||||
diff = history.getDiff(cr, uid, ids[0], nids[-1])
|
||||
else:
|
||||
|
|
|
@ -51,9 +51,10 @@ class document_davdir(osv.osv):
|
|||
# that might be not worth preparing.
|
||||
nctx.extra_ctx['webdav_path'] = '/'+config.get_misc('webdav','vdir','webdav')
|
||||
usr_obj = self.pool.get('res.users')
|
||||
res = usr_obj.read(cr, uid, uid, ['login'])
|
||||
res = usr_obj.read(cr, uid, uid, ['login','lang'])
|
||||
if res:
|
||||
nctx.extra_ctx['username'] = res['login']
|
||||
nctx.extra_ctx['lang'] = res['lang']
|
||||
# TODO group
|
||||
return
|
||||
|
||||
|
|
|
@ -15,7 +15,7 @@ openerp.edi.EdiView = openerp.web.Widget.extend({
|
|||
this._super();
|
||||
var self = this;
|
||||
var param = {"db": self.db, "token": self.token};
|
||||
return self.rpc('/edi/get_edi_document', param).then(this.on_document_loaded, this.on_document_failed);
|
||||
return self.rpc('/edi/get_edi_document', param).done(this.on_document_loaded).fail(this.on_document_failed);
|
||||
},
|
||||
on_document_loaded: function(docs){
|
||||
this.doc = docs[0];
|
||||
|
@ -108,7 +108,7 @@ openerp.edi.EdiView = openerp.web.Widget.extend({
|
|||
});
|
||||
|
||||
openerp.edi.edi_view = function (db, token) {
|
||||
openerp.session.session_bind().then(function () {
|
||||
openerp.session.session_bind().done(function () {
|
||||
new openerp.edi.EdiView(null,db,token).appendTo($("body").addClass('openerp'));
|
||||
});
|
||||
}
|
||||
|
@ -149,11 +149,11 @@ openerp.edi.EdiImport = openerp.web.Widget.extend({
|
|||
},
|
||||
|
||||
do_import: function() {
|
||||
this.rpc('/edi/import_edi_url', {url: this.url}).then(this.on_imported, this.on_imported_error);
|
||||
this.rpc('/edi/import_edi_url', {url: this.url}).done(this.on_imported).fail(this.on_imported_error);
|
||||
},
|
||||
on_imported: function(response) {
|
||||
if ('action' in response) {
|
||||
this.rpc("/web/session/save_session_action", {the_action: response.action}).then(function(key) {
|
||||
this.rpc("/web/session/save_session_action", {the_action: response.action}).done(function(key) {
|
||||
window.location = "/#sa="+encodeURIComponent(key);
|
||||
});
|
||||
}
|
||||
|
@ -188,7 +188,7 @@ openerp.edi.EdiImport = openerp.web.Widget.extend({
|
|||
});
|
||||
|
||||
openerp.edi.edi_import = function (url) {
|
||||
openerp.session.session_bind().then(function () {
|
||||
openerp.session.session_bind().done(function () {
|
||||
new openerp.edi.EdiImport(null,url).appendTo($("body").addClass('openerp'));
|
||||
});
|
||||
}
|
||||
|
|
|
@ -510,7 +510,7 @@
|
|||
<field name="model">event.registration</field>
|
||||
<field name="arch" type="xml">
|
||||
<search string="Event Registration">
|
||||
<field name="name" string="Participant" filter_domain="['|','|','|',('name','ilike',self),('partner_id','ilike',self),('email','ilike',self),('origin','ilike',self)]"/>
|
||||
<field name="name" string="Participant" filter_domain="['|','|',('name','ilike',self),('email','ilike',self),('origin','ilike',self)]"/>
|
||||
<filter icon="terp-mail-message-new" string="Unread Messages" name="message_unread" domain="[('message_unread','=',True)]"/>
|
||||
<separator/>
|
||||
<filter icon="terp-check" string="New" name="draft" domain="[('state','=','draft')]" help="Registrations in unconfirmed state"/>
|
||||
|
@ -519,6 +519,7 @@
|
|||
<filter icon="terp-personal" string="My Registrations" help="My Registrations" domain="[('user_id','=',uid)]"/>
|
||||
<field name="event_id"/>
|
||||
<field name="user_id"/>
|
||||
<field name="partner_id"/>
|
||||
<group expand="0" string="Group By...">
|
||||
<filter string="Responsible" icon="terp-personal" domain="[]" context="{'group_by':'user_id'}"/>
|
||||
<filter string="Partner" icon="terp-partner" domain="[]" context="{'group_by':'partner_id'}"/>
|
||||
|
|
|
@ -39,7 +39,7 @@ class sale_order_line(osv.osv):
|
|||
_columns = {
|
||||
'event_id': fields.many2one('event.event', 'Event', help="Choose an event and it will automatically create a registration for this event."),
|
||||
#those 2 fields are used for dynamic domains and filled by onchange
|
||||
'event_type_id': fields.related('event_type_id', type='many2one', relation="event.type", string="Event Type"),
|
||||
'event_type_id': fields.related('product_id','event_type_id', type='many2one', relation="event.type", string="Event Type"),
|
||||
'event_ok': fields.related('product_id', 'event_ok', string='event_ok', type='boolean'),
|
||||
}
|
||||
|
||||
|
|
|
@ -0,0 +1,21 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
##############################################################################
|
||||
#
|
||||
# OpenERP, Open Source Management Solution
|
||||
# Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>).
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU Affero General Public License as
|
||||
# published by the Free Software Foundation, either version 3 of the
|
||||
# License, or (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU Affero General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Affero General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
##############################################################################
|
||||
import fleet
|
|
@ -0,0 +1,61 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
##############################################################################
|
||||
#
|
||||
# OpenERP, Open Source Management Solution
|
||||
# Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>).
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU Affero General Public License as
|
||||
# published by the Free Software Foundation, either version 3 of the
|
||||
# License, or (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU Affero General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Affero General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
##############################################################################
|
||||
{
|
||||
'name' : 'Fleet Management',
|
||||
'version' : '0.1',
|
||||
'author' : 'OpenERP S.A.',
|
||||
'category': 'Managing vehicles and contracts',
|
||||
'website' : 'http://www.openerp.com',
|
||||
'summary' : 'Vehicle, leasing, insurances, costs',
|
||||
'description' : """
|
||||
Vehicle, leasing, insurances, cost
|
||||
==================================
|
||||
With this module, OpenERP helps you managing all your vehicles, the
|
||||
contracts associated to those vehicle as well as services, fuel log
|
||||
entries, costs and many other features necessary to the management
|
||||
of your fleet of vehicle(s)
|
||||
|
||||
Main Features
|
||||
-------------
|
||||
* Add vehicles to your fleet
|
||||
* Manage contracts for vehicles
|
||||
* Reminder when a contract reach its expiration date
|
||||
* Add services, fuel log entry, odometer values for all vehicles
|
||||
* Show all costs associated to a vehicle or to a type of service
|
||||
* Analysis graph for costs
|
||||
""",
|
||||
'depends' : [
|
||||
'base',
|
||||
'mail',
|
||||
'board'
|
||||
],
|
||||
'data' : [
|
||||
'fleet_view.xml',
|
||||
'fleet_data.xml',
|
||||
'fleet_board_view.xml',
|
||||
],
|
||||
'update_xml' : ['security/ir.model.access.csv'],
|
||||
|
||||
'demo': ['fleet_cars.xml','fleet_demo.xml'],
|
||||
|
||||
'installable' : True,
|
||||
'application' : True,
|
||||
}
|
|
@ -0,0 +1,820 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
##############################################################################
|
||||
#
|
||||
# OpenERP, Open Source Management Solution
|
||||
# Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>).
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU Affero General Public License as
|
||||
# published by the Free Software Foundation, either version 3 of the
|
||||
# License, or (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU Affero General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Affero General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
##############################################################################
|
||||
|
||||
from osv import osv, fields
|
||||
import time
|
||||
import datetime
|
||||
import tools
|
||||
from osv.orm import except_orm
|
||||
from tools.translate import _
|
||||
from dateutil.relativedelta import relativedelta
|
||||
|
||||
def str_to_datetime(strdate):
|
||||
return datetime.datetime.strptime(strdate, tools.DEFAULT_SERVER_DATE_FORMAT)
|
||||
|
||||
class fleet_vehicle_cost(osv.Model):
|
||||
_name = 'fleet.vehicle.cost'
|
||||
_description = 'Cost related to a vehicle'
|
||||
_order = 'date desc, vehicle_id asc'
|
||||
|
||||
def _get_odometer(self, cr, uid, ids, odometer_id, arg, context):
|
||||
res = dict.fromkeys(ids, False)
|
||||
for record in self.browse(cr,uid,ids,context=context):
|
||||
if record.odometer_id:
|
||||
res[record.id] = record.odometer_id.value
|
||||
return res
|
||||
|
||||
def _set_odometer(self, cr, uid, id, name, value, args=None, context=None):
|
||||
if not value:
|
||||
raise except_orm(_('Operation not allowed!'), _('Emptying the odometer value of a vehicle is not allowed.'))
|
||||
date = self.browse(cr, uid, id, context=context).date
|
||||
if not(date):
|
||||
date = fields.date.context_today(self, cr, uid, context=context)
|
||||
vehicle_id = self.browse(cr, uid, id, context=context).vehicle_id
|
||||
data = {'value': value, 'date': date, 'vehicle_id': vehicle_id.id}
|
||||
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
|
||||
|
||||
def _cost_name_get_fnc(self, cr, uid, ids, name, unknow_none, context=None):
|
||||
res = {}
|
||||
for record in self.browse(cr, uid, ids, context=context):
|
||||
name = record.vehicle_id.name
|
||||
if record.cost_subtype.name:
|
||||
name += ' / '+ record.cost_subtype.name
|
||||
if record.date:
|
||||
name += ' / '+ record.date
|
||||
res[record.id] = name
|
||||
return res
|
||||
|
||||
_columns = {
|
||||
'name': fields.function(_cost_name_get_fnc, type="char", string='Name', store=True),
|
||||
'vehicle_id': fields.many2one('fleet.vehicle', 'Vehicle', required=True, help='Vehicle concerned by this log'),
|
||||
'cost_subtype': fields.many2one('fleet.service.type', 'Type', help='Cost type purchased with this cost'),
|
||||
'amount': fields.float('Total Price'),
|
||||
'cost_type': fields.selection([('contract', 'Contract'), ('services','Services'), ('fuel','Fuel'), ('other','Other')], 'Category of the cost', help='For internal purpose only', required=True),
|
||||
'parent_id': fields.many2one('fleet.vehicle.cost', 'Parent', help='Parent cost to this current cost'),
|
||||
'cost_ids': fields.one2many('fleet.vehicle.cost', 'parent_id', 'Included Services'),
|
||||
'odometer_id': fields.many2one('fleet.vehicle.odometer', 'Odometer', help='Odometer measure of the vehicle at the moment of this log'),
|
||||
'odometer': fields.function(_get_odometer, fnct_inv=_set_odometer, type='float', string='Odometer Value', help='Odometer measure of the vehicle at the moment of this log'),
|
||||
'odometer_unit': fields.related('vehicle_id', 'odometer_unit', type="char", string="Unit", readonly=True),
|
||||
'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 ={
|
||||
'cost_type': 'other',
|
||||
}
|
||||
|
||||
def create(self, cr, uid, data, context=None):
|
||||
#make sure that the data are consistent with values of parent and contract records given
|
||||
if 'parent_id' in data and data['parent_id']:
|
||||
parent = self.browse(cr, uid, data['parent_id'], context=context)
|
||||
data['vehicle_id'] = parent.vehicle_id.id
|
||||
data['date'] = parent.date
|
||||
data['cost_type'] = parent.cost_type
|
||||
if 'contract_id' in data and data['contract_id']:
|
||||
contract = self.pool.get('fleet.vehicle.log.contract').browse(cr, uid, data['contract_id'], context=context)
|
||||
data['vehicle_id'] = contract.vehicle_id.id
|
||||
data['cost_subtype'] = contract.cost_subtype.id
|
||||
data['cost_type'] = contract.cost_type
|
||||
if 'odometer' in data and not data['odometer']:
|
||||
#if received value for odometer is 0, then remove it from the data as it would result to the creation of a
|
||||
#odometer log with 0, which is to be avoided
|
||||
del(data['odometer'])
|
||||
return super(fleet_vehicle_cost, self).create(cr, uid, data, context=context)
|
||||
|
||||
|
||||
class fleet_vehicle_tag(osv.Model):
|
||||
_name = 'fleet.vehicle.tag'
|
||||
_columns = {
|
||||
'name': fields.char('Name', required=True, translate=True),
|
||||
}
|
||||
|
||||
class fleet_vehicle_state(osv.Model):
|
||||
_name = 'fleet.vehicle.state'
|
||||
_order = 'sequence asc'
|
||||
_columns = {
|
||||
'name': fields.char('Name', required=True),
|
||||
'sequence': fields.integer('Order', help="Used to order the note stages")
|
||||
}
|
||||
_sql_constraints = [('fleet_state_name_unique','unique(name)', 'State name already exists')]
|
||||
|
||||
|
||||
class fleet_vehicle_model(osv.Model):
|
||||
|
||||
def _model_name_get_fnc(self, cr, uid, ids, field_name, arg, context=None):
|
||||
res = {}
|
||||
for record in self.browse(cr, uid, ids, context=context):
|
||||
name = record.modelname
|
||||
if record.brand.name:
|
||||
name = record.brand.name + ' / ' + name
|
||||
res[record.id] = name
|
||||
return res
|
||||
|
||||
def on_change_brand(self, cr, uid, ids, model_id, context=None):
|
||||
if not model_id:
|
||||
return {'value': {'image_medium': False}}
|
||||
brand = self.pool.get('fleet.vehicle.model.brand').browse(cr, uid, model_id, context=context)
|
||||
return {
|
||||
'value': {
|
||||
'image_medium': brand.image,
|
||||
}
|
||||
}
|
||||
|
||||
_name = 'fleet.vehicle.model'
|
||||
_description = 'Model of a vehicle'
|
||||
_order = 'name asc'
|
||||
|
||||
_columns = {
|
||||
'name': fields.function(_model_name_get_fnc, type="char", string='Name', store=True),
|
||||
'modelname': fields.char('Model name', size=32, required=True),
|
||||
'brand': fields.many2one('fleet.vehicle.model.brand', 'Model Brand', required=True, help='Brand of the vehicle'),
|
||||
'vendors': fields.many2many('res.partner', 'fleet_vehicle_model_vendors', 'model_id', 'partner_id', string='Vendors'),
|
||||
'image': fields.related('brand', 'image', type="binary", string="Logo"),
|
||||
'image_medium': fields.related('brand', 'image_medium', type="binary", string="Logo"),
|
||||
'image_small': fields.related('brand', 'image_small', type="binary", string="Logo"),
|
||||
}
|
||||
|
||||
|
||||
class fleet_vehicle_model_brand(osv.Model):
|
||||
_name = 'fleet.vehicle.model.brand'
|
||||
_description = 'Brand model of the vehicle'
|
||||
|
||||
_order = 'name asc'
|
||||
|
||||
def _get_image(self, cr, uid, ids, name, args, context=None):
|
||||
result = dict.fromkeys(ids, False)
|
||||
for obj in self.browse(cr, uid, ids, context=context):
|
||||
result[obj.id] = tools.image_get_resized_images(obj.image)
|
||||
return result
|
||||
|
||||
def _set_image(self, cr, uid, id, name, value, args, context=None):
|
||||
return self.write(cr, uid, [id], {'image': tools.image_resize_image_big(value)}, context=context)
|
||||
|
||||
_columns = {
|
||||
'name': fields.char('Brand Name', size=64, required=True),
|
||||
'image': fields.binary("Logo",
|
||||
help="This field holds the image used as logo for the brand, limited to 1024x1024px."),
|
||||
'image_medium': fields.function(_get_image, fnct_inv=_set_image,
|
||||
string="Medium-sized photo", type="binary", multi="_get_image",
|
||||
store = {
|
||||
'fleet.vehicle.model.brand': (lambda self, cr, uid, ids, c={}: ids, ['image'], 10),
|
||||
},
|
||||
help="Medium-sized logo of the brand. It is automatically "\
|
||||
"resized as a 128x128px image, with aspect ratio preserved. "\
|
||||
"Use this field in form views or some kanban views."),
|
||||
'image_small': fields.function(_get_image, fnct_inv=_set_image,
|
||||
string="Smal-sized photo", type="binary", multi="_get_image",
|
||||
store = {
|
||||
'fleet.vehicle.model.brand': (lambda self, cr, uid, ids, c={}: ids, ['image'], 10),
|
||||
},
|
||||
help="Small-sized photo of the brand. It is automatically "\
|
||||
"resized as a 64x64px image, with aspect ratio preserved. "\
|
||||
"Use this field anywhere a small image is required."),
|
||||
}
|
||||
|
||||
|
||||
class fleet_vehicle(osv.Model):
|
||||
|
||||
_inherit = 'mail.thread'
|
||||
|
||||
def _vehicle_name_get_fnc(self, cr, uid, ids, prop, unknow_none, context=None):
|
||||
res = {}
|
||||
for record in self.browse(cr, uid, ids, context=context):
|
||||
res[record.id] = record.model_id.brand.name + '/' + record.model_id.modelname + ' / ' + record.license_plate
|
||||
return res
|
||||
|
||||
def return_action_to_open(self, cr, uid, ids, context=None):
|
||||
""" This opens the xml view specified in xml_id for the current vehicle """
|
||||
if context is None:
|
||||
context = {}
|
||||
if context.get('xml_id'):
|
||||
res = self.pool.get('ir.actions.act_window').for_xml_id(cr, uid ,'fleet', context['xml_id'], context=context)
|
||||
res['context'] = context
|
||||
res['context'].update({'default_vehicle_id': ids[0]})
|
||||
res['domain'] = [('vehicle_id','=', ids[0])]
|
||||
return res
|
||||
return False
|
||||
|
||||
def act_show_log_cost(self, cr, uid, ids, context=None):
|
||||
""" This opens log view to view and add new log for this vehicle, groupby default to only show effective costs
|
||||
@return: the costs log view
|
||||
"""
|
||||
if context is None:
|
||||
context = {}
|
||||
res = self.pool.get('ir.actions.act_window').for_xml_id(cr, uid ,'fleet','fleet_vehicle_costs_act', context=context)
|
||||
res['context'] = context
|
||||
res['context'].update({
|
||||
'default_vehicle_id': ids[0],
|
||||
'search_default_parent_false': True
|
||||
})
|
||||
res['domain'] = [('vehicle_id','=', ids[0])]
|
||||
return res
|
||||
|
||||
def _get_odometer(self, cr, uid, ids, odometer_id, arg, context):
|
||||
res = dict.fromkeys(ids, 0)
|
||||
for record in self.browse(cr,uid,ids,context=context):
|
||||
ids = self.pool.get('fleet.vehicle.odometer').search(cr, uid, [('vehicle_id', '=', record.id)], limit=1, order='value desc')
|
||||
if len(ids) > 0:
|
||||
res[record.id] = self.pool.get('fleet.vehicle.odometer').browse(cr, uid, ids[0], context=context).value
|
||||
return res
|
||||
|
||||
def _set_odometer(self, cr, uid, id, name, value, args=None, context=None):
|
||||
if value:
|
||||
date = fields.date.context_today(self, cr, uid, context=context)
|
||||
data = {'value': value, 'date': date, 'vehicle_id': id}
|
||||
return self.pool.get('fleet.vehicle.odometer').create(cr, uid, data, context=context)
|
||||
|
||||
def _search_get_overdue_contract_reminder(self, cr, uid, obj, name, args, context):
|
||||
res = []
|
||||
for field, operator, value in args:
|
||||
assert operator in ('=', '!=', '<>') and value in (True, False), 'Operation not supported'
|
||||
if (operator == '=' and value == True) or (operator in ('<>', '!=') and value == False):
|
||||
search_operator = 'in'
|
||||
else:
|
||||
search_operator = 'not in'
|
||||
today = fields.date.context_today(self, cr, uid, context=context)
|
||||
cr.execute('select cost.vehicle_id, count(contract.id) as contract_number FROM fleet_vehicle_cost cost left join fleet_vehicle_log_contract contract on contract.cost_id = cost.id WHERE contract.expiration_date is not null AND contract.expiration_date < %s AND contract.state IN (\'open\', \'toclose\') GROUP BY cost.vehicle_id', (today,))
|
||||
res_ids = [x[0] for x in cr.fetchall()]
|
||||
res.append(('id', search_operator, res_ids))
|
||||
return res
|
||||
|
||||
def _search_contract_renewal_due_soon(self, cr, uid, obj, name, args, context):
|
||||
res = []
|
||||
for field, operator, value in args:
|
||||
assert operator in ('=', '!=', '<>') and value in (True, False), 'Operation not supported'
|
||||
if (operator == '=' and value == True) or (operator in ('<>', '!=') and value == False):
|
||||
search_operator = 'in'
|
||||
else:
|
||||
search_operator = 'not in'
|
||||
today = fields.date.context_today(self, cr, uid, context=context)
|
||||
datetime_today = datetime.datetime.strptime(today, tools.DEFAULT_SERVER_DATE_FORMAT)
|
||||
limit_date = str((datetime_today + relativedelta(days=+15)).strftime(tools.DEFAULT_SERVER_DATE_FORMAT))
|
||||
cr.execute('select cost.vehicle_id, count(contract.id) as contract_number FROM fleet_vehicle_cost cost left join fleet_vehicle_log_contract contract on contract.cost_id = cost.id WHERE contract.expiration_date is not null AND contract.expiration_date > %s AND contract.expiration_date < %s AND contract.state IN (\'open\', \'toclose\') GROUP BY cost.vehicle_id', (today, limit_date))
|
||||
res_ids = [x[0] for x in cr.fetchall()]
|
||||
res.append(('id', search_operator, res_ids))
|
||||
return res
|
||||
|
||||
def _get_contract_reminder_fnc(self, cr, uid, ids, field_names, unknow_none, context=None):
|
||||
res= {}
|
||||
for record in self.browse(cr, uid, ids, context=context):
|
||||
overdue = False
|
||||
due_soon = False
|
||||
total = 0
|
||||
name = ''
|
||||
for element in record.log_contracts:
|
||||
if element.state in ('open', 'toclose') and element.expiration_date:
|
||||
current_date_str = fields.date.context_today(self, cr, uid, context=context)
|
||||
due_time_str = element.expiration_date
|
||||
current_date = str_to_datetime(current_date_str)
|
||||
due_time = str_to_datetime(due_time_str)
|
||||
diff_time = (due_time-current_date).days
|
||||
if diff_time < 0:
|
||||
overdue = True
|
||||
total += 1
|
||||
if diff_time < 15 and diff_time >= 0:
|
||||
due_soon = True;
|
||||
total += 1
|
||||
if overdue or due_soon:
|
||||
ids = self.pool.get('fleet.vehicle.log.contract').search(cr,uid,[('vehicle_id', '=', record.id), ('state', 'in', ('open', 'toclose'))], limit=1, order='expiration_date asc')
|
||||
if len(ids) > 0:
|
||||
#we display only the name of the oldest overdue/due soon contract
|
||||
name=(self.pool.get('fleet.vehicle.log.contract').browse(cr, uid, ids[0], context=context).cost_subtype.name)
|
||||
|
||||
res[record.id] = {
|
||||
'contract_renewal_overdue': overdue,
|
||||
'contract_renewal_due_soon': due_soon,
|
||||
'contract_renewal_total': (total - 1), #we remove 1 from the real total for display purposes
|
||||
'contract_renewal_name': name,
|
||||
}
|
||||
return res
|
||||
|
||||
def _get_default_state(self, cr, uid, context):
|
||||
try:
|
||||
model, model_id = self.pool.get('ir.model.data').get_object_reference(cr, uid, 'fleet', 'vehicle_state_active')
|
||||
except ValueError:
|
||||
model_id = False
|
||||
return model_id
|
||||
|
||||
_name = 'fleet.vehicle'
|
||||
_description = 'Information on a vehicle'
|
||||
_order= 'license_plate asc'
|
||||
_columns = {
|
||||
'name': fields.function(_vehicle_name_get_fnc, type="char", string='Name', store=True),
|
||||
'company_id': fields.many2one('res.company', 'Company'),
|
||||
'license_plate': fields.char('License Plate', size=32, required=True, help='License plate number of the vehicle (ie: plate number for a car)'),
|
||||
'vin_sn': fields.char('Chassis Number', size=32, help='Unique number written on the vehicle motor (VIN/SN number)'),
|
||||
'driver': fields.many2one('res.partner', 'Driver', help='Driver of the vehicle'),
|
||||
'model_id': fields.many2one('fleet.vehicle.model', 'Model', required=True, help='Model of the vehicle'),
|
||||
'log_fuel': fields.one2many('fleet.vehicle.log.fuel', 'vehicle_id', 'Fuel Logs'),
|
||||
'log_services': fields.one2many('fleet.vehicle.log.services', 'vehicle_id', 'Services Logs'),
|
||||
'log_contracts': fields.one2many('fleet.vehicle.log.contract', 'vehicle_id', 'Contracts'),
|
||||
'acquisition_date': fields.date('Acquisition Date', required=False, help='Date when the vehicle has been bought'),
|
||||
'color': fields.char('Color', size=32, help='Color of the vehicle'),
|
||||
'state': fields.many2one('fleet.vehicle.state', 'State', help='Current state of the vehicle', ondelete="set null"),
|
||||
'location': fields.char('Location', size=128, help='Location of the vehicle (garage, ...)'),
|
||||
'seats': fields.integer('Seats Number', help='Number of seats of the vehicle'),
|
||||
'doors': fields.integer('Doors Number', help='Number of doors of the vehicle'),
|
||||
'tag_ids' :fields.many2many('fleet.vehicle.tag', 'fleet_vehicle_vehicle_tag_rel', 'vehicle_tag_id','tag_id', 'Tags'),
|
||||
'odometer': fields.function(_get_odometer, fnct_inv=_set_odometer, type='float', string='Last Odometer', help='Odometer measure of the vehicle at the moment of this log'),
|
||||
'odometer_unit': fields.selection([('kilometers', 'Kilometers'),('miles','Miles')], 'Odometer Unit', help='Unit of the odometer ',required=True),
|
||||
'transmission': fields.selection([('manual', 'Manual'), ('automatic', 'Automatic')], 'Transmission', help='Transmission Used by the vehicle'),
|
||||
'fuel_type': fields.selection([('gasoline', 'Gasoline'), ('diesel', 'Diesel'), ('electric', 'Electric'), ('hybrid', 'Hybrid')], 'Fuel Type', help='Fuel Used by the vehicle'),
|
||||
'horsepower': fields.integer('Horsepower'),
|
||||
'horsepower_tax': fields.float('Horsepower Taxation'),
|
||||
'power': fields.integer('Power (kW)', help='Power in kW of the vehicle'),
|
||||
'co2': fields.float('CO2 Emissions', help='CO2 emissions of the vehicle'),
|
||||
'image': fields.related('model_id', 'image', type="binary", string="Logo"),
|
||||
'image_medium': fields.related('model_id', 'image_medium', type="binary", string="Logo"),
|
||||
'image_small': fields.related('model_id', 'image_small', type="binary", string="Logo"),
|
||||
'contract_renewal_due_soon': fields.function(_get_contract_reminder_fnc, fnct_search=_search_contract_renewal_due_soon, type="boolean", string='Has Contracts to renew', multi='contract_info'),
|
||||
'contract_renewal_overdue': fields.function(_get_contract_reminder_fnc, fnct_search=_search_get_overdue_contract_reminder, type="boolean", string='Has Contracts Overdued', multi='contract_info'),
|
||||
'contract_renewal_name': fields.function(_get_contract_reminder_fnc, type="text", string='Name of contract to renew soon', multi='contract_info'),
|
||||
'contract_renewal_total': fields.function(_get_contract_reminder_fnc, type="integer", string='Total of contracts due or overdue minus one', multi='contract_info'),
|
||||
'car_value': fields.float('Car Value', help='Value of the bought vehicle'),
|
||||
}
|
||||
|
||||
_defaults = {
|
||||
'doors': 5,
|
||||
'odometer_unit': 'kilometers',
|
||||
'state': _get_default_state,
|
||||
}
|
||||
|
||||
def copy(self, cr, uid, id, default=None, context=None):
|
||||
if not default:
|
||||
default = {}
|
||||
default.update({
|
||||
'log_fuel':[],
|
||||
'log_contracts':[],
|
||||
'log_services':[],
|
||||
'tag_ids':[],
|
||||
'vin_sn':'',
|
||||
})
|
||||
return super(fleet_vehicle, self).copy(cr, uid, id, default, context=context)
|
||||
|
||||
def on_change_model(self, cr, uid, ids, model_id, context=None):
|
||||
if not model_id:
|
||||
return {}
|
||||
model = self.pool.get('fleet.vehicle.model').browse(cr, uid, model_id, context=context)
|
||||
return {
|
||||
'value': {
|
||||
'image_medium': model.image,
|
||||
}
|
||||
}
|
||||
|
||||
def create(self, cr, uid, data, context=None):
|
||||
vehicle_id = super(fleet_vehicle, self).create(cr, uid, data, context=context)
|
||||
vehicle = self.browse(cr, uid, vehicle_id, context=context)
|
||||
self.message_post(cr, uid, [vehicle_id], body=_('Vehicle %s has been added to the fleet!') % (vehicle.license_plate), context=context)
|
||||
return vehicle_id
|
||||
|
||||
def write(self, cr, uid, ids, vals, context=None):
|
||||
"""
|
||||
This function write an entry in the openchatter whenever we change important information
|
||||
on the vehicle like the model, the drive, the state of the vehicle or its license plate
|
||||
"""
|
||||
for vehicle in self.browse(cr, uid, ids, context):
|
||||
changes = []
|
||||
if 'model_id' in vals and vehicle.model_id.id != vals['model_id']:
|
||||
value = self.pool.get('fleet.vehicle.model').browse(cr,uid,vals['model_id'],context=context).name
|
||||
oldmodel = vehicle.model_id.name or _('None')
|
||||
changes.append(_("Model: from '%s' to '%s'") %(oldmodel, value))
|
||||
if 'driver' in vals and vehicle.driver.id != vals['driver']:
|
||||
value = self.pool.get('res.partner').browse(cr,uid,vals['driver'],context=context).name
|
||||
olddriver = (vehicle.driver.name) or _('None')
|
||||
changes.append(_("Driver: from '%s' to '%s'") %(olddriver, value))
|
||||
if 'state' in vals and vehicle.state.id != vals['state']:
|
||||
value = self.pool.get('fleet.vehicle.state').browse(cr,uid,vals['state'],context=context).name
|
||||
oldstate = vehicle.state.name or _('None')
|
||||
changes.append(_("State: from '%s' to '%s'") %(oldstate, value))
|
||||
if 'license_plate' in vals and vehicle.license_plate != vals['license_plate']:
|
||||
old_license_plate = vehicle.license_plate or _('None')
|
||||
changes.append(_("License Plate: from '%s' to '%s'") %(old_license_plate, vals['license_plate']))
|
||||
|
||||
if len(changes) > 0:
|
||||
self.message_post(cr, uid, [vehicle.id], body=", ".join(changes), context=context)
|
||||
|
||||
vehicle_id = super(fleet_vehicle,self).write(cr, uid, ids, vals, context)
|
||||
return True
|
||||
|
||||
|
||||
class fleet_vehicle_odometer(osv.Model):
|
||||
_name='fleet.vehicle.odometer'
|
||||
_description='Odometer log for a vehicle'
|
||||
_order='date desc'
|
||||
|
||||
def _vehicle_log_name_get_fnc(self, cr, uid, ids, prop, unknow_none, context=None):
|
||||
res = {}
|
||||
for record in self.browse(cr, uid, ids, context=context):
|
||||
name = record.vehicle_id.name
|
||||
if record.date:
|
||||
name = name+ ' / '+ str(record.date)
|
||||
res[record.id] = name
|
||||
return res
|
||||
|
||||
def on_change_vehicle(self, cr, uid, ids, vehicle_id, context=None):
|
||||
if not vehicle_id:
|
||||
return {}
|
||||
odometer_unit = self.pool.get('fleet.vehicle').browse(cr, uid, vehicle_id, context=context).odometer_unit
|
||||
return {
|
||||
'value': {
|
||||
'unit': odometer_unit,
|
||||
}
|
||||
}
|
||||
|
||||
_columns = {
|
||||
'name': fields.function(_vehicle_log_name_get_fnc, type="char", string='Name', store=True),
|
||||
'date': fields.date('Date'),
|
||||
'value': fields.float('Odometer Value', group_operator="max"),
|
||||
'vehicle_id': fields.many2one('fleet.vehicle', 'Vehicle', required=True),
|
||||
'unit': fields.related('vehicle_id', 'odometer_unit', type="char", string="Unit", readonly=True),
|
||||
}
|
||||
_defaults = {
|
||||
'date': fields.date.context_today,
|
||||
}
|
||||
|
||||
|
||||
class fleet_vehicle_log_fuel(osv.Model):
|
||||
|
||||
def on_change_vehicle(self, cr, uid, ids, vehicle_id, context=None):
|
||||
if not vehicle_id:
|
||||
return {}
|
||||
odometer_unit = self.pool.get('fleet.vehicle').browse(cr, uid, vehicle_id, context=context).odometer_unit
|
||||
return {
|
||||
'value': {
|
||||
'odometer_unit': odometer_unit,
|
||||
}
|
||||
}
|
||||
|
||||
def on_change_liter(self, cr, uid, ids, liter, price_per_liter, amount, context=None):
|
||||
#need to cast in float because the value receveid from web client maybe an integer (Javascript and JSON do not
|
||||
#make any difference between 3.0 and 3). This cause a problem if you encode, for example, 2 liters at 1.5 per
|
||||
#liter => total is computed as 3.0, then trigger an onchange that recomputes price_per_liter as 3/2=1 (instead
|
||||
#of 3.0/2=1.5)
|
||||
liter = float(liter)
|
||||
price_per_liter = float(price_per_liter)
|
||||
amount = float(amount)
|
||||
if liter > 0 and price_per_liter > 0:
|
||||
return {'value' : {'amount' : liter * price_per_liter,}}
|
||||
elif liter > 0 and amount > 0:
|
||||
return {'value' : {'price_per_liter' : amount / liter,}}
|
||||
elif price_per_liter > 0 and amount > 0:
|
||||
return {'value' : {'liter' : amount / price_per_liter,}}
|
||||
else :
|
||||
return {}
|
||||
|
||||
def on_change_price_per_liter(self, cr, uid, ids, liter, price_per_liter, amount, context=None):
|
||||
#need to cast in float because the value receveid from web client maybe an integer (Javascript and JSON do not
|
||||
#make any difference between 3.0 and 3). This cause a problem if you encode, for example, 2 liters at 1.5 per
|
||||
#liter => total is computed as 3.0, then trigger an onchange that recomputes price_per_liter as 3/2=1 (instead
|
||||
#of 3.0/2=1.5)
|
||||
liter = float(liter)
|
||||
price_per_liter = float(price_per_liter)
|
||||
amount = float(amount)
|
||||
if price_per_liter > 0 and liter > 0:
|
||||
return {'value' : {'amount' : liter * price_per_liter,}}
|
||||
elif price_per_liter > 0 and amount > 0:
|
||||
return {'value' : {'liter' : amount / price_per_liter,}}
|
||||
elif liter > 0 and amount > 0:
|
||||
return {'value' : {'price_per_liter' : amount / liter,}}
|
||||
else :
|
||||
return {}
|
||||
|
||||
def on_change_amount(self, cr, uid, ids, liter, price_per_liter, amount, context=None):
|
||||
#need to cast in float because the value receveid from web client maybe an integer (Javascript and JSON do not
|
||||
#make any difference between 3.0 and 3). This cause a problem if you encode, for example, 2 liters at 1.5 per
|
||||
#liter => total is computed as 3.0, then trigger an onchange that recomputes price_per_liter as 3/2=1 (instead
|
||||
#of 3.0/2=1.5)
|
||||
liter = float(liter)
|
||||
price_per_liter = float(price_per_liter)
|
||||
amount = float(amount)
|
||||
if amount > 0 and liter > 0:
|
||||
return {'value': {'price_per_liter': amount / liter,}}
|
||||
elif amount > 0 and price_per_liter > 0:
|
||||
return {'value': {'liter': amount / price_per_liter,}}
|
||||
elif liter > 0 and price_per_liter > 0:
|
||||
return {'value': {'amount': liter * price_per_liter,}}
|
||||
return {}
|
||||
|
||||
def _get_default_service_type(self, cr, uid, context):
|
||||
try:
|
||||
model, model_id = self.pool.get('ir.model.data').get_object_reference(cr, uid, 'fleet', 'type_service_refueling')
|
||||
except ValueError:
|
||||
model_id = False
|
||||
return model_id
|
||||
|
||||
_name = 'fleet.vehicle.log.fuel'
|
||||
_description = 'Fuel log for vehicles'
|
||||
_inherits = {'fleet.vehicle.cost': 'cost_id'}
|
||||
|
||||
_columns = {
|
||||
'liter': fields.float('Liter'),
|
||||
'price_per_liter': fields.float('Price Per Liter'),
|
||||
'purchaser_id': fields.many2one('res.partner', 'Purchaser', domain="['|',('customer','=',True),('employee','=',True)]"),
|
||||
'inv_ref': fields.char('Invoice Reference', size=64),
|
||||
'vendor_id': fields.many2one('res.partner', 'Supplier', domain="[('supplier','=',True)]"),
|
||||
'notes': fields.text('Notes'),
|
||||
'cost_amount': fields.related('cost_id', 'amount', string='Amount', type='float', store=True), #we need to keep this field as a related with store=True because the graph view doesn't support (1) to address fields from inherited table and (2) fields that aren't stored in database
|
||||
}
|
||||
_defaults = {
|
||||
'purchaser_id': lambda self, cr, uid, ctx: uid,
|
||||
'date': fields.date.context_today,
|
||||
'cost_subtype': _get_default_service_type,
|
||||
'cost_type': 'fuel',
|
||||
}
|
||||
|
||||
|
||||
class fleet_vehicle_log_services(osv.Model):
|
||||
|
||||
def on_change_vehicle(self, cr, uid, ids, vehicle_id, context=None):
|
||||
if not vehicle_id:
|
||||
return {}
|
||||
odometer_unit = self.pool.get('fleet.vehicle').browse(cr, uid, vehicle_id, context=context).odometer_unit
|
||||
return {
|
||||
'value': {
|
||||
'odometer_unit': odometer_unit,
|
||||
}
|
||||
}
|
||||
|
||||
def _get_default_service_type(self, cr, uid, context):
|
||||
try:
|
||||
model, model_id = self.pool.get('ir.model.data').get_object_reference(cr, uid, 'fleet', 'type_service_service_8')
|
||||
except ValueError:
|
||||
model_id = False
|
||||
return model_id
|
||||
|
||||
_inherits = {'fleet.vehicle.cost': 'cost_id'}
|
||||
_name = 'fleet.vehicle.log.services'
|
||||
_description = 'Services for vehicles'
|
||||
_columns = {
|
||||
'purchaser_id': fields.many2one('res.partner', 'Purchaser', domain="['|',('customer','=',True),('employee','=',True)]"),
|
||||
'inv_ref': fields.char('Invoice Reference', size=64),
|
||||
'vendor_id': fields.many2one('res.partner', 'Supplier', domain="[('supplier','=',True)]"),
|
||||
'cost_amount': fields.related('cost_id', 'amount', string='Amount', type='float', store=True), #we need to keep this field as a related with store=True because the graph view doesn't support (1) to address fields from inherited table and (2) fields that aren't stored in database
|
||||
'notes': fields.text('Notes'),
|
||||
}
|
||||
_defaults = {
|
||||
'purchaser_id': lambda self, cr, uid, ctx: uid,
|
||||
'date': fields.date.context_today,
|
||||
'cost_subtype': _get_default_service_type,
|
||||
'cost_type': 'services'
|
||||
}
|
||||
|
||||
|
||||
class fleet_service_type(osv.Model):
|
||||
_name = 'fleet.service.type'
|
||||
_description = 'Type of services available on a vehicle'
|
||||
_columns = {
|
||||
'name': fields.char('Name', required=True, translate=True),
|
||||
'category': fields.selection([('contract', 'Contract'), ('service', 'Service'), ('both', 'Both')], 'Category', required=True, help='Choose wheter the service refer to contracts, vehicle services or both'),
|
||||
}
|
||||
|
||||
|
||||
class fleet_vehicle_log_contract(osv.Model):
|
||||
|
||||
def scheduler_manage_auto_costs(self, cr, uid, context=None):
|
||||
#This method is called by a cron task
|
||||
#It creates costs for contracts having the "recurring cost" field setted, depending on their frequency
|
||||
#For example, if a contract has a reccuring cost of 200 with a weekly frequency, this method creates a cost of 200 on the first day of each week, from the date of the last recurring costs in the database to today
|
||||
#If the contract has not yet any recurring costs in the database, the method generates the recurring costs from the start_date to today
|
||||
#The created costs are associated to a contract thanks to the many2one field contract_id
|
||||
#If the contract has no start_date, no cost will be created, even if the contract has recurring costs
|
||||
vehicle_cost_obj = self.pool.get('fleet.vehicle.cost')
|
||||
d = datetime.datetime.strptime(fields.date.context_today(self, cr, uid, context=context), tools.DEFAULT_SERVER_DATE_FORMAT).date()
|
||||
contract_ids = self.pool.get('fleet.vehicle.log.contract').search(cr, uid, [('state','!=','closed')], offset=0, limit=None, order=None,context=None, count=False)
|
||||
deltas = {'yearly': relativedelta(years=+1), 'monthly': relativedelta(months=+1), 'weekly': relativedelta(weeks=+1), 'daily': relativedelta(days=+1)}
|
||||
for contract in self.pool.get('fleet.vehicle.log.contract').browse(cr, uid, contract_ids, context=context):
|
||||
if not contract.start_date or contract.cost_frequency == 'no':
|
||||
continue
|
||||
found = False
|
||||
last_cost_date = contract.start_date
|
||||
if contract.generated_cost_ids:
|
||||
last_autogenerated_cost_id = vehicle_cost_obj.search(cr, uid, ['&', ('contract_id','=',contract.id), ('auto_generated','=',True)], offset=0, limit=1, order='date desc',context=context, count=False)
|
||||
if last_autogenerated_cost_id:
|
||||
found = True
|
||||
last_cost_date = vehicle_cost_obj.browse(cr, uid, last_autogenerated_cost_id[0], context=context).date
|
||||
startdate = datetime.datetime.strptime(last_cost_date, tools.DEFAULT_SERVER_DATE_FORMAT).date()
|
||||
if found:
|
||||
startdate += deltas.get(contract.cost_frequency)
|
||||
while (startdate < d) & (startdate < datetime.datetime.strptime(contract.expiration_date, tools.DEFAULT_SERVER_DATE_FORMAT).date()):
|
||||
data = {
|
||||
'amount': contract.cost_generated,
|
||||
'date': startdate.strftime(tools.DEFAULT_SERVER_DATE_FORMAT),
|
||||
'vehicle_id': contract.vehicle_id.id,
|
||||
'cost_subtype': contract.cost_subtype.id,
|
||||
'contract_id': contract.id,
|
||||
'auto_generated': True
|
||||
}
|
||||
cost_id = self.pool.get('fleet.vehicle.cost').create(cr, uid, data, context=context)
|
||||
startdate += deltas.get(contract.cost_frequency)
|
||||
return True
|
||||
|
||||
def scheduler_manage_contract_expiration(self, cr, uid, context=None):
|
||||
#This method is called by a cron task
|
||||
#It manages the state of a contract, possibly by posting a message on the vehicle concerned and updating its status
|
||||
datetime_today = datetime.datetime.strptime(fields.date.context_today(self, cr, uid, context=context), tools.DEFAULT_SERVER_DATE_FORMAT)
|
||||
limit_date = (datetime_today + relativedelta(days=+15)).strftime(tools.DEFAULT_SERVER_DATE_FORMAT)
|
||||
ids = self.search(cr, uid, ['&', ('state', '=', 'open'), ('expiration_date', '<', limit_date)], offset=0, limit=None, order=None, context=context, count=False)
|
||||
res = {}
|
||||
for contract in self.browse(cr, uid, ids, context=context):
|
||||
if contract.vehicle_id.id in res:
|
||||
res[contract.vehicle_id.id] += 1
|
||||
else:
|
||||
res[contract.vehicle_id.id] = 1
|
||||
|
||||
for vehicle, value in res.items():
|
||||
self.pool.get('fleet.vehicle').message_post(cr, uid, vehicle, body=_('%s contract(s) need(s) to be renewed and/or closed!') % (str(value)), context=context)
|
||||
return self.write(cr, uid, ids, {'state': 'toclose'}, context=context)
|
||||
|
||||
def run_scheduler(self, cr, uid, context=None):
|
||||
self.scheduler_manage_auto_costs(cr, uid, context=context)
|
||||
self.scheduler_manage_contract_expiration(cr, uid, context=context)
|
||||
return True
|
||||
|
||||
def _vehicle_contract_name_get_fnc(self, cr, uid, ids, prop, unknow_none, context=None):
|
||||
res = {}
|
||||
for record in self.browse(cr, uid, ids, context=context):
|
||||
name = record.vehicle_id.name
|
||||
if record.cost_subtype.name:
|
||||
name += ' / '+ record.cost_subtype.name
|
||||
if record.date:
|
||||
name += ' / '+ record.date
|
||||
res[record.id] = name
|
||||
return res
|
||||
|
||||
def on_change_vehicle(self, cr, uid, ids, vehicle_id, context=None):
|
||||
if not vehicle_id:
|
||||
return {}
|
||||
odometer_unit = self.pool.get('fleet.vehicle').browse(cr, uid, vehicle_id, context=context).odometer_unit
|
||||
return {
|
||||
'value': {
|
||||
'odometer_unit': odometer_unit,
|
||||
}
|
||||
}
|
||||
|
||||
def compute_next_year_date(self, strdate):
|
||||
oneyear = datetime.timedelta(days=365)
|
||||
curdate = str_to_datetime(strdate)
|
||||
return datetime.datetime.strftime(curdate + oneyear, tools.DEFAULT_SERVER_DATE_FORMAT)
|
||||
|
||||
def on_change_start_date(self, cr, uid, ids, strdate, enddate, context=None):
|
||||
if (strdate):
|
||||
return {'value': {'expiration_date': self.compute_next_year_date(strdate),}}
|
||||
return {}
|
||||
|
||||
def get_days_left(self, cr, uid, ids, prop, unknow_none, context=None):
|
||||
"""return a dict with as value for each contract an integer
|
||||
if contract is in an open state and is overdue, return 0
|
||||
if contract is in a closed state, return -1
|
||||
otherwise return the number of days before the contract expires
|
||||
"""
|
||||
res = {}
|
||||
for record in self.browse(cr, uid, ids, context=context):
|
||||
if (record.expiration_date and (record.state == 'open' or record.state == 'toclose')):
|
||||
today = str_to_datetime(time.strftime(tools.DEFAULT_SERVER_DATE_FORMAT))
|
||||
renew_date = str_to_datetime(record.expiration_date)
|
||||
diff_time = (renew_date-today).days
|
||||
res[record.id] = diff_time > 0 and diff_time or 0
|
||||
else:
|
||||
res[record.id] = -1
|
||||
return res
|
||||
|
||||
def act_renew_contract(self, cr, uid, ids, context=None):
|
||||
assert len(ids) == 1, "This operation should only be done for 1 single contract at a time, as it it suppose to open a window as result"
|
||||
for element in self.browse(cr, uid, ids, context=context):
|
||||
#compute end date
|
||||
startdate = str_to_datetime(element.start_date)
|
||||
enddate = str_to_datetime(element.expiration_date)
|
||||
diffdate = (enddate - startdate)
|
||||
default = {
|
||||
'date': fields.date.context_today(self, cr, uid, context=context),
|
||||
'start_date': datetime.datetime.strftime(str_to_datetime(element.expiration_date) + datetime.timedelta(days=1), tools.DEFAULT_SERVER_DATE_FORMAT),
|
||||
'expiration_date': datetime.datetime.strftime(enddate + diffdate, tools.DEFAULT_SERVER_DATE_FORMAT),
|
||||
}
|
||||
newid = super(fleet_vehicle_log_contract, self).copy(cr, uid, [element.id], default, context=context)
|
||||
mod, modid = self.pool.get('ir.model.data').get_object_reference(cr, uid, 'fleet', 'fleet_vehicle_log_contract_form')
|
||||
return {
|
||||
'name':_("Renew Contract"),
|
||||
'view_mode': 'form',
|
||||
'view_id': modid,
|
||||
'view_type': 'tree,form',
|
||||
'res_model': 'fleet.vehicle.log.contract',
|
||||
'type': 'ir.actions.act_window',
|
||||
'nodestroy': True,
|
||||
'domain': '[]',
|
||||
'res_id': newid,
|
||||
'context': {'active_id':newid},
|
||||
}
|
||||
|
||||
def _get_default_contract_type(self, cr, uid, context=None):
|
||||
try:
|
||||
model, model_id = self.pool.get('ir.model.data').get_object_reference(cr, uid, 'fleet', 'type_contract_leasing')
|
||||
except ValueError:
|
||||
model_id = False
|
||||
return model_id
|
||||
|
||||
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:
|
||||
totalsum += element[2].get('amount', 0.0)
|
||||
return {
|
||||
'value': {
|
||||
'sum_cost': totalsum,
|
||||
}
|
||||
}
|
||||
|
||||
def _get_sum_cost(self, cr, uid, ids, field_name, arg, context=None):
|
||||
res = {}
|
||||
for contract in self.browse(cr, uid, ids, context=context):
|
||||
totalsum = 0
|
||||
for cost in contract.cost_ids:
|
||||
totalsum += cost.amount
|
||||
res[contract.id] = totalsum
|
||||
return res
|
||||
|
||||
_inherits = {'fleet.vehicle.cost': 'cost_id'}
|
||||
_name = 'fleet.vehicle.log.contract'
|
||||
_description = 'Contract information on a vehicle'
|
||||
_order='state desc,expiration_date'
|
||||
_columns = {
|
||||
'name': fields.function(_vehicle_contract_name_get_fnc, type="text", string='Name', store=True),
|
||||
'start_date': fields.date('Contract Start Date', help='Date when the coverage of the contract begins'),
|
||||
'expiration_date': fields.date('Contract Expiration Date', help='Date when the coverage of the contract expirates (by default, one year after begin date)'),
|
||||
'days_left': fields.function(get_days_left, type='integer', string='Warning Date'),
|
||||
'insurer_id' :fields.many2one('res.partner', 'Supplier'),
|
||||
'purchaser_id': fields.many2one('res.partner', 'Contractor', help='Person to which the contract is signed for'),
|
||||
'ins_ref': fields.char('Contract Reference', size=64),
|
||||
'state': fields.selection([('open', 'In Progress'), ('toclose','To Close'), ('closed', 'Terminated')], 'Status', readonly=True, help='Choose wheter the contract is still valid or not'),
|
||||
'notes': fields.text('Terms and Conditions', help='Write here all supplementary informations relative to this contract'),
|
||||
'cost_generated': fields.float('Recurring Cost Amount', help="Costs paid at regular intervals, depending on the cost frequency. If the cost frequency is set to unique, the cost will be logged at the start date"),
|
||||
'cost_frequency': fields.selection([('no','No'), ('daily', 'Daily'), ('weekly','Weekly'), ('monthly','Monthly'), ('yearly','Yearly')], 'Recurring Cost Frequency', help='Frequency of the recuring cost', required=True),
|
||||
'generated_cost_ids': fields.one2many('fleet.vehicle.cost', 'contract_id', 'Generated Costs', ondelete='cascade'),
|
||||
'sum_cost': fields.function(_get_sum_cost, type='float', string='Indicative Costs Total'),
|
||||
'cost_amount': fields.related('cost_id', 'amount', string='Amount', type='float', store=True), #we need to keep this field as a related with store=True because the graph view doesn't support (1) to address fields from inherited table and (2) fields that aren't stored in database
|
||||
}
|
||||
_defaults = {
|
||||
'purchaser_id': lambda self, cr, uid, ctx: uid,
|
||||
'date': fields.date.context_today,
|
||||
'start_date': fields.date.context_today,
|
||||
'state':'open',
|
||||
'expiration_date': lambda self, cr, uid, ctx: self.compute_next_year_date(fields.date.context_today(self, cr, uid, context=ctx)),
|
||||
'cost_frequency': 'no',
|
||||
'cost_subtype': _get_default_contract_type,
|
||||
'cost_type': 'contract',
|
||||
}
|
||||
|
||||
def copy(self, cr, uid, id, default=None, context=None):
|
||||
if default is None:
|
||||
default = {}
|
||||
today = fields.date.context_today(self, cr, uid, context=context)
|
||||
default['date'] = today
|
||||
default['start_date'] = today
|
||||
default['expiration_date'] = self.compute_next_year_date(today)
|
||||
default['ins_ref'] = ''
|
||||
default['state'] = 'open'
|
||||
default['notes'] = ''
|
||||
return super(fleet_vehicle_log_contract, self).copy(cr, uid, id, default, context=context)
|
||||
|
||||
def contract_close(self, cr, uid, ids, context=None):
|
||||
return self.write(cr, uid, ids, {'state': 'closed'}, context=context)
|
||||
|
||||
def contract_open(self, cr, uid, ids, context=None):
|
||||
return self.write(cr, uid, ids, {'state': 'open'}, context=context)
|
||||
|
||||
class fleet_contract_state(osv.Model):
|
||||
_name = 'fleet.contract.state'
|
||||
_description = 'Contains the different possible status of a leasing contract'
|
||||
|
||||
_columns = {
|
||||
'name':fields.char('Contract Status', size=64, required=True),
|
||||
}
|
|
@ -0,0 +1,151 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<openerp>
|
||||
<data>
|
||||
<record model="ir.actions.act_window" id="action_fleet_vehicle_log_fuel_graph">
|
||||
<field name="name">Fuel Costs by Month</field>
|
||||
<field name="res_model">fleet.vehicle.cost</field>
|
||||
<field name="view_id" ref="fleet_vehicle_costs_graph"></field>
|
||||
<field name="view_type">form</field>
|
||||
<field name="view_mode">tree</field>
|
||||
<field name="domain">['&',('parent_id','=',False),('cost_type','=','fuel')]</field>
|
||||
</record>
|
||||
|
||||
<record model="ir.actions.act_window" id="action_fleet_vehicle_log_services_graph">
|
||||
<field name="name">Services Costs by Month</field>
|
||||
<field name="res_model">fleet.vehicle.cost</field>
|
||||
<field name="view_id" ref="fleet_vehicle_costs_graph" />
|
||||
<field name="view_type">form</field>
|
||||
<field name="view_mode">tree</field>
|
||||
<field name="domain">['&',('parent_id','=',False),('cost_type','=','services')]</field>
|
||||
</record>
|
||||
|
||||
<record model="ir.actions.act_window" id="action_fleet_vehicle_log_contract_graph">
|
||||
<field name="name">Contracts Costs by Month</field>
|
||||
<field name="res_model">fleet.vehicle.cost</field>
|
||||
<field name="view_id" ref="fleet_vehicle_costs_graph"></field>
|
||||
<field name="view_type">form</field>
|
||||
<field name="view_mode">tree</field>
|
||||
<field name="domain">['&',('parent_id','=',False),('cost_type','=','contract')]</field>
|
||||
</record>
|
||||
|
||||
<record model="ir.actions.act_window" id="action_fleet_vehicle_costs_graph">
|
||||
<field name="name">Costs by Month</field>
|
||||
<field name="res_model">fleet.vehicle.cost</field>
|
||||
<field name="view_id" ref="fleet_vehicle_costs_graph"></field>
|
||||
<field name="view_type">form</field>
|
||||
<field name="view_mode">tree</field>
|
||||
<field name="domain">[('parent_id','=',False)]</field>
|
||||
</record>
|
||||
|
||||
<record model="ir.actions.act_window" id="action_fleet_vehicle_kanban">
|
||||
<field name="name">Vehicles with alerts</field>
|
||||
<field name="res_model">fleet.vehicle</field>
|
||||
<field name="view_id" ref="fleet_vehicle_kanban"></field>
|
||||
<field name="view_type">form</field>
|
||||
<field name="view_mode">tree</field>
|
||||
<field name="domain">['|',('contract_renewal_due_soon','=',True),('contract_renewal_overdue','=',True)]</field>
|
||||
<field name="help" type="html">
|
||||
<p>
|
||||
Here are displayed vehicles for which one or more contracts need to be renewed. If you see this message, then there is no contracts to renew.
|
||||
</p>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record model="ir.actions.act_window" id="action_fleet_reporting_costs">
|
||||
<field name="name">Costs Analysis</field>
|
||||
<field name="res_model">fleet.vehicle.cost</field>
|
||||
<field name="view_id" ref="fleet_vehicle_costs_tree"></field>
|
||||
<field name="view_type">form</field>
|
||||
<field name="view_mode">tree</field>
|
||||
<field name="context">{"search_default_parent_false" : True,"search_default_groupby_year" : True,"search_default_groupby_cost_type" : 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
|
||||
Costs are generally created from services and contract and appears here.
|
||||
</p>
|
||||
<p>
|
||||
Thanks to the different filters, OpenERP can only print the effective
|
||||
costs, sort them by type and by vehicle.
|
||||
</p>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record model="ir.actions.act_window" id="action_fleet_reporting_costs_non_effective">
|
||||
<field name="name">Indicative Costs Analysis</field>
|
||||
<field name="res_model">fleet.vehicle.cost</field>
|
||||
<field name="view_id" ref="fleet_vehicle_costs_tree"></field>
|
||||
<field name="view_type">form</field>
|
||||
<field name="view_mode">tree</field>
|
||||
<field name="context">{"search_default_parent_true" : True,"search_default_groupby_cost_subtype" : True,"search_default_groupby_cost_type" : True,"search_default_groupby_parent_id" : True,}</field>
|
||||
<field name="help" type="html">
|
||||
<p>
|
||||
OpenERP 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
|
||||
costs, sort them by type and by vehicle.
|
||||
</p>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="board_fleet_form" model="ir.ui.view">
|
||||
<field name="name">board.fleet.form</field>
|
||||
<field name="model">board.board</field>
|
||||
<field name="arch" type="xml">
|
||||
<form string="Fleet Dashboard" version="7.0">
|
||||
<board style="2-1">
|
||||
<column>
|
||||
<action string="Vehicles With Alerts" name="%(fleet.action_fleet_vehicle_kanban)d" view_mode="kanban"/>
|
||||
<action string="Costs by Month" name="%(fleet.action_fleet_vehicle_costs_graph)d" view_mode="graph,tree"/>
|
||||
</column>
|
||||
<column>
|
||||
<action string="Fuel Costs" name="%(fleet.action_fleet_vehicle_log_fuel_graph)d" view_mode="graph,tree"/>
|
||||
<action string="Services Costs" name="%(fleet.action_fleet_vehicle_log_services_graph)d" view_mode="graph,tree"/>
|
||||
<action string="Contracts Costs" name="%(fleet.action_fleet_vehicle_log_contract_graph)d" view_mode="graph,tree"/>
|
||||
</column>
|
||||
</board>
|
||||
</form>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="open_board_fleet" model="ir.actions.act_window">
|
||||
<field name="name">Fleet</field>
|
||||
<field name="res_model">board.board</field>
|
||||
<field name="view_type">form</field>
|
||||
<field name="view_mode">form</field>
|
||||
<field name="usage">menu</field>
|
||||
<field name="view_id" ref="board_fleet_form"/>
|
||||
<field name="help" type="html">
|
||||
<div class="oe_empty_custom_dashboard">
|
||||
<p>
|
||||
<b>Fleet dashboard is empty.</b>
|
||||
</p><p>
|
||||
To add your first report into this dashboard, go to any
|
||||
menu, switch to list or graph view, and click <i>'Add to
|
||||
Dashboard'</i> in the extended search options.
|
||||
</p><p>
|
||||
You can filter and group data before inserting into the
|
||||
dashboard using the search options.
|
||||
</p>
|
||||
</div>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<menuitem id="menu_fleet_dashboard"
|
||||
parent="base.menu_reporting_dashboard"
|
||||
action="open_board_fleet"
|
||||
sequence="50"/>
|
||||
|
||||
<menuitem name="Fleet" parent="base.menu_reporting" id="menu_fleet_reporting" sequence="50" />
|
||||
|
||||
<menuitem id="menu_fleet_reporting_costs"
|
||||
parent="menu_fleet_reporting"
|
||||
action="action_fleet_reporting_costs"
|
||||
sequence="1"/>
|
||||
<menuitem id="menu_fleet_reporting_indicative_costs"
|
||||
parent="menu_fleet_reporting"
|
||||
action="action_fleet_reporting_costs_non_effective"
|
||||
sequence="2"/>
|
||||
</data>
|
||||
</openerp>
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,440 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<openerp>
|
||||
<data noupdate="0">
|
||||
<!--
|
||||
<record forcecreate="True" id="ir_cron_service_services_reminders" model="ir.cron">
|
||||
<field name="name">Creation of Vehicle services and Services renewals reminders</field>
|
||||
<field eval="True" name="active" />
|
||||
<field name="user_id" ref="base.user_root" />
|
||||
<field name="interval_number">1</field>
|
||||
<field name="interval_type">days</field>
|
||||
<field name="numbercall">-1</field>
|
||||
<field eval="False" name="doall" />
|
||||
<field eval="'fleet.vehicle'" name="model" />
|
||||
<field eval="'run_scheduler'" name="function" />
|
||||
<field eval="'()'" name="args" />
|
||||
</record>
|
||||
-->
|
||||
|
||||
<record forcecreate="True" id="ir_cron_contract_costs_generator" model="ir.cron">
|
||||
<field name="name">Generation of contracts costs based on the costs frequency</field>
|
||||
<field eval="True" name="active" />
|
||||
<field name="user_id" ref="base.user_root" />
|
||||
<field name="interval_number">1</field>
|
||||
<field name="interval_type">days</field>
|
||||
<field name="numbercall">-1</field>
|
||||
<field eval="False" name="doall" />
|
||||
<field eval="'fleet.vehicle.log.contract'" name="model" />
|
||||
<field eval="'run_scheduler'" name="function" />
|
||||
<field eval="'()'" name="args" />
|
||||
</record>
|
||||
|
||||
<record id="type_service_service_1" model="fleet.service.type">
|
||||
<field name="name">Calculation Benefit In Kind</field>
|
||||
<field name="category">service</field>
|
||||
</record>
|
||||
|
||||
<record id="type_service_service_2" model="fleet.service.type">
|
||||
<field name="name">Depreciation and Interests</field>
|
||||
<field name="category">service</field>
|
||||
</record>
|
||||
|
||||
<record id="type_service_service_3" model="fleet.service.type">
|
||||
<field name="name">Tax roll</field>
|
||||
<field name="category">service</field>
|
||||
</record>
|
||||
|
||||
<record id="type_service_service_5" model="fleet.service.type">
|
||||
<field name="name">Summer tires</field>
|
||||
<field name="category">service</field>
|
||||
</record>
|
||||
|
||||
<record id="type_service_service_6" model="fleet.service.type">
|
||||
<field name="name">Snow tires</field>
|
||||
<field name="category">service</field>
|
||||
</record>
|
||||
|
||||
<record id="type_service_service_7" model="fleet.service.type">
|
||||
<field name="name">Summer tires</field>
|
||||
<field name="category">service</field>
|
||||
</record>
|
||||
|
||||
<record id="type_service_service_8" model="fleet.service.type">
|
||||
<field name="name">Repair and maintenance</field>
|
||||
<field name="category">service</field>
|
||||
</record>
|
||||
|
||||
<record id="type_service_service_9" model="fleet.service.type">
|
||||
<field name="name">Assistance</field>
|
||||
<field name="category">service</field>
|
||||
</record>
|
||||
|
||||
<record id="type_service_service_10" model="fleet.service.type">
|
||||
<field name="name">Replacement Vehicle</field>
|
||||
<field name="category">service</field>
|
||||
</record>
|
||||
|
||||
<record id="type_service_service_11" model="fleet.service.type">
|
||||
<field name="name">Management Fee</field>
|
||||
<field name="category">service</field>
|
||||
</record>
|
||||
|
||||
<record id="type_service_service_12" model="fleet.service.type">
|
||||
<field name="name">Rent (Excluding VAT)</field>
|
||||
<field name="category">service</field>
|
||||
</record>
|
||||
|
||||
<record id="type_service_service_13" model="fleet.service.type">
|
||||
<field name="name">Entry into service tax</field>
|
||||
<field name="category">service</field>
|
||||
</record>
|
||||
|
||||
<record id="type_service_service_14" model="fleet.service.type">
|
||||
<field name="name">Total expenses (Excluding VAT)</field>
|
||||
<field name="category">service</field>
|
||||
</record>
|
||||
|
||||
<record id="type_service_service_15" model="fleet.service.type">
|
||||
<field name="name">Residual value (Excluding VAT)</field>
|
||||
<field name="category">service</field>
|
||||
</record>
|
||||
|
||||
<record id="type_service_service_16" model="fleet.service.type">
|
||||
<field name="name">Options</field>
|
||||
<field name="category">service</field>
|
||||
</record>
|
||||
|
||||
<record id="type_service_service_17" model="fleet.service.type">
|
||||
<field name="name">Emissions</field>
|
||||
<field name="category">service</field>
|
||||
</record>
|
||||
|
||||
<record id="type_service_service_18" model="fleet.service.type">
|
||||
<field name="name">Touring Assistance</field>
|
||||
<field name="category">service</field>
|
||||
</record>
|
||||
|
||||
<record id="type_service_service_19" model="fleet.service.type">
|
||||
<field name="name">Residual value in %</field>
|
||||
<field name="category">service</field>
|
||||
</record>
|
||||
|
||||
<record id="type_service_1" model="fleet.service.type">
|
||||
<field name="name">A/C Compressor Replacement</field>
|
||||
<field name="category">service</field>
|
||||
</record>
|
||||
|
||||
<record id="type_service_2" model="fleet.service.type">
|
||||
<field name="name">A/C Condenser Replacement</field>
|
||||
<field name="category">service</field>
|
||||
</record>
|
||||
|
||||
<record id="type_service_3" model="fleet.service.type">
|
||||
<field name="name">A/C Diagnosis</field>
|
||||
<field name="category">service</field>
|
||||
</record>
|
||||
|
||||
<record id="type_service_4" model="fleet.service.type">
|
||||
<field name="name">A/C Evaporator Replacement</field>
|
||||
<field name="category">service</field>
|
||||
</record>
|
||||
|
||||
<record id="type_service_5" model="fleet.service.type">
|
||||
<field name="name">A/C Recharge</field>
|
||||
<field name="category">service</field>
|
||||
</record>
|
||||
|
||||
<record id="type_service_6" model="fleet.service.type">
|
||||
<field name="name">Air Filter Replacement</field>
|
||||
<field name="category">service</field>
|
||||
</record>
|
||||
|
||||
<record id="type_service_7" model="fleet.service.type">
|
||||
<field name="name">Alternator Replacement</field>
|
||||
<field name="category">service</field>
|
||||
</record>
|
||||
|
||||
<record id="type_service_8" model="fleet.service.type">
|
||||
<field name="name">Ball Joint Replacement</field>
|
||||
<field name="category">service</field>
|
||||
</record>
|
||||
|
||||
<record id="type_service_9" model="fleet.service.type">
|
||||
<field name="name">Battery Inspection</field>
|
||||
<field name="category">service</field>
|
||||
</record>
|
||||
|
||||
<record id="type_service_10" model="fleet.service.type">
|
||||
<field name="name">Battery Replacement</field>
|
||||
<field name="category">service</field>
|
||||
</record>
|
||||
|
||||
<record id="type_service_11" model="fleet.service.type">
|
||||
<field name="name">Brake Caliper Replacement</field>
|
||||
<field name="category">service</field>
|
||||
</record>
|
||||
|
||||
<record id="type_service_12" model="fleet.service.type">
|
||||
<field name="name">Brake Inspection</field>
|
||||
<field name="category">service</field>
|
||||
</record>
|
||||
|
||||
<record id="type_service_13" model="fleet.service.type">
|
||||
<field name="name">Brake Pad(s) Replacement</field>
|
||||
<field name="category">service</field>
|
||||
</record>
|
||||
|
||||
<record id="type_service_14" model="fleet.service.type">
|
||||
<field name="name">Car Wash</field>
|
||||
<field name="category">service</field>
|
||||
</record>
|
||||
|
||||
<record id="type_service_15" model="fleet.service.type">
|
||||
<field name="name">Catalytic Converter Replacement</field>
|
||||
<field name="category">service</field>
|
||||
</record>
|
||||
|
||||
<record id="type_service_16" model="fleet.service.type">
|
||||
<field name="name">Charging System Diagnosis</field>
|
||||
<field name="category">service</field>
|
||||
</record>
|
||||
|
||||
<record id="type_service_17" model="fleet.service.type">
|
||||
<field name="name">Door Window Motor/Regulator Replacement</field>
|
||||
<field name="category">service</field>
|
||||
</record>
|
||||
|
||||
<record id="type_service_18" model="fleet.service.type">
|
||||
<field name="name">Engine Belt Inspection</field>
|
||||
<field name="category">service</field>
|
||||
</record>
|
||||
|
||||
<record id="type_service_19" model="fleet.service.type">
|
||||
<field name="name">Engine Coolant Replacement</field>
|
||||
<field name="category">service</field>
|
||||
</record>
|
||||
|
||||
<record id="type_service_20" model="fleet.service.type">
|
||||
<field name="name">Engine/Drive Belt(s) Replacement</field>
|
||||
<field name="category">service</field>
|
||||
</record>
|
||||
|
||||
<record id="type_service_21" model="fleet.service.type">
|
||||
<field name="name">Exhaust Manifold Replacement</field>
|
||||
<field name="category">service</field>
|
||||
</record>
|
||||
|
||||
<record id="type_service_22" model="fleet.service.type">
|
||||
<field name="name">Fuel Injector Replacement</field>
|
||||
<field name="category">service</field>
|
||||
</record>
|
||||
|
||||
<record id="type_service_23" model="fleet.service.type">
|
||||
<field name="name">Fuel Pump Replacement</field>
|
||||
<field name="category">service</field>
|
||||
</record>
|
||||
|
||||
<record id="type_service_24" model="fleet.service.type">
|
||||
<field name="name">Head Gasket(s) Replacement</field>
|
||||
<field name="category">service</field>
|
||||
</record>
|
||||
|
||||
<record id="type_service_25" model="fleet.service.type">
|
||||
<field name="name">Heater Blower Motor Replacement</field>
|
||||
<field name="category">service</field>
|
||||
</record>
|
||||
|
||||
<record id="type_service_26" model="fleet.service.type">
|
||||
<field name="name">Heater Control Valve Replacement</field>
|
||||
<field name="category">service</field>
|
||||
</record>
|
||||
|
||||
<record id="type_service_27" model="fleet.service.type">
|
||||
<field name="name">Heater Core Replacement</field>
|
||||
<field name="category">service</field>
|
||||
</record>
|
||||
|
||||
<record id="type_service_28" model="fleet.service.type">
|
||||
<field name="name">Heater Hose Replacement</field>
|
||||
<field name="category">service</field>
|
||||
</record>
|
||||
|
||||
<record id="type_service_29" model="fleet.service.type">
|
||||
<field name="name">Ignition Coil Replacement</field>
|
||||
<field name="category">service</field>
|
||||
</record>
|
||||
|
||||
<record id="type_service_30" model="fleet.service.type">
|
||||
<field name="name">Intake Manifold Gasket Replacement</field>
|
||||
<field name="category">service</field>
|
||||
</record>
|
||||
|
||||
<record id="type_service_31" model="fleet.service.type">
|
||||
<field name="name">Oil Change</field>
|
||||
<field name="category">service</field>
|
||||
</record>
|
||||
|
||||
<record id="type_service_32" model="fleet.service.type">
|
||||
<field name="name">Oil Pump Replacement</field>
|
||||
<field name="category">service</field>
|
||||
</record>
|
||||
|
||||
<record id="type_service_33" model="fleet.service.type">
|
||||
<field name="name">Other Maintenance</field>
|
||||
<field name="category">service</field>
|
||||
</record>
|
||||
|
||||
<record id="type_service_34" model="fleet.service.type">
|
||||
<field name="name">Oxygen Sensor Replacement</field>
|
||||
<field name="category">service</field>
|
||||
</record>
|
||||
|
||||
<record id="type_service_35" model="fleet.service.type">
|
||||
<field name="name">Power Steering Hose Replacement</field>
|
||||
<field name="category">service</field>
|
||||
</record>
|
||||
|
||||
<record id="type_service_36" model="fleet.service.type">
|
||||
<field name="name">Power Steering Pump Replacement</field>
|
||||
<field name="category">service</field>
|
||||
</record>
|
||||
|
||||
<record id="type_service_37" model="fleet.service.type">
|
||||
<field name="name">Radiator Repair</field>
|
||||
<field name="category">service</field>
|
||||
</record>
|
||||
|
||||
<record id="type_service_38" model="fleet.service.type">
|
||||
<field name="name">Resurface Rotors</field>
|
||||
<field name="category">service</field>
|
||||
</record>
|
||||
|
||||
<record id="type_service_39" model="fleet.service.type">
|
||||
<field name="name">Rotate Tires</field>
|
||||
<field name="category">service</field>
|
||||
</record>
|
||||
|
||||
<record id="type_service_40" model="fleet.service.type">
|
||||
<field name="name">Rotor Replacement</field>
|
||||
<field name="category">service</field>
|
||||
</record>
|
||||
|
||||
<record id="type_service_41" model="fleet.service.type">
|
||||
<field name="name">Spark Plug Replacement</field>
|
||||
<field name="category">service</field>
|
||||
</record>
|
||||
|
||||
<record id="type_service_42" model="fleet.service.type">
|
||||
<field name="name">Starter Replacement</field>
|
||||
<field name="category">service</field>
|
||||
</record>
|
||||
|
||||
<record id="type_service_43" model="fleet.service.type">
|
||||
<field name="name">Thermostat Replacement</field>
|
||||
<field name="category">service</field>
|
||||
</record>
|
||||
|
||||
<record id="type_service_44" model="fleet.service.type">
|
||||
<field name="name">Tie Rod End Replacement</field>
|
||||
<field name="category">service</field>
|
||||
</record>
|
||||
|
||||
<record id="type_service_45" model="fleet.service.type">
|
||||
<field name="name">Tire Replacement</field>
|
||||
<field name="category">service</field>
|
||||
</record>
|
||||
|
||||
<record id="type_service_46" model="fleet.service.type">
|
||||
<field name="name">Tire Service</field>
|
||||
<field name="category">service</field>
|
||||
</record>
|
||||
|
||||
<record id="type_service_47" model="fleet.service.type">
|
||||
<field name="name">Transmission Filter Replacement</field>
|
||||
<field name="category">service</field>
|
||||
</record>
|
||||
|
||||
<record id="type_service_48" model="fleet.service.type">
|
||||
<field name="name">Transmission Fluid Replacement</field>
|
||||
<field name="category">service</field>
|
||||
</record>
|
||||
|
||||
<record id="type_service_49" model="fleet.service.type">
|
||||
<field name="name">Transmission Replacement</field>
|
||||
<field name="category">service</field>
|
||||
</record>
|
||||
|
||||
<record id="type_service_50" model="fleet.service.type">
|
||||
<field name="name">Water Pump Replacement</field>
|
||||
<field name="category">service</field>
|
||||
</record>
|
||||
|
||||
<record id="type_service_51" model="fleet.service.type">
|
||||
<field name="name">Wheel Alignment</field>
|
||||
<field name="category">service</field>
|
||||
</record>
|
||||
|
||||
<record id="type_service_52" model="fleet.service.type">
|
||||
<field name="name">Wheel Bearing Replacement</field>
|
||||
<field name="category">service</field>
|
||||
</record>
|
||||
|
||||
<record id="type_service_53" model="fleet.service.type">
|
||||
<field name="name">Windshield Wiper(s) Replacement</field>
|
||||
<field name="category">service</field>
|
||||
</record>
|
||||
|
||||
|
||||
<record id="type_contract_omnium" model="fleet.service.type">
|
||||
<field name="name">Omnium</field>
|
||||
<field name="category">contract</field>
|
||||
</record>
|
||||
|
||||
<record id="type_contract_leasing" model="fleet.service.type">
|
||||
<field name="name">Leasing</field>
|
||||
<field name="category">contract</field>
|
||||
</record>
|
||||
|
||||
<record id="type_contract_repairing" model="fleet.service.type">
|
||||
<field name="name">Repairing</field>
|
||||
<field name="category">both</field>
|
||||
</record>
|
||||
|
||||
<record id="type_service_refueling" model="fleet.service.type">
|
||||
<field name="name">Refueling</field>
|
||||
<field name="category">service</field>
|
||||
</record>
|
||||
|
||||
<record id="vehicle_tag_junior" model="fleet.vehicle.tag" >
|
||||
<field name="name">Junior</field>
|
||||
</record>
|
||||
|
||||
<record id="vehicle_tag_senior" model="fleet.vehicle.tag" >
|
||||
<field name="name">Senior</field>
|
||||
</record>
|
||||
|
||||
<record id="vehicle_tag_leasing" model="fleet.vehicle.tag" >
|
||||
<field name="name">Employee Car</field>
|
||||
</record>
|
||||
|
||||
<record id="vehicle_tag_purchased" model="fleet.vehicle.tag" >
|
||||
<field name="name">Purchased</field>
|
||||
</record>
|
||||
|
||||
<record id="vehicle_tag_compact" model="fleet.vehicle.tag" >
|
||||
<field name="name">Compact</field>
|
||||
</record>
|
||||
|
||||
<record id="vehicle_tag_sedan" model="fleet.vehicle.tag" >
|
||||
<field name="name">Sedan</field>
|
||||
</record>
|
||||
|
||||
<record id="vehicle_tag_convertible" model="fleet.vehicle.tag" >
|
||||
<field name="name">Convertible</field>
|
||||
</record>
|
||||
|
||||
<record id="vehicle_tag_break" model="fleet.vehicle.tag" >
|
||||
<field name="name">Break</field>
|
||||
</record>
|
||||
</data>
|
||||
</openerp>
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,907 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<openerp>
|
||||
<data>
|
||||
<record model='ir.ui.view' id='fleet_vehicle_model_form'>
|
||||
<field name="name">fleet.vehicle.model.form</field>
|
||||
<field name="model">fleet.vehicle.model</field>
|
||||
<field name="arch" type="xml">
|
||||
<form string="Model" version="7.0">
|
||||
<sheet>
|
||||
<field name="image_medium" widget='image' class="oe_left oe_avatar"/>
|
||||
<group col="2">
|
||||
<group>
|
||||
<field name="brand" on_change="on_change_brand(brand)"/>
|
||||
</group>
|
||||
<group>
|
||||
<field name="modelname" />
|
||||
</group>
|
||||
</group>
|
||||
<notebook>
|
||||
<page string="Vendors">
|
||||
<field name="vendors" widget="many2many_kanban"/>
|
||||
</page>
|
||||
</notebook>
|
||||
</sheet>
|
||||
</form>
|
||||
</field>
|
||||
</record>
|
||||
<record model='ir.ui.view' id='fleet_vehicle_model_tree'>
|
||||
<field name="name">fleet.vehicle.model.tree</field>
|
||||
<field name="model">fleet.vehicle.model</field>
|
||||
<field name="arch" type="xml">
|
||||
<tree string="Models" version="7.0">
|
||||
<field name="brand" />
|
||||
<field name="modelname" />
|
||||
</tree>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record model='ir.actions.act_window' id='fleet_vehicle_model_act'>
|
||||
<field name="name">Vehicle Model</field>
|
||||
<field name="res_model">fleet.vehicle.model</field>
|
||||
<field name="view_type">form</field>
|
||||
<field name="view_mode">tree,form</field>
|
||||
<field name="help" type="html">
|
||||
<p class="oe_view_nocontent_create">
|
||||
Click to create a new model.
|
||||
</p><p>
|
||||
You can define several models (e.g. A3, A4) for each brand (Audi).
|
||||
</p>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record model='ir.ui.view' id='fleet_vehicle_model_brand_tree'>
|
||||
<field name="name">fleet.vehicle.model.brand.tree</field>
|
||||
<field name="model">fleet.vehicle.model.brand</field>
|
||||
<field name="arch" type="xml">
|
||||
<tree string="Model Brand" version="7.0">
|
||||
<field name="name" />
|
||||
</tree>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record model='ir.ui.view' id='fleet_vehicle_model_brand_form'>
|
||||
<field name="name">fleet.vehicle.model.brand.form</field>
|
||||
<field name="model">fleet.vehicle.model.brand</field>
|
||||
<field name="arch" type="xml">
|
||||
<form string="Model Brand" version="7.0">
|
||||
<sheet>
|
||||
<group>
|
||||
<div>
|
||||
<field name="image_medium" widget="image" class="oe_left oe_avatar"/>
|
||||
<label for="name" class="oe_edit_only"/>
|
||||
<h1>
|
||||
<field name="name" class="oe_inline" />
|
||||
</h1>
|
||||
</div>
|
||||
</group>
|
||||
</sheet>
|
||||
</form>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record model='ir.ui.view' id='fleet_vehicle_model_brand_kanban'>
|
||||
<field name="name">fleet.vehicle.model.brandkanban</field>
|
||||
<field name="model">fleet.vehicle.model.brand</field>
|
||||
<field name="arch" type="xml">
|
||||
<kanban>
|
||||
<field name="name" />
|
||||
<field name="image" />
|
||||
<templates>
|
||||
<t t-name="kanban-box">
|
||||
<div class="oe_kanban_vignette oe_semantic_html_override">
|
||||
<a type="open" href="#" class="oe_kanban_action oe_kanban_action_a">
|
||||
<img t-att-src="kanban_image('fleet.vehicle.model.brand', 'image_small', record.id.value)" class="oe_employee_picture"/>
|
||||
</a>
|
||||
<div style="text-align:center;">
|
||||
<h4 class="oe_partner_heading">
|
||||
<a type="open">
|
||||
<field name="name"/>
|
||||
</a>
|
||||
</h4>
|
||||
</div>
|
||||
</div>
|
||||
<script>
|
||||
$('.oe_picture').load(function() { if($(this).width() > $(this).height()) { $(this).addClass('oe_employee_picture_wide') } });
|
||||
</script>
|
||||
</t>
|
||||
</templates>
|
||||
</kanban>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record model='ir.actions.act_window' id='fleet_vehicle_model_brand_act'>
|
||||
<field name="name">Model brand of Vehicle</field>
|
||||
<field name="res_model">fleet.vehicle.model.brand</field>
|
||||
<field name="view_type">form</field>
|
||||
<field name="view_mode">kanban,tree,form</field>
|
||||
<field name="help" type="html">
|
||||
<p class="oe_view_nocontent_create">
|
||||
Click to create a new brand.
|
||||
</p>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record model='ir.ui.view' id='fleet_vehicle_state_tree'>
|
||||
<field name="name">fleet.vehicle.state.tree</field>
|
||||
<field name="model">fleet.vehicle.state</field>
|
||||
<field name="arch" type="xml">
|
||||
<tree string="State" version="7.0" editable="bottom">
|
||||
<field name="sequence" widget="handler" invisible="1"/>
|
||||
<field name="name" />
|
||||
|
||||
</tree>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record model='ir.actions.act_window' id='fleet_vehicle_state_act'>
|
||||
<field name="name">States of Vehicle</field>
|
||||
<field name="res_model">fleet.vehicle.state</field>
|
||||
<field name="view_type">form</field>
|
||||
<field name="view_mode">tree,form</field>
|
||||
<field name="help" type="html">
|
||||
<p class="oe_view_nocontent_create">
|
||||
Click to create a vehicule status.
|
||||
</p><p>
|
||||
You can customize available status to track the evolution of
|
||||
each vehicule. Example: Active, Being Repaired, Sold.
|
||||
</p>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<menuitem name="Fleet" id="menu_root" sequence="70" />
|
||||
<menuitem name="Configuration" parent="menu_root" id="fleet_configuration" sequence="3" />
|
||||
<menuitem action="fleet_vehicle_model_act" parent="fleet_configuration" id="fleet_vehicle_model_menu" groups="base.group_no_one"/>
|
||||
<menuitem action="fleet_vehicle_model_brand_act" parent="fleet_configuration" id="fleet_vehicle_model_brand_menu" groups="base.group_no_one"/>
|
||||
<menuitem action="fleet_vehicle_state_act" parent="fleet_configuration" id="fleet_vehicle_state_menu" />
|
||||
|
||||
<record model='ir.ui.view' id='fleet_vehicle_form'>
|
||||
<field name="name">fleet.vehicle.form</field>
|
||||
<field name="model">fleet.vehicle</field>
|
||||
<field name="arch" type="xml">
|
||||
<form string="Vehicle" version="7.0">
|
||||
<header>
|
||||
<field name="state" widget="statusbar" clickable="True" />
|
||||
</header>
|
||||
<sheet>
|
||||
<field name="image_medium" widget='image' class="oe_left oe_avatar"/>
|
||||
<div class="oe_title">
|
||||
<label for="model_id" class="oe_edit_only"/>
|
||||
<h1>
|
||||
<field name="model_id" class="oe_inline" on_change="on_change_model(model_id)"/>
|
||||
</h1>
|
||||
<label for="license_plate" class="oe_edit_only"/>
|
||||
<h2>
|
||||
<field name="license_plate" class="oe_inline"/>
|
||||
</h2>
|
||||
<label for="tag_ids" class="oe_edit_only"/>
|
||||
<field name="tag_ids" widget="many2many_tags" />
|
||||
</div>
|
||||
<div class="oe_right oe_button_box">
|
||||
<button name="return_action_to_open" type="object" context="{'xml_id':'fleet_vehicle_log_contract_act'}" string="Contracts" help="show the contract for this vehicle" />
|
||||
<button name="act_show_log_cost" type="object" string="Costs" help="show all the costs for this vehicle" />
|
||||
<button name="return_action_to_open" type="object" context="{'xml_id':'fleet_vehicle_log_services_act'}" string="Services" help="show the services logs for this vehicle" />
|
||||
<button name="return_action_to_open" type="object" context="{'xml_id':'fleet_vehicle_log_fuel_act'}" string="Fuel Logs" help="show the fuel logs for this vehicle" />
|
||||
<button name="return_action_to_open" type="object" context="{'xml_id':'fleet_vehicle_odometer_act'}" string="Odometer Logs" help="show the odometer logs for this vehicle" />
|
||||
</div>
|
||||
<group col="2" string="General Properties">
|
||||
<group >
|
||||
<field name="driver" />
|
||||
<field name="location" />
|
||||
<field name="vin_sn" />
|
||||
<field name="company_id" groups="base.group_multi_company"/>
|
||||
</group>
|
||||
<group >
|
||||
<label for="odometer" />
|
||||
<div>
|
||||
<field name="odometer" class="oe_inline"/>
|
||||
<field name="odometer_unit" class="oe_inline"/>
|
||||
</div>
|
||||
<field name="acquisition_date" />
|
||||
<field name="car_value" />
|
||||
</group>
|
||||
</group>
|
||||
<group col="2">
|
||||
<group string="Additional Properties">
|
||||
<field name="seats" />
|
||||
<field name="doors" />
|
||||
<field name="color" />
|
||||
</group>
|
||||
<group string="Engine Options">
|
||||
<field name="transmission" />
|
||||
<field name="fuel_type" />
|
||||
<field name="co2" />
|
||||
<field name="horsepower" />
|
||||
<field name="horsepower_tax" />
|
||||
<field name="power" />
|
||||
</group>
|
||||
</group>
|
||||
</sheet>
|
||||
<div class="oe_chatter">
|
||||
<field name="message_ids" widget="mail_thread" options='{"thread_level": 1}'/>
|
||||
<field name="message_follower_ids" widget="mail_followers"/>
|
||||
</div>
|
||||
</form>
|
||||
</field>
|
||||
</record>
|
||||
<record model='ir.ui.view' id='fleet_vehicle_tree'>
|
||||
<field name="name">fleet.vehicle.tree</field>
|
||||
<field name="model">fleet.vehicle</field>
|
||||
<field name="sequence">1</field>
|
||||
<field name="arch" type="xml">
|
||||
<tree string="Vehicle" version="7.0" colors="orange:contract_renewal_due_soon and not contract_renewal_overdue;red:contract_renewal_overdue">
|
||||
<field name="license_plate" />
|
||||
<field name="model_id" />
|
||||
<field name="driver" />
|
||||
<field name="vin_sn" />
|
||||
<field name="acquisition_date" />
|
||||
<field name="state"/>
|
||||
<field name="odometer" />
|
||||
<field name="odometer_unit" />
|
||||
<field name="contract_renewal_due_soon" invisible="1"/>
|
||||
<field name="contract_renewal_overdue" invisible="1" />
|
||||
<field name="contract_renewal_total" invisible="1"/>
|
||||
</tree>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record model="ir.ui.view" id="fleet_vehicle_search">
|
||||
<field name="name">fleet.vehicle.search</field>
|
||||
<field name="model">fleet.vehicle</field>
|
||||
<field name="arch" type="xml">
|
||||
<search string="All vehicles">
|
||||
<field name="name" filter_domain="['|', ('name','ilike',self), ('license_plate','ilike',self)]" string="Vehicle"/>
|
||||
<field name="driver"/>
|
||||
<field name="tag_ids"/>
|
||||
<field name="location"/>
|
||||
<field name="state" />
|
||||
<field name="state" />
|
||||
<filter name="alert_true" domain="['|',('contract_renewal_due_soon','=',True),('contract_renewal_overdue','=',True)]" string="Has Alert(s)"/>
|
||||
</search>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
|
||||
<record model='ir.ui.view' id='fleet_vehicle_kanban'>
|
||||
<field name="name">fleet.vehicle.kanban</field>
|
||||
<field name="model">fleet.vehicle</field>
|
||||
<field name="arch" type="xml">
|
||||
<kanban>
|
||||
<field name="license_plate" />
|
||||
<field name="model_id" />
|
||||
<field name="driver" />
|
||||
<field name="location" />
|
||||
<field name="state" />
|
||||
|
||||
<field name="image" />
|
||||
<field name="tag_ids" />
|
||||
<field name="contract_renewal_due_soon" />
|
||||
<field name="contract_renewal_overdue" />
|
||||
<field name="contract_renewal_name" />
|
||||
<field name="contract_renewal_total" />
|
||||
|
||||
<templates>
|
||||
<t t-name="kanban-box">
|
||||
<div class="oe_kanban_vignette oe_semantic_html_override">
|
||||
<a type="open" href="#" class="oe_kanban_action oe_kanban_action_a">
|
||||
<img t-att-src="kanban_image('fleet.vehicle', 'image_small', record.id.value)"/>
|
||||
</a>
|
||||
<div class="oe_kanban_details">
|
||||
<h4 class="oe_partner_heading">
|
||||
<a type="open">
|
||||
<field name="license_plate"/><br/>
|
||||
<field name="model_id" />
|
||||
</a>
|
||||
</h4>
|
||||
<t t-if="record.contract_renewal_due_soon.raw_value and !record.contract_renewal_overdue.raw_value">
|
||||
<a data-type="object" data-name="return_action_to_open" href="#" class="oe_kanban_action oe_kanban_action_a" data-context='{"xml_id":"fleet_vehicle_log_contract_act"}'>
|
||||
<span class="oe_tag oe_kanban_color_3"><field name="contract_renewal_name" />
|
||||
<t t-if="record.contract_renewal_total.raw_value > 0"> and <field name="contract_renewal_total" /> other(s) </t>
|
||||
</span>
|
||||
</a>
|
||||
</t>
|
||||
|
||||
<t t-if="record.contract_renewal_overdue.raw_value">
|
||||
<a data-type="object" data-name="return_action_to_open" href="#" class="oe_kanban_action oe_kanban_action_a" data-context='{"xml_id":"fleet_vehicle_log_contract_act"}'>
|
||||
<span class="oe_tag oe_kanban_color_2"><field name="contract_renewal_name" />
|
||||
<t t-if="record.contract_renewal_total.raw_value > 0"> and <field name="contract_renewal_total" /> other(s) </t>
|
||||
</span>
|
||||
</a>
|
||||
</t>
|
||||
|
||||
<ul>
|
||||
<li>
|
||||
<t t-if="record.driver.raw_value"><field name="driver"/></t>
|
||||
</li>
|
||||
<li>
|
||||
<t t-if="record.location.raw_value"><field name="location"/></t>
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
|
||||
<div class="oe_kanban_partner_categories">
|
||||
<span class="oe_kanban_list_many2many">
|
||||
<div modifiers="{}" name="tag_ids" class="oe_form_field oe_tags" model="fleet.vehicle.tag" t-att-data="record.tag_ids.raw_value" />
|
||||
</span>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</t>
|
||||
</templates>
|
||||
</kanban>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
|
||||
<record model='ir.actions.act_window' id='fleet_vehicle_act'>
|
||||
<field name="name">Vehicles</field>
|
||||
<field name="res_model">fleet.vehicle</field>
|
||||
<field name="view_type">form</field>
|
||||
<field name="view_mode">kanban,tree,form</field>
|
||||
<field name="help" type="html">
|
||||
<p class="oe_view_nocontent_create">
|
||||
Click to create a new vehicle.
|
||||
</p><p>
|
||||
You will be able to manage your fleet by keeping track of the
|
||||
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
|
||||
renewed.
|
||||
</p>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<menuitem name="Vehicles" parent="menu_root" id="fleet_vehicles" sequence="2" />
|
||||
<menuitem action="fleet_vehicle_act" parent="fleet_vehicles" id="fleet_vehicle_menu" />
|
||||
|
||||
|
||||
|
||||
<record model='ir.ui.view' id='fleet_vehicle_log_contract_form'>
|
||||
<field name="name">fleet.vehicle.log_contract.form</field>
|
||||
<field name="model">fleet.vehicle.log.contract</field>
|
||||
<field name="arch" type="xml">
|
||||
<form string="Contract logs" version="7.0">
|
||||
<header>
|
||||
<button modifiers="{'invisible': [['state', '=', 'closed']]}" name="contract_close" states="open" type="object" class="oe_highlight" string="Terminate Contract"/>
|
||||
<button modifiers="{'invisible': [['state', '=', 'closed']]}" name="contract_close" states="toclose" type="object" class="oe_highlight" string="Terminate Contract"/>
|
||||
<button modifiers="{'invisible': [['state', 'not in', ['closed']]]}" name="contract_open" states="closed" type="object" class="oe_highlight" string="Set Contract In Progress"/>
|
||||
<button class="oe_highlight" name="act_renew_contract" type="object" string="Renew Contract" help="Create a new contract automatically with all the same informations except for the date that will start at the end of current contract" />
|
||||
<field name="state" widget="statusbar" />
|
||||
</header>
|
||||
<sheet>
|
||||
<group col="2">
|
||||
<group string="Contract details">
|
||||
<field name="vehicle_id" on_change="on_change_vehicle(vehicle_id)"/>
|
||||
<field name="cost_subtype" required="1" domain="['|',('category','=','contract'),('category','=','both')]"/>
|
||||
<field name="amount" string="Activation Cost"/>
|
||||
<label for="cost_generated"/>
|
||||
<div>
|
||||
<field name="cost_generated" class="oe_inline" attrs="{'invisible': [('cost_frequency','=','no')]}" />
|
||||
<field name="cost_frequency" class="oe_inline" />
|
||||
</div>
|
||||
</group>
|
||||
<group string="Odometer details">
|
||||
<label for="odometer"/>
|
||||
<div>
|
||||
<field name="odometer" class="oe_inline"/>
|
||||
<field name="odometer_unit" class="oe_inline"/>
|
||||
</div>
|
||||
</group>
|
||||
</group>
|
||||
<group col="2">
|
||||
<group>
|
||||
<field name="date" string="Invoice Date"/>
|
||||
<field name="start_date"/>
|
||||
<field name="expiration_date" />
|
||||
</group>
|
||||
<group>
|
||||
<field name="insurer_id" />
|
||||
<field name="purchaser_id" />
|
||||
<field name="ins_ref" />
|
||||
</group>
|
||||
</group>
|
||||
<notebook>
|
||||
<page string="Included Services">
|
||||
<group>
|
||||
<field name="cost_ids" context="{'vehicle_id': vehicle_id}" nolabel="1" on_change="on_change_indic_cost(cost_ids)">
|
||||
<tree version="7.0" editable="bottom">
|
||||
<field name="cost_subtype" string="Service" domain="[('category','=','service')]"/>
|
||||
<field name="amount" sum="Price" string="Indicative Cost" />
|
||||
</tree>
|
||||
</field>
|
||||
|
||||
</group>
|
||||
<div class="oe_right"><group><field name="sum_cost" string="Indicative Costs Total"/></group></div>
|
||||
</page>
|
||||
<page string="Generated Costs">
|
||||
<group>
|
||||
<field name="generated_cost_ids" context="{'vehicle_id': vehicle_id}" nolabel="1" sum="amount">
|
||||
<tree version="7.0" editable="bottom" >
|
||||
<field name="date" />
|
||||
<field name="amount" sum="amount"/>
|
||||
</tree>
|
||||
|
||||
</field>
|
||||
</group>
|
||||
</page>
|
||||
</notebook>
|
||||
<group string="Terms and Conditions">
|
||||
<field name="notes" nolabel="1" placeholder="Write here all other information relative to this contract" />
|
||||
</group>
|
||||
</sheet>
|
||||
</form>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<act_window
|
||||
|
||||
id="act_renew_contract"
|
||||
name="Renew Contract"
|
||||
res_model="fleet.vehicle.log.contract"
|
||||
src_model="fleet.vehicle.log.contract"
|
||||
view_mode="form"
|
||||
view_type="form"
|
||||
/>
|
||||
|
||||
|
||||
<record model='ir.ui.view' id='fleet_vehicle_log_contract_tree'>
|
||||
<field name="name">fleet.vehicle.log.contract.tree</field>
|
||||
<field name="model">fleet.vehicle.log.contract</field>
|
||||
<field name="arch" type="xml">
|
||||
<tree string="Contract logs" version="7.0" colors="orange:days_left>0 and days_left<15;red:days_left==0;grey:state=='closed'">
|
||||
<field name="start_date" />
|
||||
<field name="expiration_date" />
|
||||
<field name="days_left" invisible="1"/>
|
||||
<field name="vehicle_id" />
|
||||
<field name="cost_subtype"/>
|
||||
<field name="insurer_id" />
|
||||
<field name="amount" string="Activation Cost"/>
|
||||
<field name="cost_generated"/>
|
||||
<field name="cost_frequency"/>
|
||||
<field name="state" />
|
||||
</tree>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record model="ir.ui.view" id="fleet_vehicle_log_contract_graph">
|
||||
<field name="name">fleet.vehicle.log.contract.graph</field>
|
||||
<field name="model">fleet.vehicle.log.contract</field>
|
||||
<!--<field name="type">graph</field>-->
|
||||
<field name="arch" type="xml">
|
||||
<graph string="Contract Costs Per Month">
|
||||
<field name="date" />
|
||||
<field name="cost_amount" operator="+"/>
|
||||
<field name="vehicle_id" group="True"/>
|
||||
</graph>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record model='ir.actions.act_window' id='fleet_vehicle_log_contract_act'>
|
||||
<field name="name">Vehicles Contracts</field>
|
||||
<field name="res_model">fleet.vehicle.log.contract</field>
|
||||
<field name="view_type">form</field>
|
||||
<field name="view_mode">tree,form,graph</field>
|
||||
<field name="help" type="html">
|
||||
<p class="oe_view_nocontent_create">
|
||||
Click to create a new contract.
|
||||
</p><p>
|
||||
Manage all your contracts (leasing, insurances, etc.) with
|
||||
their related services, costs. OpenERP will automatically warn
|
||||
you when some contracts have to be renewed.
|
||||
</p><p>
|
||||
Each contract (e.g.: leasing) may include several services
|
||||
(reparation, insurances, periodic maintenance).
|
||||
</p>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<menuitem action="fleet_vehicle_log_contract_act" parent="fleet_vehicles" id="fleet_vehicle_log_contract_menu" />
|
||||
|
||||
<record model='ir.ui.view' id='fleet_vehicle_odometer_form'>
|
||||
<field name="name">fleet.vehicle.odometer.form</field>
|
||||
<field name="model">fleet.vehicle.odometer</field>
|
||||
<field name="arch" type="xml">
|
||||
<form string="Odometer Logs" version="7.0">
|
||||
<sheet>
|
||||
<group>
|
||||
<field name="vehicle_id" on_change="on_change_vehicle(vehicle_id)"/>
|
||||
<div>
|
||||
<field name="value" class="oe_inline"/>
|
||||
<field name="unit" class="oe_inline"/>
|
||||
</div>
|
||||
<field name="date" />
|
||||
</group>
|
||||
</sheet>
|
||||
</form>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record model='ir.ui.view' id='fleet_vehicle_odometer_tree'>
|
||||
<field name="name">fleet.vehicle.odometer.tree</field>
|
||||
<field name="model">fleet.vehicle.odometer</field>
|
||||
<field name="arch" type="xml">
|
||||
<tree string="Odometer Logs" version="7.0" editable="bottom">
|
||||
<field name="date" />
|
||||
<field name="vehicle_id" on_change="on_change_vehicle(vehicle_id)"/>
|
||||
<field name="value" />
|
||||
<field name="unit" />
|
||||
</tree>
|
||||
</field>
|
||||
</record>
|
||||
<!--
|
||||
<record model='ir.ui.view' id='fleet_vehicle_odometer_search'>
|
||||
<field name="name">fleet.vehicle.odometer.search</field>
|
||||
<field name="model">fleet.vehicle.odometer</field>
|
||||
<field name="arch" type="xml">
|
||||
<search string="Vehicles odometers" >
|
||||
<field name="vehicle_id" />
|
||||
<field name="value"/>
|
||||
<field name="unit"/>
|
||||
<field name="date"/>
|
||||
<filter name="groupby_vehicle" context="{'group_by' : 'vehicle_id'}" string="Vehicle"/>
|
||||
</search>
|
||||
</field>
|
||||
</record>
|
||||
-->
|
||||
|
||||
<record model="ir.ui.view" id="fleet_vehicle_odometer_graph">
|
||||
<field name="name">fleet.vehicle.odometer.graph</field>
|
||||
<field name="model">fleet.vehicle.odometer</field>
|
||||
<!--<field name="type">graph</field>-->
|
||||
<field name="arch" type="xml">
|
||||
<graph string="Odometer Values Per Month">
|
||||
<field name="date" />
|
||||
<field name="value" operator="+"/>
|
||||
<field name="vehicle_id" group="True"/>
|
||||
</graph>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record model='ir.actions.act_window' id='fleet_vehicle_odometer_act'>
|
||||
<field name="name">Vehicles Odometer</field>
|
||||
<field name="res_model">fleet.vehicle.odometer</field>
|
||||
<field name="view_type">form</field>
|
||||
<field name="view_mode">tree,form,graph</field>
|
||||
<field name="context">{"search_default_groupby_vehicle" : True}</field>
|
||||
<field name="help" type="html">
|
||||
<p>
|
||||
Here you can add various odometer entries for all vehicles.
|
||||
You can also show odometer value for a particular vehicle using
|
||||
the search field.
|
||||
</p>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<menuitem action="fleet_vehicle_odometer_act" parent="fleet_vehicles" id="fleet_vehicle_odometer_menu" />
|
||||
|
||||
<record model='ir.ui.view' id='fleet_vehicle_log_fuel_form'>
|
||||
<field name="name">fleet.vehicle.log.fuel.form</field>
|
||||
<field name="model">fleet.vehicle.log.fuel</field>
|
||||
<field name="arch" type="xml">
|
||||
<form string="Fuel Logs" version="7.0">
|
||||
<sheet>
|
||||
<group col="2">
|
||||
<group string="Vehicle Details">
|
||||
<field name="vehicle_id" on_change="on_change_vehicle(vehicle_id)"/>
|
||||
</group>
|
||||
<group string="Refueling Details">
|
||||
<field name="liter" on_change="on_change_liter(liter,price_per_liter,amount)"/>
|
||||
<field name="price_per_liter" on_change="on_change_price_per_liter(liter,price_per_liter,amount)" />
|
||||
<field name="amount" on_change="on_change_amount(liter,price_per_liter,amount)"/>
|
||||
</group>
|
||||
</group>
|
||||
<group col="2">
|
||||
<group string="Odometer Details">
|
||||
<label for="odometer"/>
|
||||
<div>
|
||||
<field name="odometer" class="oe_inline"/>
|
||||
<field name="odometer_unit" class="oe_inline"/>
|
||||
</div>
|
||||
</group>
|
||||
<group string="Additional Details">
|
||||
<field name="date" />
|
||||
<field name="purchaser_id" />
|
||||
<field name="inv_ref" />
|
||||
<field name="vendor_id" />
|
||||
</group>
|
||||
</group>
|
||||
<group string="Notes">
|
||||
<field nolabel="1" name="notes" placeholder="Write here any other information"/>
|
||||
</group>
|
||||
</sheet>
|
||||
</form>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record model='ir.ui.view' id='fleet_vehicle_log_fuel_tree'>
|
||||
<field name="name">fleet.vehicle.log.fuel.tree</field>
|
||||
<field name="model">fleet.vehicle.log.fuel</field>
|
||||
<field name="arch" type="xml">
|
||||
<tree string="Fuel Logs">
|
||||
<field name="date" />
|
||||
<field name="vehicle_id" />
|
||||
<field name="odometer" invisible="1"/>
|
||||
<field name="odometer_unit" invisible="1"/>
|
||||
<field name="purchaser_id" />
|
||||
<field name="inv_ref" invisible="1"/>
|
||||
<field name="vendor_id" invisible="1"/>
|
||||
<field name="liter" />
|
||||
<field name="price_per_liter" invisible="1"/>
|
||||
<field name="amount" sum="Price"/>
|
||||
</tree>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record model="ir.ui.view" id="fleet_vehicle_log_fuel_graph">
|
||||
<field name="name">fleet.vehicle.log.fuel.graph</field>
|
||||
<field name="model">fleet.vehicle.log.fuel</field>
|
||||
<!--<field name="type">graph</field>-->
|
||||
<field name="arch" type="xml">
|
||||
<graph string="Fuel Costs Per Month">
|
||||
<field name="date" />
|
||||
<field name="cost_amount" operator="+"/>
|
||||
<field name="vehicle_id" group="True"/>
|
||||
</graph>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record model='ir.actions.act_window' id='fleet_vehicle_log_fuel_act'>
|
||||
<field name="name">Vehicles Fuel Logs</field>
|
||||
<field name="res_model">fleet.vehicle.log.fuel</field>
|
||||
<field name="view_type">form</field>
|
||||
<field name="view_mode">tree,form,graph</field>
|
||||
<field name="help" type="html">
|
||||
<p class="oe_view_nocontent_create">
|
||||
Click to create a new fuel log.
|
||||
</p><p>
|
||||
Here you can add refuelling entries for all vehicles. You can
|
||||
also filter logs of a particular vehicle using the search
|
||||
field.
|
||||
</p>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<menuitem action="fleet_vehicle_log_fuel_act" parent="fleet_vehicles" id="fleet_vehicle_log_fuel_menu" />
|
||||
|
||||
|
||||
<record model='ir.ui.view' id='fleet_vehicle_log_services_form'>
|
||||
<field name="name">fleet.vehicle.log.services.form</field>
|
||||
<field name="model">fleet.vehicle.log.services</field>
|
||||
<field name="arch" type="xml">
|
||||
<form string="Services Logs" version="7.0">
|
||||
<sheet>
|
||||
<group col="2">
|
||||
<group string="Services Details">
|
||||
<field name="vehicle_id" on_change="on_change_vehicle(vehicle_id)"/>
|
||||
<field name="cost_subtype" string="Service Type" domain="['|',('category','=','service'),('category','=','both')]" required="1"/>
|
||||
<field name="amount" string="Price"/>
|
||||
</group>
|
||||
<group string="Odometer Details">
|
||||
<label for="odometer"/>
|
||||
<div>
|
||||
<field name="odometer" class="oe_inline"/>
|
||||
<field name="odometer_unit" class="oe_inline"/>
|
||||
</div>
|
||||
</group>
|
||||
</group>
|
||||
<group col="2">
|
||||
<group string="Additional Details">
|
||||
<field name="date" />
|
||||
<field name="purchaser_id" />
|
||||
<field name="vendor_id" />
|
||||
<field name="inv_ref" />
|
||||
</group>
|
||||
</group>
|
||||
<group string="Included Services">
|
||||
<field name="cost_ids" nolabel="1">
|
||||
<tree string="Included Services" version="7.0" editable="bottom">
|
||||
<field name="cost_subtype" string="Service" domain="[('category','=','service')]"/>
|
||||
<field name="amount" sum="Price" string="Cost"/>
|
||||
</tree>
|
||||
</field>
|
||||
</group>
|
||||
<group string="Notes">
|
||||
<field nolabel="1" name="notes" placeholder="Write here any other information related to the service completed."/>
|
||||
</group>
|
||||
</sheet>
|
||||
</form>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record model='ir.ui.view' id='fleet_vehicle_log_services_tree'>
|
||||
<field name="name">fleet.vehicle.log.services.tree</field>
|
||||
<field name="model">fleet.vehicle.log.services</field>
|
||||
<field name="arch" type="xml">
|
||||
<tree string="Services Logs">
|
||||
<field name="date" />
|
||||
<field name="vehicle_id" />
|
||||
<field name="cost_subtype"/>
|
||||
<field name="purchaser_id"/>
|
||||
<field name="vendor_id" />
|
||||
<field name="inv_ref" />
|
||||
<field name="notes" />
|
||||
<field name="amount" sum="Total"/>
|
||||
</tree>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record model="ir.ui.view" id="fleet_vehicle_log_services_graph">
|
||||
<field name="name">fleet.vehicle.log.services.graph</field>
|
||||
<field name="model">fleet.vehicle.log.services</field>
|
||||
<field name="arch" type="xml">
|
||||
<graph string="Services Costs Per Month">
|
||||
<field name="date" />
|
||||
<field name="cost_amount" operator="+"/>
|
||||
<field name="vehicle_id" group="True"/>
|
||||
</graph>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record model='ir.actions.act_window' id='fleet_vehicle_log_services_act'>
|
||||
<field name="name">Vehicles Services Logs</field>
|
||||
<field name="res_model">fleet.vehicle.log.services</field>
|
||||
<field name="view_type">form</field>
|
||||
<field name="view_mode">tree,form,graph</field>
|
||||
<field name="help" type="html">
|
||||
<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
|
||||
on your vehicle. Services can be of many type: occasional
|
||||
repair, fixed maintenance, etc.
|
||||
</p>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<menuitem action="fleet_vehicle_log_services_act" parent="fleet_vehicles" id="fleet_vehicle_log_services_menu" />
|
||||
|
||||
<record model='ir.ui.view' id='fleet_vehicle_service_types_tree'>
|
||||
<field name="name">fleet.service.type.tree</field>
|
||||
<field name="model">fleet.service.type</field>
|
||||
<field name="arch" type="xml">
|
||||
<tree string="Service types" editable="bottom">
|
||||
<field name="name" />
|
||||
<field name="category"/>
|
||||
</tree>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record model='ir.actions.act_window' id='fleet_vehicle_service_types_act'>
|
||||
<field name="name">Service Types</field>
|
||||
<field name="res_model">fleet.service.type</field>
|
||||
<field name="view_type">form</field>
|
||||
<field name="view_mode">tree,form</field>
|
||||
<field name="help" type="html">
|
||||
<p class="oe_view_nocontent_create">
|
||||
Click to create a new type of service.
|
||||
</p><p>
|
||||
Each service can used in contracts, as a standalone service or both.
|
||||
</p>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<menuitem action="fleet_vehicle_service_types_act" parent="fleet_configuration" id="fleet_vehicle_service_types_menu" groups="base.group_no_one"/>
|
||||
|
||||
|
||||
<record model='ir.ui.view' id='fleet_vehicle_costs_tree'>
|
||||
<field name="name">fleet.vehicle.cost.tree</field>
|
||||
<field name="model">fleet.vehicle.cost</field>
|
||||
<field name="arch" type="xml">
|
||||
<tree string="Vehicles costs" >
|
||||
<field name="date"/>
|
||||
<field name="vehicle_id" />
|
||||
<field name="cost_type"/>
|
||||
<field name="cost_subtype"/>
|
||||
<field name="amount" sum="Total Cost"/>
|
||||
<field name="parent_id" invisible="1" />
|
||||
<field name="year" invisible="1"/>
|
||||
</tree>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record model='ir.ui.view' id='fleet_vehicle_costs_search'>
|
||||
<field name="name">fleet.vehicle.cost.search</field>
|
||||
<field name="model">fleet.vehicle.cost</field>
|
||||
<field name="arch" type="xml">
|
||||
<search string="Vehicles costs" >
|
||||
<field name="vehicle_id" />
|
||||
<field name="cost_subtype"/>
|
||||
<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_date" context="{'group_by' : 'date'}" string="Date"/>
|
||||
<filter name="groupby_cost_type" context="{'group_by' : 'cost_type'}" string="Cost Type"/>
|
||||
<filter name="groupby_cost_subtype" context="{'group_by' : 'cost_subtype'}" string="Cost Subtype"/>
|
||||
<filter name="groupby_vehicle_id" context="{'group_by' : 'vehicle_id'}" string="Vehicle"/>
|
||||
<filter name="groupby_parent_id" context="{'group_by' : 'parent_id'}" string="Parent"/>
|
||||
</group>
|
||||
</search>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record model='ir.ui.view' id='fleet_vehicle_costs_form'>
|
||||
<field name="name">fleet.vehicle.cost.form</field>
|
||||
<field name="model">fleet.vehicle.cost</field>
|
||||
<field name="arch" type="xml">
|
||||
<form string="Vehicle costs" version="7.0">
|
||||
<sheet>
|
||||
<group col="2" string="Cost Details">
|
||||
<group>
|
||||
<field name="vehicle_id" />
|
||||
<field name="cost_subtype"/>
|
||||
<field name="amount"/>
|
||||
</group>
|
||||
<group>
|
||||
<field name="date"/>
|
||||
<field name="parent_id"/>
|
||||
</group>
|
||||
</group>
|
||||
</sheet>
|
||||
</form>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record model="ir.ui.view" id="fleet_vehicle_costs_graph">
|
||||
<field name="name">fleet.vehicle.cost.graph</field>
|
||||
<field name="model">fleet.vehicle.cost</field>
|
||||
<field name="arch" type="xml">
|
||||
<graph string="Costs Per Month">
|
||||
<field name="date" />
|
||||
<field name="amount"/>
|
||||
<field name="vehicle_id" group="True"/>
|
||||
</graph>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record model='ir.actions.act_window' id='fleet_vehicle_costs_act'>
|
||||
<field name="name">Vehicle Costs</field>
|
||||
<field name="res_model">fleet.vehicle.cost</field>
|
||||
<field name="view_type">form</field>
|
||||
<field name="view_mode">tree,form,graph</field>
|
||||
<field name="context">{"search_default_parent_false" : True, "search_default_groupby_vehicle_id" : True,}</field>
|
||||
<field name="help" type="html">
|
||||
<p class="oe_view_nocontent_create">
|
||||
Click to create a new cost.
|
||||
</p><p>
|
||||
OpenERP helps you managing the costs for your different
|
||||
vehicles. Costs are created automatically from services,
|
||||
contracts (fixed or recurring) and fuel logs.
|
||||
</p>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<menuitem action="fleet_vehicle_costs_act" parent="fleet_vehicles" id="fleet_vehicle_costs_menu" />
|
||||
<!--
|
||||
<record model='ir.ui.view' id='fleet_hr_employee_form'>
|
||||
<field name="name">fleet.hr.employee.form</field>
|
||||
<field name="model">hr.employee</field>
|
||||
<field name="type">form</field>
|
||||
<field name="inherit_id" ref="hr.view_employee_form" />
|
||||
<field name="arch" type="xml">
|
||||
<notebook position="inside">
|
||||
<page string="Vehicle">
|
||||
<group>
|
||||
<field name="vehicle_id" widget="many2many_tags"/>
|
||||
</group>
|
||||
</page>
|
||||
</notebook>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record model="fleet.vehicle.model" id="citroen">
|
||||
<field name="name">Citroen</field>
|
||||
</record>
|
||||
|
||||
<record model="fleet.vehicle" id="stw_vehicle">
|
||||
<field name="name">240BTN</field>
|
||||
<field name="model_id" ref="citroen" />
|
||||
</record>
|
||||
-->
|
||||
</data>
|
||||
</openerp>
|
|
@ -0,0 +1,11 @@
|
|||
id,name,model_id/id,group_id/id,perm_read,perm_write,perm_create,perm_unlink
|
||||
fleet_vehicle_model_access_right,fleet_vehicle_model_access_right,model_fleet_vehicle_model,,1,1,1,1
|
||||
fleet_vehicle_tag_access_right,fleet_vehicle_tag_access_right,model_fleet_vehicle_tag,,1,1,1,1
|
||||
fleet_vehicle_state_access_right,fleet_vehicle_state_access_right,model_fleet_vehicle_state,,1,1,1,1
|
||||
fleet_vehicle_odometer_access_right,fleet_vehicle_odometer_access_right,model_fleet_vehicle_odometer,,1,1,1,1
|
||||
fleet_vehicle_model_brand_access_right,fleet_vehicle_model_brand_access_right,model_fleet_vehicle_model_brand,,1,1,1,1
|
||||
fleet_vehicle_access_right,fleet_vehicle_access_right,model_fleet_vehicle,,1,1,1,1
|
||||
fleet_vehicle_log_fuel_access_right,fleet_vehicle_log_fuel_access_right,model_fleet_vehicle_log_fuel,,1,1,1,1
|
||||
fleet_vehicle_log_services_access_right,fleet_vehicle_log_services_access_right,model_fleet_vehicle_log_services,,1,1,1,1
|
||||
fleet_vehicle_log_contract_access_right,fleet_vehicle_log_contract_access_right,model_fleet_vehicle_log_contract,,1,1,1,1
|
||||
fleet_service_type_access_right,fleet_service_type_access_right,model_fleet_service_type,,1,1,1,1
|
|
Binary file not shown.
After Width: | Height: | Size: 11 KiB |
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2012-11-08 04:47+0000\n"
|
||||
"X-Generator: Launchpad (build 16232)\n"
|
||||
"X-Launchpad-Export-Date: 2012-11-09 04:39+0000\n"
|
||||
"X-Generator: Launchpad (build 16250)\n"
|
||||
|
||||
#. module: google_base_account
|
||||
#: field:res.users,gmail_user:0
|
||||
|
|
|
@ -16,9 +16,9 @@ var _t = instance.web._t,
|
|||
var view = self.getParent();
|
||||
var ids = ( view.fields_view.type != "form" )? view.groups.get_selection().ids : [ view.datarecord.id ];
|
||||
if( !_.isEmpty(ids) ){
|
||||
view.sidebar_context().then(function (context) {
|
||||
view.sidebar_context().done(function (context) {
|
||||
var ds = new instance.web.DataSet(this, 'ir.attachment', context);
|
||||
ds.call('google_doc_get', [view.dataset.model, ids, context]).then(function(r) {
|
||||
ds.call('google_doc_get', [view.dataset.model, ids, context]).done(function(r) {
|
||||
if (r == 'False') {
|
||||
var params = {
|
||||
error: response,
|
||||
|
|
|
@ -288,7 +288,7 @@
|
|||
</record>
|
||||
|
||||
<record id="open_view_categ_form" model="ir.actions.act_window">
|
||||
<field name="name">Categories of Employee</field>
|
||||
<field name="name">Categories of Employees</field>
|
||||
<field name="res_model">hr.employee.category</field>
|
||||
<field name="view_type">form</field>
|
||||
<field name="view_mode">tree,form</field>
|
||||
|
@ -342,8 +342,8 @@
|
|||
<group>
|
||||
<group>
|
||||
<field name="no_of_employee" groups="base.group_user"/>
|
||||
<field name="expected_employees" groups="base.group_user"/>
|
||||
<field name="no_of_recruitment" on_change="on_change_expected_employee(no_of_recruitment,no_of_employee)"/>
|
||||
<field name="expected_employees" groups="base.group_user"/>
|
||||
</group>
|
||||
<group>
|
||||
<field name="company_id" widget="selection" groups="base.group_multi_company"/>
|
||||
|
|
|
@ -8,15 +8,14 @@ msgstr ""
|
|||
"Project-Id-Version: openobject-addons\n"
|
||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"POT-Creation-Date: 2012-02-08 01:37+0100\n"
|
||||
"PO-Revision-Date: 2012-01-03 02:55+0000\n"
|
||||
"Last-Translator: Christopher Ormaza - (Ecuadorenlinea.net) "
|
||||
"<chris.ormaza@gmail.com>\n"
|
||||
"PO-Revision-Date: 2012-11-10 17:20+0000\n"
|
||||
"Last-Translator: Cristian Salamea (Gnuthink) <ovnicraft@gmail.com>\n"
|
||||
"Language-Team: Spanish (Ecuador) <es_EC@li.org>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-30 05:17+0000\n"
|
||||
"X-Generator: Launchpad (build 16206)\n"
|
||||
"X-Launchpad-Export-Date: 2012-11-11 04:57+0000\n"
|
||||
"X-Generator: Launchpad (build 16251)\n"
|
||||
|
||||
#. module: hr
|
||||
#: model:process.node,name:hr.process_node_openerpuser0
|
||||
|
@ -199,6 +198,8 @@ msgstr "Mujer"
|
|||
msgid ""
|
||||
"Expected number of employees for this job position after new recruitment."
|
||||
msgstr ""
|
||||
"Número de Empleados para este puesto de trabajo después de las nuevas "
|
||||
"contrataciones"
|
||||
|
||||
#. module: hr
|
||||
#: model:ir.ui.menu,name:hr.menu_open_view_attendance_reason_new_config
|
||||
|
@ -291,7 +292,7 @@ msgstr "Categorías"
|
|||
#. module: hr
|
||||
#: field:hr.job,expected_employees:0
|
||||
msgid "Total Employees"
|
||||
msgstr ""
|
||||
msgstr "Total de Empleados"
|
||||
|
||||
#. module: hr
|
||||
#: selection:hr.employee,marital:0
|
||||
|
@ -435,7 +436,7 @@ msgstr "Estado"
|
|||
#: model:ir.actions.act_window,name:hr.open_view_categ_tree
|
||||
#: model:ir.ui.menu,name:hr.menu_view_employee_category_tree
|
||||
msgid "Categories Structure"
|
||||
msgstr ""
|
||||
msgstr "Estructura de categorías"
|
||||
|
||||
#. module: hr
|
||||
#: field:hr.employee,partner_id:0
|
||||
|
@ -465,7 +466,7 @@ msgstr "¡Error! No se puede crear una jerarquía recursiva de empleados."
|
|||
#. module: hr
|
||||
#: model:ir.actions.act_window,name:hr.action2
|
||||
msgid "Subordinate Hierarchy"
|
||||
msgstr ""
|
||||
msgstr "Jerarquía subirdinada"
|
||||
|
||||
#. module: hr
|
||||
#: model:ir.actions.act_window,help:hr.view_department_form_installer
|
||||
|
@ -715,12 +716,12 @@ msgstr "Subordinados"
|
|||
#. module: hr
|
||||
#: field:hr.job,no_of_employee:0
|
||||
msgid "Number of employees currently occupying this job position."
|
||||
msgstr ""
|
||||
msgstr "Número de empleados ocupando actualmente este puesto de trabajo"
|
||||
|
||||
#. module: hr
|
||||
#: field:hr.job,no_of_recruitment:0
|
||||
msgid "Number of new employees you expect to recruit."
|
||||
msgstr ""
|
||||
msgstr "Número de empleados que espera contratar"
|
||||
|
||||
#~ msgid "Working Time Categories"
|
||||
#~ msgstr "Categorías de Horarios de Trabajo"
|
||||
|
|
|
@ -31,6 +31,7 @@ from report.interface import toxml
|
|||
from report import report_sxw
|
||||
from tools import ustr
|
||||
from tools.translate import _
|
||||
from tools import to_xml
|
||||
|
||||
one_day = relativedelta(days=1)
|
||||
month2name = [0, 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']
|
||||
|
@ -111,7 +112,7 @@ class report_custom(report_rml):
|
|||
<date>%s</date>
|
||||
<company>%s</company>
|
||||
</header>
|
||||
''' % (str(rml_obj.formatLang(time.strftime("%Y-%m-%d"),date=True))+' ' + str(time.strftime("%H:%M")),pooler.get_pool(cr.dbname).get('res.users').browse(cr,uid,uid).company_id.name)
|
||||
''' % (str(rml_obj.formatLang(time.strftime("%Y-%m-%d"),date=True))+' ' + str(time.strftime("%H:%M")),to_xml(pooler.get_pool(cr.dbname).get('res.users').browse(cr,uid,uid).company_id.name))
|
||||
|
||||
first_date = str(month)
|
||||
som = datetime.strptime(first_date, '%Y-%m-%d %H:%M:%S')
|
||||
|
|
|
@ -57,7 +57,7 @@ openerp.hr_attendance = function (instance) {
|
|||
var employee = new instance.web.DataSetSearch(self, 'hr.employee', self.session.user_context, [
|
||||
['user_id', '=', self.session.uid]
|
||||
]);
|
||||
return employee.read_slice(['id', 'name', 'state', 'last_sign', 'attendance_access']).pipe(function (res) {
|
||||
return employee.read_slice(['id', 'name', 'state', 'last_sign', 'attendance_access']).then(function (res) {
|
||||
if (_.isEmpty(res) )
|
||||
return;
|
||||
if (res[0].attendance_access == false){
|
||||
|
@ -75,7 +75,7 @@ openerp.hr_attendance = function (instance) {
|
|||
do_update: function () {
|
||||
this._super();
|
||||
var self = this;
|
||||
this.update_promise = this.update_promise.then(function () {
|
||||
this.update_promise = this.update_promise.done(function () {
|
||||
if (self.attendanceslider)
|
||||
return;
|
||||
self.attendanceslider = new instance.hr_attendance.AttendanceSlider(self);
|
||||
|
|
|
@ -291,6 +291,7 @@ survey_request()
|
|||
class hr_evaluation_interview(osv.osv):
|
||||
_name = 'hr.evaluation.interview'
|
||||
_inherits = {'survey.request': 'request_id'}
|
||||
_inherit = 'mail.thread'
|
||||
_rec_name = 'request_id'
|
||||
_description = 'Appraisal Interview'
|
||||
_columns = {
|
||||
|
|
|
@ -236,16 +236,6 @@ class product_product(osv.osv):
|
|||
'hr_expense_ok': fields.boolean('Can be Expensed', help="Specify if the product can be selected in an HR expense line."),
|
||||
}
|
||||
|
||||
def on_change_hr_expense_ok(self, cr, uid, id, hr_expense_ok):
|
||||
|
||||
if not hr_expense_ok:
|
||||
return {}
|
||||
data_obj = self.pool.get('ir.model.data')
|
||||
cat_id = data_obj._get_id(cr, uid, 'hr_expense', 'cat_expense')
|
||||
categ_id = data_obj.browse(cr, uid, cat_id).res_id
|
||||
res = {'value' : {'type':'service','sale_ok' :False,'categ_id':categ_id }}
|
||||
return res
|
||||
|
||||
product_product()
|
||||
|
||||
class hr_expense_line(osv.osv):
|
||||
|
|
|
@ -195,7 +195,7 @@
|
|||
<field name="inherit_id" ref="product.product_normal_form_view"/>
|
||||
<field name="arch" type="xml">
|
||||
<div name="options" position="inside">
|
||||
<field name="hr_expense_ok" on_change="on_change_hr_expense_ok(hr_expense_ok)"/>
|
||||
<field name="hr_expense_ok"/>
|
||||
<label for="hr_expense_ok"/>
|
||||
</div>
|
||||
</field>
|
||||
|
|
|
@ -90,6 +90,18 @@ class hr_holidays_status(osv.osv):
|
|||
'color_name': 'red',
|
||||
'active': True,
|
||||
}
|
||||
|
||||
def name_get(self, cr, uid, ids, context=None):
|
||||
if not ids:
|
||||
return []
|
||||
res = []
|
||||
for record in self.browse(cr, uid, ids, context=context):
|
||||
name = record.name
|
||||
if not record.limit:
|
||||
name = name + (' (%d/%d)' % (record.leaves_taken or 0.0, record.max_leaves or 0.0))
|
||||
res.append((record.id, name))
|
||||
return res
|
||||
|
||||
hr_holidays_status()
|
||||
|
||||
class hr_holidays(osv.osv):
|
||||
|
@ -113,6 +125,13 @@ class hr_holidays(osv.osv):
|
|||
result[hol.id] = hol.number_of_days_temp
|
||||
return result
|
||||
|
||||
def _check_date(self, cr, uid, ids):
|
||||
for holiday in self.browse(cr, uid, ids):
|
||||
holiday_ids = self.search(cr, uid, [('date_from', '<=', holiday.date_to), ('date_to', '>=', holiday.date_from), ('employee_id', '=', holiday.employee_id.id), ('id', '<>', holiday.id)])
|
||||
if holiday_ids:
|
||||
return False
|
||||
return True
|
||||
|
||||
_columns = {
|
||||
'name': fields.char('Description', size=64),
|
||||
'state': fields.selection([('draft', 'To Submit'), ('cancel', 'Cancelled'),('confirm', 'To Approve'), ('refuse', 'Refused'), ('validate1', 'Second Approval'), ('validate', 'Approved')],
|
||||
|
@ -146,6 +165,10 @@ class hr_holidays(osv.osv):
|
|||
'user_id': lambda obj, cr, uid, context: uid,
|
||||
'holiday_type': 'employee'
|
||||
}
|
||||
_constraints = [
|
||||
(_check_date, 'You can not have 2 leaves that overlaps on same day!', ['date_from','date_to']),
|
||||
]
|
||||
|
||||
_sql_constraints = [
|
||||
('type_value', "CHECK( (holiday_type='employee' AND employee_id IS NOT NULL) or (holiday_type='category' AND category_id IS NOT NULL))", "The employee or employee category of this request is missing."),
|
||||
('date_check2', "CHECK ( (type='add') OR (date_from <= date_to))", "The start date must be anterior to the end date."),
|
||||
|
@ -252,6 +275,13 @@ class hr_holidays(osv.osv):
|
|||
result['value']['number_of_days_temp'] = 0
|
||||
|
||||
return result
|
||||
|
||||
def write(self, cr, uid, ids, vals, context=None):
|
||||
check_fnct = self.pool.get('hr.holidays.status').check_access_rights
|
||||
for holiday in self.browse(cr, uid, ids, context=context):
|
||||
if holiday.state in ('validate','validate1') and not check_fnct(cr, uid, 'write', raise_exception=False):
|
||||
raise osv.except_osv(_('Warning!'),_('You cannot modify a leave request that has been approved. Contact a human resource manager.'))
|
||||
return super(hr_holidays, self).write(cr, uid, ids, vals, context=context)
|
||||
|
||||
def set_to_draft(self, cr, uid, ids, context=None):
|
||||
self.write(cr, uid, ids, {
|
||||
|
|
|
@ -34,8 +34,8 @@
|
|||
<record model="hr.holidays" id="hr_holidays_employee1_vc">
|
||||
<field name="name">Summer Vacation</field>
|
||||
<field name="holiday_status_id" ref="holiday_status_unpaid"/>
|
||||
<field eval="time.strftime('%Y-%m-20')" name="date_from"/>
|
||||
<field eval="time.strftime('%Y-%m-22')" name="date_to"/>
|
||||
<field eval="time.strftime('%Y-%m-23')" name="date_from"/>
|
||||
<field eval="time.strftime('%Y-%m-25')" name="date_to"/>
|
||||
<field name="type">add</field>
|
||||
<field name="state">draft</field>
|
||||
<field name="number_of_days_temp">7</field>
|
||||
|
@ -45,8 +45,8 @@
|
|||
<record model="hr.holidays" id="hr_holidays_employee1_int_tour">
|
||||
<field name="name">International Tour</field>
|
||||
<field name="holiday_status_id" ref="holiday_status_comp"/>
|
||||
<field eval="time.strftime('%Y-%m-20')" name="date_from"/>
|
||||
<field eval="time.strftime('%Y-%m-22')" name="date_to"/>
|
||||
<field eval="time.strftime('%Y-%m-26')" name="date_from"/>
|
||||
<field eval="time.strftime('%Y-%m-28')" name="date_to"/>
|
||||
<field name="type">add</field>
|
||||
<field name="number_of_days_temp">7</field>
|
||||
<field name="employee_id" ref="hr.employee_fp"/>
|
||||
|
|
|
@ -31,6 +31,7 @@ import time
|
|||
from report import report_sxw
|
||||
from tools import ustr
|
||||
from tools.translate import _
|
||||
from tools import to_xml
|
||||
|
||||
def lengthmonth(year, month):
|
||||
if month == 2 and ((year % 4 == 0) and ((year % 100 != 0) or (year % 400 == 0))):
|
||||
|
@ -240,7 +241,7 @@ class report_custom(report_rml):
|
|||
<date>%s</date>
|
||||
<company>%s</company>
|
||||
</header>
|
||||
''' % (str(rml_obj.formatLang(time.strftime("%Y-%m-%d"),date=True))+' ' + str(time.strftime("%H:%M")),pooler.get_pool(cr.dbname).get('res.users').browse(cr,uid,uid).company_id.name)
|
||||
''' % (str(rml_obj.formatLang(time.strftime("%Y-%m-%d"),date=True))+' ' + str(time.strftime("%H:%M")),to_xml(pooler.get_pool(cr.dbname).get('res.users').browse(cr,uid,uid).company_id.name))
|
||||
|
||||
# Computing the xml
|
||||
xml='''<?xml version="1.0" encoding="UTF-8" ?>
|
||||
|
|
|
@ -326,6 +326,7 @@ class hr_payslip(osv.osv):
|
|||
return self.write(cr, uid, ids, {'paid': True, 'state': 'done'}, context=context)
|
||||
|
||||
def hr_verify_sheet(self, cr, uid, ids, context=None):
|
||||
self.compute_sheet(cr, uid, ids, context)
|
||||
return self.write(cr, uid, ids, {'state': 'verify'}, context=context)
|
||||
|
||||
def refund_sheet(self, cr, uid, ids, context=None):
|
||||
|
|
|
@ -106,7 +106,7 @@
|
|||
<field name="arch" type="xml">
|
||||
<form string="Jobs - Recruitment Form" version="7.0">
|
||||
<header>
|
||||
<button name="case_close_with_emp" string="Hire" type="object"
|
||||
<button name="case_close_with_emp" string="Hire & Create Employee" type="object"
|
||||
states="draft,open,pending,done" class="oe_highlight"/>
|
||||
<button name="case_cancel" string="Refuse" type="object"
|
||||
states="draft,open,pending" class="oe_highlight"/>
|
||||
|
@ -333,7 +333,7 @@
|
|||
<field name="model">hr.job</field>
|
||||
<field name="inherit_id" ref="hr.view_hr_job_form"/>
|
||||
<field name="arch" type="xml">
|
||||
<field name="no_of_recruitment" version="7.0" position="after">
|
||||
<field name="expected_employees" version="7.0" position="after">
|
||||
<label for="survey_id" groups="base.group_user"/>
|
||||
<div groups="base.group_user">
|
||||
<field name="survey_id" class="oe_inline" domain="[('type','=','Human Resources')]"/>
|
||||
|
|
|
@ -16,7 +16,7 @@ openerp.hr_recruitment = function(openerp) {
|
|||
|
||||
// Find their matching names
|
||||
var dataset = new openerp.web.DataSetSearch(self, 'hr.applicant_category', self.session.context, [['id', 'in', _.uniq(categ_ids)]]);
|
||||
dataset.read_slice(['id', 'name']).then(function(result) {
|
||||
dataset.read_slice(['id', 'name']).done(function(result) {
|
||||
_.each(result, function(v, k) {
|
||||
// Set the proper value in the DOM and display the element
|
||||
self.$el.find('span[data-categ_id=' + v.id + ']').text(v.name);
|
||||
|
|
|
@ -28,6 +28,7 @@ import time
|
|||
import pooler
|
||||
from report import report_sxw
|
||||
from tools import ustr
|
||||
from tools import to_xml
|
||||
|
||||
def lengthmonth(year, month):
|
||||
if month == 2 and ((year % 4 == 0) and ((year % 100 != 0) or (year % 400 == 0))):
|
||||
|
@ -94,7 +95,7 @@ class report_custom(report_rml):
|
|||
<date>%s</date>
|
||||
<company>%s</company>
|
||||
</header>
|
||||
''' % (str(rml_obj.formatLang(time.strftime("%Y-%m-%d"),date=True))+' ' + str(time.strftime("%H:%M")),pooler.get_pool(cr.dbname).get('res.users').browse(cr,uid,user_id).company_id.name)
|
||||
''' % (str(rml_obj.formatLang(time.strftime("%Y-%m-%d"),date=True))+' ' + str(time.strftime("%H:%M")),to_xml(pooler.get_pool(cr.dbname).get('res.users').browse(cr,uid,user_id).company_id.name))
|
||||
|
||||
account_xml = []
|
||||
for account, telems in accounts.iteritems():
|
||||
|
|
|
@ -27,8 +27,9 @@ class analytical_timesheet_employee(osv.osv_memory):
|
|||
_name = 'hr.analytical.timesheet.employee'
|
||||
_description = 'Print Employee Timesheet & Print My Timesheet'
|
||||
_columns = {
|
||||
'month': fields.selection([(x, datetime.date(2000, x, 1).strftime('%B')) for x in range(1, 13)],
|
||||
'Month', required=True),
|
||||
'month': fields.selection([(1,'January'), (2,'February'), (3,'March'), (4,'April'),
|
||||
(5,'May'), (6,'June'), (7,'July'), (8,'August'), (9,'September'),
|
||||
(10,'October'), (11,'November'), (12,'December')], 'Month', required=True),
|
||||
'year': fields.integer('Year', required=True),
|
||||
'employee_id': fields.many2one('hr.employee', 'Employee', required=True)
|
||||
|
||||
|
|
|
@ -27,8 +27,9 @@ class analytical_timesheet_employees(osv.osv_memory):
|
|||
_name = 'hr.analytical.timesheet.users'
|
||||
_description = 'Print Employees Timesheet'
|
||||
_columns = {
|
||||
'month': fields.selection([(x, datetime.date(2000, x, 1).strftime('%B')) for x in range(1, 13)],
|
||||
'Month', required=True),
|
||||
'month': fields.selection([(1,'January'), (2,'February'), (3,'March'), (4,'April'),
|
||||
(5,'May'), (6,'June'), (7,'July'), (8,'August'), (9,'September'),
|
||||
(10,'October'), (11,'November'), (12,'December')], 'Month', required=True),
|
||||
'year': fields.integer('Year', required=True),
|
||||
'employee_ids': fields.many2many('hr.employee', 'timesheet_employee_rel', 'timesheet_id', 'employee_id', 'employees', required=True)
|
||||
}
|
||||
|
|
|
@ -46,7 +46,7 @@ openerp.hr_timesheet_sheet = function(instance) {
|
|||
var commands = this.field_manager.get_field_value("timesheet_ids");
|
||||
this.res_o2m_drop.add(new instance.web.Model(this.view.model).call("resolve_2many_commands", ["timesheet_ids", commands, [],
|
||||
new instance.web.CompoundContext()]))
|
||||
.then(function(result) {
|
||||
.done(function(result) {
|
||||
self.querying = true;
|
||||
self.set({sheets: result});
|
||||
self.querying = false;
|
||||
|
@ -57,7 +57,7 @@ openerp.hr_timesheet_sheet = function(instance) {
|
|||
if (self.querying)
|
||||
return;
|
||||
self.updating = true;
|
||||
self.field_manager.set_values({timesheet_ids: self.get("sheets")}).then(function() {
|
||||
self.field_manager.set_values({timesheet_ids: self.get("sheets")}).done(function() {
|
||||
self.updating = false;
|
||||
});
|
||||
},
|
||||
|
@ -85,7 +85,7 @@ openerp.hr_timesheet_sheet = function(instance) {
|
|||
var default_get;
|
||||
return this.render_drop.add(new instance.web.Model("hr.analytic.timesheet").call("default_get", [
|
||||
['account_id','general_account_id', 'journal_id','date','name','user_id','product_id','product_uom_id','to_invoice','amount','unit_amount'],
|
||||
new instance.web.CompoundContext({'user_id': self.get('user_id')})]).pipe(function(result) {
|
||||
new instance.web.CompoundContext({'user_id': self.get('user_id')})]).then(function(result) {
|
||||
default_get = result;
|
||||
// calculating dates
|
||||
dates = [];
|
||||
|
@ -108,9 +108,9 @@ openerp.hr_timesheet_sheet = function(instance) {
|
|||
var account_ids = _.map(_.keys(accounts), function(el) { return el === "false" ? false : Number(el) });
|
||||
|
||||
return new instance.web.Model("hr.analytic.timesheet").call("multi_on_change_account_id", [[], account_ids,
|
||||
new instance.web.CompoundContext({'user_id': self.get('user_id')})]).pipe(function(accounts_defaults) {
|
||||
new instance.web.CompoundContext({'user_id': self.get('user_id')})]).then(function(accounts_defaults) {
|
||||
accounts = _(accounts).chain().map(function(lines, account_id) {
|
||||
account_defaults = _.extend({}, default_get, accounts_defaults[account_id]);
|
||||
account_defaults = _.extend({}, default_get, (accounts_defaults[account_id] || {}).value || {});
|
||||
// group by days
|
||||
account_id = account_id === "false" ? false : Number(account_id);
|
||||
var index = _.groupBy(lines, "date");
|
||||
|
@ -136,7 +136,7 @@ openerp.hr_timesheet_sheet = function(instance) {
|
|||
|
||||
// we need the name_get of the analytic accounts
|
||||
return new instance.web.Model("account.analytic.account").call("name_get", [_.pluck(accounts, "account"),
|
||||
new instance.web.CompoundContext()]).pipe(function(result) {
|
||||
new instance.web.CompoundContext()]).then(function(result) {
|
||||
account_names = {};
|
||||
_.each(result, function(el) {
|
||||
account_names[el[0]] = el[1];
|
||||
|
@ -146,7 +146,7 @@ openerp.hr_timesheet_sheet = function(instance) {
|
|||
});
|
||||
});;
|
||||
});
|
||||
})).pipe(function(result) {
|
||||
})).then(function(result) {
|
||||
// we put all the gathered data in self, then we render
|
||||
self.dates = dates;
|
||||
self.accounts = accounts;
|
||||
|
@ -222,7 +222,7 @@ openerp.hr_timesheet_sheet = function(instance) {
|
|||
return;
|
||||
}
|
||||
var ops = self.generate_o2m_value();
|
||||
new instance.web.Model("hr.analytic.timesheet").call("on_change_account_id", [[], id]).pipe(function(res) {
|
||||
new instance.web.Model("hr.analytic.timesheet").call("on_change_account_id", [[], id]).then(function(res) {
|
||||
var def = _.extend({}, self.default_get, res.value, {
|
||||
name: self.description_line,
|
||||
unit_amount: 0,
|
||||
|
|
|
@ -52,21 +52,6 @@ class ResPartnerBank(osv.osv):
|
|||
'my_bank': fields.boolean('Use my account to print BVR ?', help="Check to print BVR invoices"),
|
||||
}
|
||||
|
||||
def name_get(self, cursor, uid, ids, context=None):
|
||||
if not len(ids):
|
||||
return []
|
||||
bank_type_obj = self.pool.get('res.partner.bank.type')
|
||||
|
||||
type_ids = bank_type_obj.search(cursor, uid, [])
|
||||
bank_type_names = {}
|
||||
for bank_type in bank_type_obj.browse(cursor, uid, type_ids,
|
||||
context=context):
|
||||
bank_type_names[bank_type.code] = bank_type.name
|
||||
res = []
|
||||
for r in self.read(cursor, uid, ids, ['name','state'], context):
|
||||
res.append((r['id'], r['name']+' : '+bank_type_names.get(r['state'], '')))
|
||||
return res
|
||||
|
||||
def _prepare_name(self, bank):
|
||||
"Hook to get bank number of bank account"
|
||||
res = u''
|
||||
|
|
|
@ -0,0 +1,136 @@
|
|||
# Spanish translation for openobject-addons
|
||||
# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012
|
||||
# This file is distributed under the same license as the openobject-addons package.
|
||||
# FIRST AUTHOR <EMAIL@ADDRESS>, 2012.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: openobject-addons\n"
|
||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"POT-Creation-Date: 2012-02-08 00:36+0000\n"
|
||||
"PO-Revision-Date: 2012-11-08 16:01+0000\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: Spanish <es@li.org>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2012-11-09 04:39+0000\n"
|
||||
"X-Generator: Launchpad (build 16250)\n"
|
||||
|
||||
#. module: l10n_fr_rib
|
||||
#: constraint:res.partner.bank:0
|
||||
msgid ""
|
||||
"\n"
|
||||
"Please define BIC/Swift code on bank for bank type IBAN Account to make "
|
||||
"valid payments"
|
||||
msgstr ""
|
||||
"\n"
|
||||
"Por favor defina el código BIC/Swift del banco para una cuenta de tipo IBAN "
|
||||
"para realizar pagos válidos"
|
||||
|
||||
#. module: l10n_fr_rib
|
||||
#: model:res.partner.bank.type,name:l10n_fr_rib.bank_rib
|
||||
msgid "RIB and optional IBAN"
|
||||
msgstr "CC e IBAN opcional"
|
||||
|
||||
#. module: l10n_fr_rib
|
||||
#: field:res.partner.bank,rib_acc_number:0
|
||||
msgid "RIB account number"
|
||||
msgstr "Número de la cuenta"
|
||||
|
||||
#. module: l10n_fr_rib
|
||||
#: field:res.partner.bank,bank_code:0
|
||||
msgid "Bank Code"
|
||||
msgstr "Código de banco"
|
||||
|
||||
#. module: l10n_fr_rib
|
||||
#: code:addons/l10n_fr_rib/bank.py:54
|
||||
#, python-format
|
||||
msgid "The RIB key %s does not correspond to the other codes: %s %s %s."
|
||||
msgstr "La clave de la CC %s no se corresponde con otros códigos: %s %s %s."
|
||||
|
||||
#. module: l10n_fr_rib
|
||||
#: model:res.partner.bank.type.field,name:l10n_fr_rib.rib_office_field
|
||||
msgid "office"
|
||||
msgstr "oficina"
|
||||
|
||||
#. module: l10n_fr_rib
|
||||
#: field:res.bank,rib_code:0
|
||||
msgid "RIB Bank Code"
|
||||
msgstr "Código CC"
|
||||
|
||||
#. module: l10n_fr_rib
|
||||
#: code:addons/l10n_fr_rib/bank.py:58
|
||||
#, python-format
|
||||
msgid "The IBAN %s is not valid."
|
||||
msgstr "El IBAN %s no es válido."
|
||||
|
||||
#. module: l10n_fr_rib
|
||||
#: model:ir.model,name:l10n_fr_rib.model_res_partner_bank
|
||||
msgid "Bank Accounts"
|
||||
msgstr "Cuentas bancarias"
|
||||
|
||||
#. module: l10n_fr_rib
|
||||
#: field:res.partner.bank,office:0
|
||||
msgid "Office Code"
|
||||
msgstr "Código de oficina"
|
||||
|
||||
#. module: l10n_fr_rib
|
||||
#: model:res.partner.bank.type.field,name:l10n_fr_rib.rib_bic_field
|
||||
msgid "bank_bic"
|
||||
msgstr "Número BIC"
|
||||
|
||||
#. module: l10n_fr_rib
|
||||
#: model:res.partner.bank.type.field,name:l10n_fr_rib.rib_bank_code_field
|
||||
msgid "bank_code"
|
||||
msgstr "código bancario"
|
||||
|
||||
#. module: l10n_fr_rib
|
||||
#: model:res.partner.bank.type.field,name:l10n_fr_rib.rib_key_field
|
||||
msgid "key"
|
||||
msgstr "clave"
|
||||
|
||||
#. module: l10n_fr_rib
|
||||
#: model:res.partner.bank.type.field,name:l10n_fr_rib.rib_rib_acc_number_field
|
||||
msgid "rib_acc_number"
|
||||
msgstr "Número CC"
|
||||
|
||||
#. module: l10n_fr_rib
|
||||
#: help:res.partner.bank,key:0
|
||||
msgid ""
|
||||
"The key is a number allowing to check the correctness of the other codes."
|
||||
msgstr ""
|
||||
"La clave es un número que permite comprobar si el resto de códigos son "
|
||||
"correctos."
|
||||
|
||||
#. module: l10n_fr_rib
|
||||
#: field:res.partner.bank,key:0
|
||||
msgid "Key"
|
||||
msgstr "Clave"
|
||||
|
||||
#. module: l10n_fr_rib
|
||||
#: code:addons/l10n_fr_rib/bank.py:53
|
||||
#: code:addons/l10n_fr_rib/bank.py:58
|
||||
#, python-format
|
||||
msgid "Error"
|
||||
msgstr "Error"
|
||||
|
||||
#. module: l10n_fr_rib
|
||||
#: model:res.partner.bank.type,format_layout:l10n_fr_rib.bank_rib
|
||||
msgid "%(bank_name)s: %(bank_code)s %(office)s %(rib_acc_number)s %(key)s"
|
||||
msgstr "%(bank_name)s: %(bank_code)s %(office)s %(rib_acc_number)s %(key)s"
|
||||
|
||||
#. module: l10n_fr_rib
|
||||
#: constraint:res.partner.bank:0
|
||||
msgid "The RIB and/or IBAN is not valid"
|
||||
msgstr "La CC y/o IBAN no es válida"
|
||||
|
||||
#. module: l10n_fr_rib
|
||||
#: model:ir.model,name:l10n_fr_rib.model_res_bank
|
||||
msgid "Bank"
|
||||
msgstr "Banco"
|
||||
|
||||
#. module: l10n_fr_rib
|
||||
#: model:res.partner.bank.type.field,name:l10n_fr_rib.rib_acc_number_field
|
||||
msgid "acc_number"
|
||||
msgstr "Número cuenta"
|
|
@ -60,6 +60,3 @@ IVC21det40,template_ivacode_pagata_21det40,IVA a credito 21% detraibile 40%,temp
|
|||
IVC21Idet40,template_impcode_pagata_21det40,IVA a credito 21% detraibile 40% (imponibile),template_impcode_pagata
|
||||
IVC21det50,template_ivacode_pagata_21det50,IVA a credito 21% detraibile 50%,template_ivacode_pagata
|
||||
IVC21Idet50,template_impcode_pagata_21det50,IVA a credito 21% detraibile 50% (imponibile),template_impcode_pagata
|
||||
Rit,template_ra,Ritenute d'acconto,vat_code_chart_root
|
||||
RitD20,template_ritcode_20,Ritenute a debito 20%,template_ra
|
||||
RitD20I,template_ritimpcode_20,Ritenute a debito 20% (imponibile),template_ra
|
||||
|
|
|
|
@ -62,4 +62,3 @@ id,description,chart_template_id:id,name,sequence,amount,parent_id:id,child_depe
|
|||
21I5,21I5,l10n_it_chart_template_generic,IVA al 21% detraibile al 50%,,0.21,,True,percent,,,purchase,template_impcode_pagata_21det50,,template_impcode_pagata_21det50,,,,False,-1,-1
|
||||
21I5b,21I5b,l10n_it_chart_template_generic,IVA al 21% detraibile al 50% (I),1,0.5,21I5,False,percent,,,purchase,,,,,,,False,,
|
||||
21I5a,21I5a,l10n_it_chart_template_generic,IVA al 21% detraibile al 50% (D),2,0,21I5,False,balance,1601,1601,purchase,,template_ivacode_pagata_21det50,,template_ivacode_pagata_21det50,,,False,,
|
||||
rit-20,rit-20,l10n_it_chart_template_generic,Ritenuta d'acconto al 20% (debito),,-0.2,,False,percent,2602,2602,purchase,template_ritimpcode_20,template_ritcode_20,template_ritimpcode_20,template_ritcode_20,-1,1,False,1,-1
|
||||
|
|
|
|
@ -0,0 +1,177 @@
|
|||
# Spanish translation for openobject-addons
|
||||
# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012
|
||||
# This file is distributed under the same license as the openobject-addons package.
|
||||
# FIRST AUTHOR <EMAIL@ADDRESS>, 2012.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: openobject-addons\n"
|
||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"POT-Creation-Date: 2012-02-08 01:06+0000\n"
|
||||
"PO-Revision-Date: 2012-11-08 14:29+0000\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: Spanish <es@li.org>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2012-11-09 04:39+0000\n"
|
||||
"X-Generator: Launchpad (build 16250)\n"
|
||||
|
||||
#. module: l10n_multilang
|
||||
#: model:ir.model,name:l10n_multilang.model_account_fiscal_position_template
|
||||
msgid "Template for Fiscal Position"
|
||||
msgstr "Plantilla para posición fiscal"
|
||||
|
||||
#. module: l10n_multilang
|
||||
#: sql_constraint:account.account:0
|
||||
msgid "The code of the account must be unique per company !"
|
||||
msgstr "¡El código de la cuenta debe ser único por compañía!"
|
||||
|
||||
#. module: l10n_multilang
|
||||
#: constraint:account.account.template:0
|
||||
msgid ""
|
||||
"Configuration Error!\n"
|
||||
"You can not define children to an account with internal type different of "
|
||||
"\"View\"! "
|
||||
msgstr ""
|
||||
"Error de configuración!\n"
|
||||
"¡No puede definir hijos para una cuenta con el tipo interno distinto de "
|
||||
"\"Vista\"! "
|
||||
|
||||
#. module: l10n_multilang
|
||||
#: model:ir.model,name:l10n_multilang.model_account_analytic_journal
|
||||
msgid "Analytic Journal"
|
||||
msgstr "Diario analítico"
|
||||
|
||||
#. module: l10n_multilang
|
||||
#: constraint:account.account.template:0
|
||||
msgid "Error ! You can not create recursive account templates."
|
||||
msgstr "¡Error! No puede crear plantillas de cuentas recursivas."
|
||||
|
||||
#. module: l10n_multilang
|
||||
#: model:ir.model,name:l10n_multilang.model_account_journal
|
||||
msgid "Journal"
|
||||
msgstr "Diario"
|
||||
|
||||
#. module: l10n_multilang
|
||||
#: model:ir.model,name:l10n_multilang.model_account_chart_template
|
||||
msgid "Templates for Account Chart"
|
||||
msgstr "Plantillas para el plan contable"
|
||||
|
||||
#. module: l10n_multilang
|
||||
#: sql_constraint:account.tax:0
|
||||
msgid "The description must be unique per company!"
|
||||
msgstr "¡La descripción debe ser única por compañia!"
|
||||
|
||||
#. module: l10n_multilang
|
||||
#: constraint:account.tax.code.template:0
|
||||
msgid "Error ! You can not create recursive Tax Codes."
|
||||
msgstr "¡Error! No puede crear códigos de impuestos recursivos."
|
||||
|
||||
#. module: l10n_multilang
|
||||
#: model:ir.model,name:l10n_multilang.model_account_tax_template
|
||||
msgid "account.tax.template"
|
||||
msgstr "Plantilla de impuestos"
|
||||
|
||||
#. module: l10n_multilang
|
||||
#: model:ir.model,name:l10n_multilang.model_account_tax
|
||||
msgid "account.tax"
|
||||
msgstr "Impuesto"
|
||||
|
||||
#. module: l10n_multilang
|
||||
#: model:ir.model,name:l10n_multilang.model_account_account
|
||||
msgid "Account"
|
||||
msgstr "Cuenta"
|
||||
|
||||
#. module: l10n_multilang
|
||||
#: model:ir.model,name:l10n_multilang.model_wizard_multi_charts_accounts
|
||||
msgid "wizard.multi.charts.accounts"
|
||||
msgstr "Asistente de plan de cuentas"
|
||||
|
||||
#. module: l10n_multilang
|
||||
#: constraint:account.journal:0
|
||||
msgid ""
|
||||
"Configuration error! The currency chosen should be shared by the default "
|
||||
"accounts too."
|
||||
msgstr ""
|
||||
"¡Error de configuración! La moneda elegida debería ser también la misma en "
|
||||
"las cuentas por defecto"
|
||||
|
||||
#. module: l10n_multilang
|
||||
#: model:ir.model,name:l10n_multilang.model_account_account_template
|
||||
msgid "Templates for Accounts"
|
||||
msgstr "Plantillas para cuentas"
|
||||
|
||||
#. module: l10n_multilang
|
||||
#: help:account.chart.template,spoken_languages:0
|
||||
msgid ""
|
||||
"State here the languages for which the translations of templates could be "
|
||||
"loaded at the time of installation of this localization module and copied in "
|
||||
"the final object when generating them from templates. You must provide the "
|
||||
"language codes separated by ';'"
|
||||
msgstr ""
|
||||
"Indique aquí los idiomas para los que las traducciones de las plantillas "
|
||||
"pueden ser cargadas en el momento de la instalación de este módulo de "
|
||||
"localización y copiados en el objeto final cuando se generen desde las "
|
||||
"plantillas. Debe proveer los códigos de idioma separados por ';'."
|
||||
|
||||
#. module: l10n_multilang
|
||||
#: constraint:account.account:0
|
||||
msgid "Error ! You can not create recursive accounts."
|
||||
msgstr "¡Error! No se pueden crear cuentas recursivas."
|
||||
|
||||
#. module: l10n_multilang
|
||||
#: constraint:account.account:0
|
||||
msgid ""
|
||||
"Configuration Error! \n"
|
||||
"You can not select an account type with a deferral method different of "
|
||||
"\"Unreconciled\" for accounts with internal type \"Payable/Receivable\"! "
|
||||
msgstr ""
|
||||
"¡Error de configuración! \n"
|
||||
"¡No puede seleccionar un tipo de cuenta con un método de cierre diferente de "
|
||||
"\"Reconciliado\" para las cuentas con tipo interno \"A pagar/A cobrar\"! "
|
||||
|
||||
#. module: l10n_multilang
|
||||
#: sql_constraint:account.journal:0
|
||||
msgid "The name of the journal must be unique per company !"
|
||||
msgstr "¡El nombre del diaro debe ser único por compañía!"
|
||||
|
||||
#. module: l10n_multilang
|
||||
#: model:ir.model,name:l10n_multilang.model_account_analytic_account
|
||||
msgid "Analytic Account"
|
||||
msgstr "Cuenta analítica"
|
||||
|
||||
#. module: l10n_multilang
|
||||
#: sql_constraint:account.journal:0
|
||||
msgid "The code of the journal must be unique per company !"
|
||||
msgstr "¡El código del diario debe ser único por compañía!"
|
||||
|
||||
#. module: l10n_multilang
|
||||
#: model:ir.model,name:l10n_multilang.model_account_fiscal_position
|
||||
msgid "Fiscal Position"
|
||||
msgstr "Posición fiscal"
|
||||
|
||||
#. module: l10n_multilang
|
||||
#: constraint:account.account:0
|
||||
msgid ""
|
||||
"Configuration Error! \n"
|
||||
"You can not define children to an account with internal type different of "
|
||||
"\"View\"! "
|
||||
msgstr ""
|
||||
"¡Error de configuración! \n"
|
||||
"¡No puede definir hijos en una cuenta con tipo interno distinto a \"Vista\"! "
|
||||
|
||||
#. module: l10n_multilang
|
||||
#: constraint:account.analytic.account:0
|
||||
msgid "Error! You can not create recursive analytic accounts."
|
||||
msgstr "¡Error! No puede crear cuentas analíticas recursivas."
|
||||
|
||||
#. module: l10n_multilang
|
||||
#: model:ir.model,name:l10n_multilang.model_account_tax_code_template
|
||||
msgid "Tax Code Template"
|
||||
msgstr "Plantilla códigos de impuestos"
|
||||
|
||||
#. module: l10n_multilang
|
||||
#: field:account.chart.template,spoken_languages:0
|
||||
msgid "Spoken Languages"
|
||||
msgstr "Idiomas hablados"
|
|
@ -22,12 +22,12 @@
|
|||
import mail_message_subtype
|
||||
import mail_alias
|
||||
import mail_followers
|
||||
import mail_favorite
|
||||
import mail_message
|
||||
import mail_mail
|
||||
import mail_thread
|
||||
import mail_group
|
||||
import mail_vote
|
||||
import mail_favorite
|
||||
import res_partner
|
||||
import res_users
|
||||
import report
|
||||
|
|
|
@ -2,6 +2,11 @@
|
|||
<openerp>
|
||||
<data noupdate="1">
|
||||
|
||||
<!-- Update demo user to avoid mail bombing -->
|
||||
<record id="base.partner_demo" model="res.partner">
|
||||
<field name="notification_email_send">none</field>
|
||||
</record>
|
||||
|
||||
<record id="message_blogpost0" model="mail.message">
|
||||
<field name="model">mail.group</field>
|
||||
<field name="res_id" ref="mail.group_all_employees"/>
|
||||
|
|
|
@ -357,7 +357,7 @@ openerp.mail = function (session) {
|
|||
this.context.default_parent_id,
|
||||
attachments,
|
||||
this.parent_thread.context
|
||||
]).then(function (record) {
|
||||
]).done(function (record) {
|
||||
var thread = self.parent_thread;
|
||||
// create object and attach to the thread object
|
||||
thread.message_fetch(false, false, [record], function (arg, data) {
|
||||
|
@ -745,7 +745,7 @@ openerp.mail = function (session) {
|
|||
}
|
||||
|
||||
// if this message is read, all childs message display is read
|
||||
this.ds_notification.call('set_message_read', [ [this.id].concat( this.get_child_ids() ) , this.to_read, this.context]).pipe(function () {
|
||||
this.ds_notification.call('set_message_read', [ [this.id].concat( this.get_child_ids() ) , this.to_read, this.context]).then(function () {
|
||||
self.$el.removeClass(self.to_read ? 'oe_msg_unread':'oe_msg_read').addClass(self.to_read ? 'oe_msg_read':'oe_msg_unread');
|
||||
self.to_read = !self.to_read;
|
||||
});
|
||||
|
@ -802,7 +802,7 @@ openerp.mail = function (session) {
|
|||
on_vote: function (event) {
|
||||
event.stopPropagation();
|
||||
var self=this;
|
||||
return this.ds_message.call('vote_toggle', [[self.id]]).pipe(function (vote) {
|
||||
return this.ds_message.call('vote_toggle', [[self.id]]).then(function (vote) {
|
||||
self.has_voted = vote;
|
||||
self.vote_nb += self.has_voted ? 1 : -1;
|
||||
self.display_vote();
|
||||
|
@ -827,7 +827,7 @@ openerp.mail = function (session) {
|
|||
event.stopPropagation();
|
||||
var self=this;
|
||||
var button = self.$('.oe_star:first');
|
||||
return this.ds_message.call('favorite_toggle', [[self.id]]).pipe(function (star) {
|
||||
return this.ds_message.call('favorite_toggle', [[self.id]]).then(function (star) {
|
||||
self.is_favorite=star;
|
||||
if (self.is_favorite) {
|
||||
button.addClass('oe_starred');
|
||||
|
@ -1112,7 +1112,7 @@ openerp.mail = function (session) {
|
|||
var thread_level = this.options.display_indented_thread > this.thread_level ? this.options.display_indented_thread - this.thread_level : 0;
|
||||
|
||||
return this.ds_message.call('message_read', [ids, fetch_domain, message_loaded_ids, thread_level, fetch_context, this.context.default_parent_id || undefined])
|
||||
.then(callback ? _.bind(callback, this, arguments) : this.proxy('switch_new_message'));
|
||||
.done(callback ? _.bind(callback, this, arguments) : this.proxy('switch_new_message'));
|
||||
},
|
||||
|
||||
/**
|
||||
|
@ -1581,7 +1581,7 @@ openerp.mail = function (session) {
|
|||
load_searchview: function (defaults, hidden) {
|
||||
var self = this;
|
||||
this.searchview = new session.web.SearchView(this, this.ds_msg, false, defaults || {}, hidden || false);
|
||||
return this.searchview.appendTo(this.$('.oe_view_manager_view_search')).then(function () {
|
||||
return this.searchview.appendTo(this.$('.oe_view_manager_view_search')).done(function () {
|
||||
self.searchview.on('search_data', self, self.do_searchview_search);
|
||||
});
|
||||
},
|
||||
|
@ -1599,7 +1599,7 @@ openerp.mail = function (session) {
|
|||
domains: domains || [],
|
||||
contexts: contexts || [],
|
||||
group_by_seq: groupbys || []
|
||||
}).then(function (results) {
|
||||
}).done(function (results) {
|
||||
self.search_results['context'] = results.context;
|
||||
self.search_results['domain'] = results.domain;
|
||||
self.root.destroy();
|
||||
|
|
|
@ -85,7 +85,7 @@ openerp_mail_followers = function(session, mail) {
|
|||
|
||||
read_value: function () {
|
||||
var self = this;
|
||||
return this.ds_model.read_ids([this.view.datarecord.id], ['message_follower_ids']).pipe(function (results) {
|
||||
return this.ds_model.read_ids([this.view.datarecord.id], ['message_follower_ids']).then(function (results) {
|
||||
self.set_value(results[0].message_follower_ids);
|
||||
});
|
||||
},
|
||||
|
@ -98,9 +98,9 @@ openerp_mail_followers = function(session, mail) {
|
|||
fetch_followers: function (value_) {
|
||||
this.value = value_ || {};
|
||||
return this.ds_follow.call('read', [this.value, ['name', 'user_ids']])
|
||||
.pipe(this.proxy('display_followers'), this.proxy('fetch_generic'))
|
||||
.pipe(this.proxy('display_buttons'))
|
||||
.pipe(this.proxy('fetch_subtypes'));
|
||||
.then(this.proxy('display_followers'), this.proxy('fetch_generic'))
|
||||
.then(this.proxy('display_buttons'))
|
||||
.then(this.proxy('fetch_subtypes'));
|
||||
},
|
||||
|
||||
/** Read on res.partner failed: fall back on a generic case
|
||||
|
@ -109,10 +109,10 @@ openerp_mail_followers = function(session, mail) {
|
|||
fetch_generic: function (error, event) {
|
||||
var self = this;
|
||||
event.preventDefault();
|
||||
return this.ds_users.call('read', [this.session.uid, ['partner_id']]).pipe(function (results) {
|
||||
return this.ds_users.call('read', [this.session.uid, ['partner_id']]).then(function (results) {
|
||||
var pid = results['partner_id'][0];
|
||||
self.message_is_follower = (_.indexOf(self.get('value'), pid) != -1);
|
||||
}).pipe(self.proxy('display_generic'));
|
||||
}).then(self.proxy('display_generic'));
|
||||
},
|
||||
_format_followers: function(count){
|
||||
// TDE note: why redefining _t ?
|
||||
|
@ -179,7 +179,7 @@ openerp_mail_followers = function(session, mail) {
|
|||
var subtype_list_ul = this.$('.oe_subtype_list').empty();
|
||||
if (! this.message_is_follower) return;
|
||||
var context = new session.web.CompoundContext(this.build_context(), {});
|
||||
this.ds_model.call('message_get_subscription_data', [[this.view.datarecord.id], context]).pipe(this.proxy('display_subtypes'));
|
||||
this.ds_model.call('message_get_subscription_data', [[this.view.datarecord.id], context]).then(this.proxy('display_subtypes'));
|
||||
},
|
||||
|
||||
/** Display subtypes: {'name': default, followed} */
|
||||
|
@ -206,7 +206,7 @@ openerp_mail_followers = function(session, mail) {
|
|||
$(record).attr('checked',false);
|
||||
});
|
||||
var context = new session.web.CompoundContext(this.build_context(), {});
|
||||
return this.ds_model.call('message_unsubscribe_users', [[this.view.datarecord.id], [this.session.uid], context]).pipe(this.proxy('read_value'));
|
||||
return this.ds_model.call('message_unsubscribe_users', [[this.view.datarecord.id], [this.session.uid], context]).then(this.proxy('read_value'));
|
||||
},
|
||||
|
||||
do_update_subscription: function (event) {
|
||||
|
@ -221,7 +221,7 @@ openerp_mail_followers = function(session, mail) {
|
|||
|
||||
var context = new session.web.CompoundContext(this.build_context(), {});
|
||||
return this.ds_model.call('message_subscribe_users', [[this.view.datarecord.id], [this.session.uid], this.message_is_follower ? checklist:undefined, context])
|
||||
.pipe(this.proxy('read_value'));
|
||||
.then(this.proxy('read_value'));
|
||||
},
|
||||
});
|
||||
};
|
||||
|
|
|
@ -46,7 +46,7 @@ instance.web.form.FieldMany2ManyTagsEmail = instance.web.form.FieldMany2ManyTags
|
|||
["email", "=", false],
|
||||
["notification_email_send", "in", ['all', 'comment']] ]],
|
||||
{context: this.build_context()})
|
||||
.pipe(function (record_ids) {
|
||||
.then(function (record_ids) {
|
||||
// valid partner
|
||||
var valid_partner = _.difference(ids, record_ids);
|
||||
self.values = self.values.concat(valid_partner);
|
||||
|
|
|
@ -270,7 +270,7 @@
|
|||
<field name="signal" groups="base.group_no_one"/>
|
||||
<field name="start"/>
|
||||
<field name="object_id" invisible="1"/>
|
||||
<field name="campaign_id" invisible="1"/>
|
||||
<field name="campaign_id" invisible="1" required="0"/>
|
||||
</group>
|
||||
<group>
|
||||
<field name="variable_cost"/>
|
||||
|
|
|
@ -13,8 +13,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2012-11-08 04:47+0000\n"
|
||||
"X-Generator: Launchpad (build 16232)\n"
|
||||
"X-Launchpad-Export-Date: 2012-11-09 04:39+0000\n"
|
||||
"X-Generator: Launchpad (build 16250)\n"
|
||||
|
||||
#. module: mrp
|
||||
#: view:mrp.routing.workcenter:0
|
||||
|
|
|
@ -111,7 +111,7 @@ class report_custom(report_rml):
|
|||
<PageWidth>595.27</PageWidth>
|
||||
<PageHeight>841.88</PageHeight>
|
||||
<tableSize>55.00mm,58.00mm,29.00mm,29.00mm,29.00mm</tableSize>
|
||||
""" % (user_pool.browse(cr, uid, uid).company_id.name)
|
||||
""" % to_xml(user_pool.browse(cr, uid, uid).company_id.name)
|
||||
config_stop = """
|
||||
<report-footer>Generated by OpenERP</report-footer>
|
||||
</config>
|
||||
|
|
|
@ -28,10 +28,6 @@ class mrp_config_settings(osv.osv_memory):
|
|||
_inherit = 'res.config.settings'
|
||||
|
||||
_columns = {
|
||||
'module_stock_planning': fields.boolean('Manage master production shedule',
|
||||
help ="""This allows to create a manual procurement plan apart of the normal MRP scheduling,
|
||||
which works automatically based on minimum stock rules.
|
||||
This installs the module stock_planning."""),
|
||||
'module_mrp_repair': fields.boolean("Manage repairs of products ",
|
||||
help="""Allows to manage all product repairs.
|
||||
* Add/remove products in the reparation
|
||||
|
|
|
@ -56,10 +56,6 @@
|
|||
<field name="module_mrp_operations" class="oe_inline"/>
|
||||
<label for="module_mrp_operations" />
|
||||
</div>
|
||||
<div>
|
||||
<field name="module_stock_planning" class="oe_inline"/>
|
||||
<label for="module_stock_planning"/>
|
||||
</div>
|
||||
</div>
|
||||
</group>
|
||||
<separator string="Master Data"/>
|
||||
|
|
|
@ -690,7 +690,7 @@ class mrp_repair_line(osv.osv, ProductChangeMixin):
|
|||
'repair_id': fields.many2one('mrp.repair', 'Repair Order Reference',ondelete='cascade', select=True),
|
||||
'type': fields.selection([('add','Add'),('remove','Remove')],'Type', required=True),
|
||||
'to_invoice': fields.boolean('To Invoice'),
|
||||
'product_id': fields.many2one('product.product', 'Product', domain=[('sale_ok','=',True)], required=True),
|
||||
'product_id': fields.many2one('product.product', 'Product', required=True),
|
||||
'invoiced': fields.boolean('Invoiced',readonly=True),
|
||||
'price_unit': fields.float('Unit Price', required=True, digits_compute= dp.get_precision('Product Price')),
|
||||
'price_subtotal': fields.function(_amount_line, string='Subtotal',digits_compute= dp.get_precision('Account')),
|
||||
|
|
|
@ -49,8 +49,8 @@
|
|||
padding: 8px;
|
||||
margin-left: 3px;
|
||||
margin-right: 3px;
|
||||
padding-bottom: 16px;
|
||||
margin-bottom: 16px;
|
||||
padding-bottom: 8px;
|
||||
margin-bottom: 10px;
|
||||
-webkit-transform: rotate(-2deg);
|
||||
-o-transform: rotate(-2deg);
|
||||
-moz-transform: rotate(-2deg);
|
||||
|
|
|
@ -53,8 +53,8 @@
|
|||
padding: 8px
|
||||
margin-left: 3px
|
||||
margin-right: 3px
|
||||
padding-bottom: 16px
|
||||
margin-bottom: 16px
|
||||
padding-bottom: 8px
|
||||
margin-bottom: 10px
|
||||
@include rotate(-2deg)
|
||||
@include transition(all, 300ms)
|
||||
.oe_kanban_record:nth-of-type(even)
|
||||
|
|
|
@ -19,7 +19,7 @@ class pad_common(osv.osv_memory):
|
|||
|
||||
pad = {
|
||||
"server" : company.pad_server,
|
||||
"key" : company.pad_key or "4DxmsNIbnQUVQMW9S9tx2oLOSjFdrx1l",
|
||||
"key" : company.pad_key,
|
||||
}
|
||||
|
||||
# make sure pad server in the form of http://hostname
|
||||
|
|
|
@ -1,9 +1,13 @@
|
|||
<openerp>
|
||||
<data noupdate="1">
|
||||
<data>
|
||||
|
||||
<record id="base.main_company" model="res.company">
|
||||
<field name="pad_server">pad.openerp.com</field>
|
||||
</record>
|
||||
|
||||
<record id="base.main_company" model="res.company">
|
||||
<field name="pad_key">4DxmsNIbnQUVQMW9S9tx2oLOSjFdrx1l</field>
|
||||
</record>
|
||||
|
||||
</data>
|
||||
</openerp>
|
||||
|
|
|
@ -12,8 +12,9 @@ openerp.pad = function(instance) {
|
|||
model: self.view.model,
|
||||
field_name: self.name,
|
||||
object_id: self.view.datarecord.id
|
||||
}}).then(function(data) {
|
||||
}}).done(function(data) {
|
||||
if(data&&data.url){
|
||||
self.set({value: data.url});
|
||||
_super(data.url);
|
||||
self.renderElement();
|
||||
}
|
||||
|
|
|
@ -0,0 +1,39 @@
|
|||
# Spanish translation for openobject-addons
|
||||
# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012
|
||||
# This file is distributed under the same license as the openobject-addons package.
|
||||
# FIRST AUTHOR <EMAIL@ADDRESS>, 2012.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: openobject-addons\n"
|
||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"POT-Creation-Date: 2012-02-08 00:36+0000\n"
|
||||
"PO-Revision-Date: 2012-11-08 12:44+0000\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: Spanish <es@li.org>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2012-11-09 04:39+0000\n"
|
||||
"X-Generator: Launchpad (build 16250)\n"
|
||||
|
||||
#. module: pad_project
|
||||
#: constraint:project.task:0
|
||||
msgid "Error ! Task end-date must be greater then task start-date"
|
||||
msgstr ""
|
||||
"¡Error! La fecha final de la tarea debe ser mayor que la fecha de inicio"
|
||||
|
||||
#. module: pad_project
|
||||
#: model:ir.model,name:pad_project.model_project_task
|
||||
msgid "Task"
|
||||
msgstr "Tarea"
|
||||
|
||||
#. module: pad_project
|
||||
#: view:project.task:0
|
||||
msgid "Pad"
|
||||
msgstr "Pad"
|
||||
|
||||
#. module: pad_project
|
||||
#: constraint:project.task:0
|
||||
msgid "Error ! You cannot create recursive tasks."
|
||||
msgstr "¡Error! No se pueden crear tareas recursivas."
|
|
@ -0,0 +1,23 @@
|
|||
# Spanish translation for openobject-addons
|
||||
# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012
|
||||
# This file is distributed under the same license as the openobject-addons package.
|
||||
# FIRST AUTHOR <EMAIL@ADDRESS>, 2012.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: openobject-addons\n"
|
||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"POT-Creation-Date: 2012-02-08 00:36+0000\n"
|
||||
"PO-Revision-Date: 2012-11-08 11:25+0000\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: Spanish <es@li.org>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2012-11-09 04:39+0000\n"
|
||||
"X-Generator: Launchpad (build 16250)\n"
|
||||
|
||||
#. module: plugin
|
||||
#: model:ir.model,name:plugin.model_plugin_handler
|
||||
msgid "plugin.handler"
|
||||
msgstr "Manejador del plug-in"
|
|
@ -10,7 +10,11 @@
|
|||
<form position="attributes">
|
||||
<attribute name="string">Install Outlook Plug-In</attribute>
|
||||
</form>
|
||||
<xpath expr="//footer" position="replace"/>
|
||||
<xpath expr="//footer" position="replace">
|
||||
<footer>
|
||||
<button string="Close" special="Cancel" class="oe_highlight"/>
|
||||
</footer>
|
||||
</xpath>
|
||||
<xpath expr="//separator[@string='title']" position="after" version="7.0">
|
||||
<group>
|
||||
<field name="plugin32" widget="url"/>
|
||||
|
@ -19,10 +23,10 @@
|
|||
<separator string="Installation and Configuration Steps"/>
|
||||
<p>Click on the link above to download the installer for either 32 or 64 bits, and execute it.</p>
|
||||
<p>System requirements:</p>
|
||||
<ul>
|
||||
<li>1. MS Outlook 2005 or above.</li>
|
||||
<li>2. MS .Net Framework 3.5 or above.</li>
|
||||
</ul>
|
||||
<ol>
|
||||
<li> MS Outlook 2005 or above.</li>
|
||||
<li> MS .Net Framework 3.5 or above.</li>
|
||||
</ol>
|
||||
</xpath>
|
||||
<separator string="title" position="attributes">
|
||||
<attribute name="string"></attribute>
|
||||
|
@ -51,7 +55,7 @@
|
|||
<div>
|
||||
<field name="module_plugin_outlook" class="oe_inline"/>
|
||||
<label for="module_plugin_outlook"/>
|
||||
<button name="%(action_outlook_installer)d" type="action" string="Download and install the plugin" icon="gtk-execute"
|
||||
<button name="%(action_outlook_installer)d" type="action" string="Download and install the plug-in" icon="gtk-execute"
|
||||
attrs="{'invisible': [('module_plugin_outlook','=',False)]}" class="oe_link"/>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
@ -30,13 +30,11 @@ class plugin_thunderbird_installer(osv.osv_memory):
|
|||
'thunderbird': fields.boolean('Thunderbird Plug-in', help="Allows you to select an object that you would like to add to your email and its attachments."),
|
||||
'plugin_name': fields.char('File name', size=64),
|
||||
'plugin_file': fields.char('Thunderbird Plug-in', size=256, readonly=True, help="Thunderbird plug-in file. Save this file and install it in Thunderbird."),
|
||||
'pdf_file': fields.char('Installation Manual', size=256, help="The documentation file :- how to install Thunderbird Plug-in.", readonly=True),
|
||||
}
|
||||
|
||||
_defaults = {
|
||||
'thunderbird': True,
|
||||
'plugin_name': 'openerp_plugin.xpi',
|
||||
'pdf_file': 'http://doc.openerp.com/book/2/2_6_Comms/2_6_Comms_thunderbird.html',
|
||||
}
|
||||
|
||||
def default_get(self, cr, uid, fields, context=None):
|
||||
|
@ -45,4 +43,4 @@ class plugin_thunderbird_installer(osv.osv_memory):
|
|||
res['plugin_file'] = base_url + '/plugin_thunderbird/static/openerp_plugin.xpi'
|
||||
return res
|
||||
|
||||
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
||||
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
||||
|
|
|
@ -10,25 +10,28 @@
|
|||
<form position="attributes">
|
||||
<attribute name="string">Install Thunderbird Plug-In</attribute>
|
||||
</form>
|
||||
<xpath expr="//footer" position="replace"/>
|
||||
<xpath expr="//footer" position="replace">
|
||||
<footer>
|
||||
<button string="Close" special="Cancel" class="oe_highlight"/>
|
||||
</footer>
|
||||
</xpath>
|
||||
<xpath expr="//separator[@string='title']" position="after">
|
||||
<group>
|
||||
<field name="thunderbird" invisible="1"/>
|
||||
<field name="plugin_name" invisible="1"/>
|
||||
<field name="plugin_file" filename="plugin_name" widget="url"/>
|
||||
<field name="pdf_file" widget="url"/>
|
||||
</group>
|
||||
<separator string="Installation and Configuration Steps"/>
|
||||
<p>Thunderbird plugin installation:</p>
|
||||
<ul>
|
||||
<li>1. Save the Thunderbird plug-in.</li>
|
||||
<li>2. From the Thunderbird menubar: Tools > Add-ons -> Screwdriver/Wrench Icon -> Install add-on from file...</li>
|
||||
<li>3. Select the plug-in (the file named openerp_plugin.xpi).</li>
|
||||
<li>4. Click "Install Now".</li>
|
||||
<li>5. Restart Thunderbird.</li>
|
||||
<li>6. From the Thunderbird menubar: OpenERP -> Configuration.</li>
|
||||
<li>7. Configure your openerp server.</li>
|
||||
</ul>
|
||||
<p>Thunderbird plug-in installation:</p>
|
||||
<ol>
|
||||
<li> Save the Thunderbird plug-in.</li>
|
||||
<li> From the Thunderbird menubar: Tools > Add-ons -> Screwdriver/Wrench Icon -> Install add-on from file...</li>
|
||||
<li> Select the plug-in (the file named openerp_plugin.xpi).</li>
|
||||
<li> Click "Install Now".</li>
|
||||
<li> Restart Thunderbird.</li>
|
||||
<li> From the Thunderbird menubar: OpenERP -> Configuration.</li>
|
||||
<li> Configure your openerp server.</li>
|
||||
</ol>
|
||||
</xpath>
|
||||
<separator string="title" position="attributes">
|
||||
<attribute name="string"></attribute>
|
||||
|
@ -57,7 +60,7 @@
|
|||
<div>
|
||||
<field name="module_plugin_thunderbird" class="oe_inline"/>
|
||||
<label for="module_plugin_thunderbird"/>
|
||||
<button name="%(action_thunderbird_installer)d" type="action" string="Download and install the plugin" icon="gtk-execute"
|
||||
<button name="%(action_thunderbird_installer)d" type="action" string="Download and install the plug-in" icon="gtk-execute"
|
||||
attrs="{'invisible': [('module_plugin_thunderbird','=',False)]}" class="oe_link"/>
|
||||
</div>
|
||||
</div>
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue