[MERGE] Forward-port 9.0 up to d982ba0d5a

This commit is contained in:
Olivier Dony
2015-09-11 03:10:52 +02:00
139 changed files with 3469 additions and 536 deletions
+12
View File
@@ -47,7 +47,19 @@ You could use this simplified accounting in case you work with an (external) acc
'report/account_invoice_report_view.xml',
'report/inherited_layouts.xml',
'views/account_journal_dashboard_view.xml',
'views/report_overdue.xml',
'views/web_planner_data.xml',
'views/report_overdue.xml',
'wizard/account_report_common_view.xml',
'wizard/account_report_general_ledger_view.xml',
'views/report_generalledger.xml',
'wizard/account_report_trial_balance_view.xml',
'views/report_trialbalance.xml',
'views/account_financial_report_data.xml',
'wizard/account_financial_report_view.xml',
'views/report_financial.xml',
'wizard/account_report_aged_partner_balance_view.xml',
'views/report_agedpartnerbalance.xml',
],
'demo': [
'demo/account_demo.xml',
+64 -44
View File
@@ -6,8 +6,8 @@ msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 9.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-09-07 14:40+0000\n"
"PO-Revision-Date: 2015-09-07 14:40+0000\n"
"POT-Creation-Date: 2015-09-10 10:19+0000\n"
"PO-Revision-Date: 2015-09-10 10:19+0000\n"
"Last-Translator: <>\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
@@ -192,7 +192,7 @@ msgstr ""
msgid "<span class=\"panel-title\">\n"
" <span class=\"fa\" data-icon=\"&#57408;\"/>\n"
" <strong>Import a file</strong><br/>\n"
" <span class=\"small\">Recommanded if &gt;100 products</span>\n"
" <span class=\"small\">Recommended if &gt;100 products</span>\n"
" </span>"
msgstr ""
@@ -219,7 +219,7 @@ msgstr ""
msgid "<span class=\"panel-title\">\n"
" <span class=\"fa\" data-icon=\"&#57440;\"/>\n"
" <strong> Create manually</strong><br/>\n"
" <span class=\"small\">Recommanded if &lt;100 products</span>\n"
" <span class=\"small\">Recommended if &lt;100 products</span>\n"
" </span>"
msgstr ""
@@ -368,12 +368,12 @@ msgstr ""
#. module: account
#: model:ir.ui.view,arch_db:account.account_planner
msgid "<strong>Automated documents sending:</strong> automatically print, send and deliver your invoices &amp; letters by regular mail or email."
msgid "<strong>Automated documents sending:</strong> automatically send your invoices by email or regular mail,"
msgstr ""
#. module: account
#: model:ir.ui.view,arch_db:account.account_planner
msgid "<strong>Bank interface:</strong> your bank statements are automatically synchronized with your bank."
msgid "<strong>Bank interface:</strong> with bank feeds synchronization or bank statement import."
msgstr ""
#. module: account
@@ -394,7 +394,7 @@ msgstr ""
#. module: account
#: model:ir.ui.view,arch_db:account.account_planner
msgid "<strong>Clean customer invoices:</strong> easy to create, beautiful and fully featured invoices (payment terms, multiple taxes, discounts, etc)."
msgid "<strong>Clean customer invoices:</strong> easy to create, beautiful and full featured invoices,"
msgstr ""
#. module: account
@@ -471,7 +471,7 @@ msgstr ""
#. module: account
#: model:ir.ui.view,arch_db:account.account_planner
msgid "<strong>On-the-fly payment reconciliation:</strong> automatic suggestion of outstanding payments when creating an invoice."
msgid "<strong>On-the-fly payment reconciliation:</strong> automatic suggestion of outstanding payments when creating an invoice,"
msgstr ""
#. module: account
@@ -526,7 +526,7 @@ msgstr ""
#. module: account
#: model:ir.ui.view,arch_db:account.account_planner
msgid "<strong>Reduced data entry:</strong> no need to manually create every invoice, register bank statements, follow-up payments, etc."
msgid "<strong>Reduced data entry:</strong> no need to manually create invoices, register bank statements, follow-up payments,"
msgstr ""
#. module: account
@@ -919,7 +919,6 @@ msgstr ""
#. module: account
#: model:ir.ui.menu,name:account.account_account_menu
#: model:ir.ui.menu,name:account.menu_finance
#: model:ir.ui.view,arch_db:account.product_template_form_view
#: model:ir.ui.view,arch_db:account.view_partner_property_form
msgid "Accounting"
@@ -1351,9 +1350,9 @@ msgstr ""
#. module: account
#: model:ir.model.fields,help:account.field_account_config_settings_module_account_asset
msgid "Asset management: This allows you to manage the assets owned by a company or a person.It keeps track of the depreciation occurred on those assets, and creates account move for those depreciation lines.\n"
msgid "Asset management: This allows you to manage the assets owned by a company or a person. It keeps track of the depreciation occurred on those assets, and creates account move for those depreciation lines.\n"
"\n"
"Revenue recognition: This allows you to manage the Revenue recognition on selling product.It keeps track of the installment occurred on those revenue recognition, and creates account move for those installment lines.\n"
"Revenue recognition: This allows you to manage the Revenue recognition on selling product. It keeps track of the installment occurred on those revenue recognition, and creates account move for those installment lines.\n"
"-This installs the module account_asset. If you do not check this box, you will be able to do invoicing & payments, but not accounting (Journal Items, Chart of Accounts, ...)"
msgstr ""
@@ -2235,6 +2234,11 @@ msgid "Configuration error!\n"
"The currency of the journal should be the same than the default debit account."
msgstr ""
#. module: account
#: model:ir.ui.view,arch_db:account.account_planner
msgid "Configuration menu"
msgstr ""
#. module: account
#: model:ir.actions.act_window,name:account.action_account_config
#: model:ir.ui.view,arch_db:account.view_account_config_settings
@@ -2578,6 +2582,11 @@ msgstr ""
msgid "Current Year Earnings"
msgstr ""
#. module: account
#: model:ir.ui.view,arch_db:account.account_planner
msgid "Current account balances"
msgstr ""
#. module: account
#: selection:account.abstract.payment,partner_type:0
#: selection:account.payment,partner_type:0
@@ -3369,6 +3378,11 @@ msgid "For the Odoo Team,<br/>\n"
" Fabien Pinckaers, Founder"
msgstr ""
#. module: account
#: model:ir.ui.view,arch_db:account.account_planner
msgid "For the setup, you will need to get access to the following information:"
msgstr ""
#. module: account
#: model:ir.model.fields,help:account.field_account_account_currency_id
msgid "Forces all moves for this account to have this account currency."
@@ -3639,7 +3653,7 @@ msgstr ""
#. module: account
#: model:ir.ui.view,arch_db:account.account_planner
msgid "If you have less than 200 contacts, we recommand you\n"
msgid "If you have less than 200 contacts, we recommend you\n"
" to create them manually."
msgstr ""
@@ -3693,7 +3707,9 @@ msgstr ""
#. module: account
#: model:ir.ui.view,arch_db:account.account_planner
msgid "If you'd like some help on any subject dont hesitate to contact our Accounting experts by using the <span class=\"fa fa-question-circle\"/> icon on the top bar."
msgid "If you'd like some help on any subject dont hesitate to\n"
" contact our Accounting experts by using the <span class=\"fa fa-question-circle\"/>\n"
" icon on the top bar."
msgstr ""
#. module: account
@@ -4007,6 +4023,11 @@ msgstr ""
msgid "Invoices to validate"
msgstr ""
#. module: account
#: model:ir.ui.menu,name:account.menu_finance
msgid "Invoicing"
msgstr ""
#. module: account
#: model:ir.model.fields,field_description:account.field_account_bank_statement_message_is_follower
#: model:ir.model.fields,field_description:account.field_account_invoice_message_is_follower
@@ -5007,11 +5028,6 @@ msgid "Once draft invoices are confirmed, you will not be able\n"
" of accounts."
msgstr ""
#. module: account
#: model:ir.ui.view,arch_db:account.account_planner
msgid "Once you're done, you'll benefit from:"
msgstr ""
#. module: account
#: model:ir.ui.view,arch_db:account.account_planner
msgid "Once your bank accounts are registered, you will be able to\n"
@@ -5171,6 +5187,11 @@ msgstr ""
msgid "Outstanding debits"
msgstr ""
#. module: account
#: model:ir.ui.view,arch_db:account.account_planner
msgid "Outstanding invoices, payments and undeposited funds"
msgstr ""
#. module: account
#: model:ir.ui.view,arch_db:account.view_account_invoice_filter
msgid "Overdue"
@@ -5834,12 +5855,6 @@ msgstr ""
msgid "Put Money In"
msgstr ""
#. module: account
#: selection:account.tax,amount_type:0
#: selection:account.tax.template,amount_type:0
msgid "Python Code"
msgstr ""
#. module: account
#: model:ir.model.fields,field_description:account.field_account_invoice_line_quantity
#: model:ir.model.fields,field_description:account.field_account_move_line_quantity
@@ -6140,6 +6155,7 @@ msgid "Residual Amount in Currency"
msgstr ""
#. module: account
#: model:ir.model.fields,field_description:account.field_account_bank_statement_user_id
#: model:ir.ui.view,arch_db:account.invoice_supplier_form
msgid "Responsible"
msgstr ""
@@ -6189,7 +6205,7 @@ msgstr ""
#. module: account
#: model:ir.ui.view,arch_db:account.account_planner
msgid "Review the list of available currencies (from the Configuration menu)"
msgid "Review the list of available currencies (from the"
msgstr ""
#. module: account
@@ -7221,7 +7237,8 @@ msgstr ""
#. module: account
#: model:ir.ui.view,arch_db:account.account_planner
msgid "This guide will help you get started with Odoo Accounting."
msgid "This guide will help you get started with Odoo Accounting.\n"
" Once you're done, you'll benefit from:"
msgstr ""
#. module: account
@@ -7656,11 +7673,6 @@ msgstr ""
msgid "Used to register a profit when the ending balance of a cash register differs from what the system computes"
msgstr ""
#. module: account
#: model:ir.model.fields,field_description:account.field_account_bank_statement_user_id
msgid "User"
msgstr ""
#. module: account
#: model:ir.model.fields,help:account.field_account_bank_statement_line_journal_currency_id
#: model:ir.model.fields,help:account.field_account_move_line_company_currency_id
@@ -7811,18 +7823,6 @@ msgstr ""
msgid "We hope this tool helped you implement our accounting application."
msgstr ""
#. module: account
#: model:ir.model.fields,field_description:account.field_account_bank_statement_website_message_ids
#: model:ir.model.fields,field_description:account.field_account_invoice_website_message_ids
msgid "Website Messages"
msgstr ""
#. module: account
#: model:ir.model.fields,help:account.field_account_bank_statement_website_message_ids
#: model:ir.model.fields,help:account.field_account_invoice_website_message_ids
msgid "Website communication history"
msgstr ""
#. module: account
#: model:ir.ui.view,arch_db:account.account_planner
msgid "When inviting users, you need to define which access and rights they are allowed.<br/>This is done by attributing a role to each users."
@@ -8087,6 +8087,26 @@ msgstr ""
msgid "You will find more options in your company details: address for the header and footer, overdue payments texts, etc."
msgstr ""
#. module: account
#: model:ir.ui.view,arch_db:account.account_planner
msgid "Your bank accounts: one statement per bank account"
msgstr ""
#. module: account
#: model:ir.ui.view,arch_db:account.account_planner
msgid "Your company: legal name, Tax ID, address, logo."
msgstr ""
#. module: account
#: model:ir.ui.view,arch_db:account.account_planner
msgid "Your usual payment terms"
msgstr ""
#. module: account
#: model:ir.ui.view,arch_db:account.account_planner
msgid "Your usual tax rates"
msgstr ""
#. module: account
#: model:ir.ui.view,arch_db:account.view_account_position_form
msgid "Zip Range"
+8
View File
@@ -35,7 +35,15 @@ class ResCompany(models.Model):
property_stock_account_output_categ_id = fields.Many2one('account.account', oldname="property_stock_account_output_categ")
property_stock_valuation_account_id = fields.Many2one('account.account')
bank_journal_ids = fields.One2many('account.journal', 'company_id', domain=[('type', '=', 'bank')], string='Bank Journals')
overdue_msg = fields.Text(string='Overdue Payments Message', translate=True,
default='''Dear Sir/Madam,
Our records indicate that some payments on your account are still due. Please find details below.
If the amount has already been paid, please disregard this notice. Otherwise, please forward us the total amount stated below.
If you have any queries regarding your account, Please contact us.
Thank you in advance for your cooperation.
Best Regards,''')
@api.multi
def compute_fiscalyear_dates(self, date):
+2 -2
View File
@@ -73,9 +73,9 @@ class AccountConfigSettings(models.TransientModel):
help="""If you do not check this box, you will be able to do invoicing & payments,
but not accounting (Journal Items, Chart of Accounts, ...)""")
module_account_asset = fields.Boolean(string='Assets management & Revenue recognition',
help='Asset management: This allows you to manage the assets owned by a company or a person.'
help='Asset management: This allows you to manage the assets owned by a company or a person. '
'It keeps track of the depreciation occurred on those assets, and creates account move for those depreciation lines.\n\n'
'Revenue recognition: This allows you to manage the Revenue recognition on selling product.'
'Revenue recognition: This allows you to manage the Revenue recognition on selling product. '
'It keeps track of the installment occurred on those revenue recognition, and creates account move for those installment lines.\n'
'-This installs the module account_asset. If you do not check this box, you will be able to do invoicing & payments, '
'but not accounting (Journal Items, Chart of Accounts, ...)')
+5
View File
@@ -3,3 +3,8 @@
import account_financial_report
import account_invoice_report
import account_overdue_report
import account_general_ledger
import account_balance
import account_report_financial
import account_aged_partner_balance
@@ -0,0 +1,299 @@
# -*- coding: utf-8 -*-
import time
from openerp import api, models
class ReportAgedPartnerBalance(models.AbstractModel):
_name = 'report.account.report_agedpartnerbalance'
def _get_partner_move_lines(self, form, account_type, date_from, target_move):
res = []
self.total_account = []
cr = self.env.cr
move_state = ['draft', 'posted']
if target_move == 'posted':
move_state = ['posted']
cr.execute('SELECT DISTINCT res_partner.id AS id,\
res_partner.name AS name \
FROM res_partner,account_move_line AS l, account_account, account_move am\
WHERE (l.account_id = account_account.id) \
AND (l.move_id = am.id) \
AND (am.state IN %s)\
AND (account_account.internal_type IN %s)\
AND l.reconciled IS FALSE\
AND (l.partner_id = res_partner.id)\
AND (l.date <= %s)\
ORDER BY res_partner.name', (tuple(move_state), tuple(account_type), date_from))
partners = cr.dictfetchall()
# put a total of 0
for i in range(7):
self.total_account.append(0)
# Build a string like (1,2,3) for easy use in SQL query
partner_ids = [partner['id'] for partner in partners]
if not partner_ids:
return []
# This dictionary will store the debit-credit for all partners, using partner_id as key.
totals = {}
cr.execute('SELECT l.partner_id, SUM(l.debit-l.credit) \
FROM account_move_line AS l, account_account, account_move am \
WHERE (l.account_id = account_account.id) AND (l.move_id = am.id) \
AND (am.state IN %s)\
AND (account_account.internal_type IN %s)\
AND (l.partner_id IN %s)\
AND (l.date <= %s)\
GROUP BY l.partner_id ', (tuple(move_state), tuple(account_type), tuple(partner_ids), date_from,))
partner_totals = cr.fetchall()
for partner_id, amount in partner_totals:
totals[partner_id] = amount
# This dictionary will store the future or past of all partners
future_past = {}
cr.execute('SELECT l.partner_id, SUM(l.debit - l.credit) \
FROM account_move_line AS l, account_account, account_move am \
WHERE (l.account_id = account_account.id) AND (l.move_id = am.id)\
AND (am.state IN %s)\
AND (account_account.internal_type IN %s)\
AND (COALESCE(l.date_maturity,l.date) > %s)\
AND (l.partner_id IN %s)\
AND l.reconciled IS FALSE\
AND (l.date <= %s)\
GROUP BY l.partner_id', (tuple(move_state), tuple(account_type), date_from, tuple(partner_ids), date_from,))
partner_totals = cr.fetchall()
for partner_id, amount in partner_totals:
future_past[partner_id] = amount
# Use one query per period and store results in history (a list variable)
# Each history will contain: history[1] = {'<partner_id>': <partner_debit-credit>}
history = []
for i in range(5):
args_list = (tuple(move_state), tuple(account_type), tuple(partner_ids),)
dates_query = '(COALESCE(l.date_maturity,l.date)'
if form[str(i)]['start'] and form[str(i)]['stop']:
dates_query += ' BETWEEN %s AND %s)'
args_list += (form[str(i)]['start'], form[str(i)]['stop'])
elif form[str(i)]['start']:
dates_query += ' >= %s)'
args_list += (form[str(i)]['start'],)
else:
dates_query += ' <= %s)'
args_list += (form[str(i)]['stop'],)
args_list += (date_from,)
cr.execute('''SELECT l.partner_id, SUM(l.debit - l.credit), l.id
FROM account_move_line AS l, account_account, account_move am
WHERE (l.account_id = account_account.id) AND (l.move_id = am.id)
AND (am.state IN %s)
AND (account_account.internal_type IN %s)
AND (l.partner_id IN %s)
AND l.reconciled IS FALSE
AND ''' + dates_query + '''
AND (l.date <= %s)
GROUP BY l.partner_id, l.id''', args_list)
partners_partial = cr.fetchall()
partners_amount = dict((partner_id, 0) for partner_id, amount, line_id in partners_partial)
for partner_id, amount, line_id in partners_partial:
partial_reconcile_ids = []
line = self.env['account.move.line'].browse(line_id)
for partial_line in (line.matched_debit_ids + line.matched_credit_ids):
if not partial_line.credit_move_id.id in partial_reconcile_ids:
partial_reconcile_ids.append(partial_line.credit_move_id.id)
if not partial_line.debit_move_id.id in partial_reconcile_ids:
partial_reconcile_ids.append(partial_line.debit_move_id.id)
if partial_reconcile_ids:
# in case of partial reconciliation, we want to keep the left amount in the oldest period
cr.execute('''SELECT MIN(COALESCE(date_maturity, date)) from account_move_line where id = %s''', (line_id,))
date = cr.fetchall()
partial = False
if 'BETWEEN' in dates_query:
partial = date and args_list[-3] <= date[0][0] <= args_list[-2]
elif '>=' in dates_query:
partial = date and date[0][0] >= form[str(i)]['start']
else:
partial = date and date[0][0] <= form[str(i)]['stop']
if partial:
# partial reconcilation
limit_date = 'COALESCE(l.date_maturity, l.date) <= %s'
cr.execute('''SELECT SUM(l.debit - l.credit)
FROM account_move_line AS l, account_move AS am
WHERE l.move_id = am.id AND am.state IN %s
AND l.id IN %s
AND ''' + limit_date, (tuple(move_state), tuple(partial_reconcile_ids), date_from))
unreconciled_amount = cr.fetchall()
partners_amount[partner_id] += unreconciled_amount[0][0]
else:
partners_amount[partner_id] += amount
history.append(partners_amount)
for partner in partners:
values = {}
# Query here is replaced by one query which gets the all the partners their 'after' value
after = False
if future_past.has_key(partner['id']): # Making sure this partner actually was found by the query
after = [ future_past[partner['id']] ]
self.total_account[6] = self.total_account[6] + (after and after[0] or 0.0)
values['direction'] = after and after[0] or 0.0
for i in range(5):
during = False
if history[i].has_key(partner['id']):
during = [ history[i][partner['id']] ]
# Adding counter
self.total_account[(i)] = self.total_account[(i)] + (during and during[0] or 0)
values[str(i)] = during and during[0] or 0.0
total = False
if totals.has_key( partner['id'] ):
total = [ totals[partner['id']] ]
values['total'] = total and total[0] or 0.0
## Add for total
self.total_account[(i+1)] = self.total_account[(i+1)] + (total and total[0] or 0.0)
values['name'] = partner['name']
res.append(values)
total = 0.0
totals = {}
for r in res:
total += float(r['total'] or 0.0)
for i in range(5)+['direction']:
totals.setdefault(str(i), 0.0)
totals[str(i)] += float(r[str(i)] or 0.0)
return res
def _get_move_lines_with_out_partner(self, form, account_type, date_from, target_move):
res = []
cr = self.env.cr
move_state = ['draft', 'posted']
if target_move == 'posted':
move_state = ['posted']
## put a total of 0
for i in range(7):
self.total_account.append(0)
totals = {}
cr.execute('SELECT SUM(l.debit - l.credit) \
FROM account_move_line AS l, account_account, account_move am \
WHERE (l.account_id = account_account.id) AND (l.move_id = am.id)\
AND (am.state IN %s)\
AND (l.partner_id IS NULL)\
AND (account_account.internal_type IN %s)\
AND l.reconciled IS FALSE \
AND (l.date <= %s)\
',(tuple(move_state), tuple(account_type), date_from,))
total_amount = cr.fetchall()
for amount in total_amount:
totals['Unknown Partner'] = amount[0]
future_past = {}
cr.execute('SELECT SUM(l.debit-l.credit) \
FROM account_move_line AS l, account_account, account_move am \
WHERE (l.account_id = account_account.id) AND (l.move_id = am.id)\
AND (am.state IN %s)\
AND (l.partner_id IS NULL)\
AND (account_account.internal_type IN %s)\
AND (COALESCE(l.date_maturity,l.date) > %s)\
AND l.reconciled IS FALSE\
', (tuple(move_state), tuple(account_type), date_from,))
total_amount = cr.fetchall()
for amount in total_amount:
future_past['Unknown Partner'] = amount[0]
history = []
for i in range(5):
args_list = (tuple(move_state), tuple(account_type))
dates_query = '(COALESCE(l.date_maturity,l.date)'
if form[str(i)]['start'] and form[str(i)]['stop']:
dates_query += ' BETWEEN %s AND %s)'
args_list += (form[str(i)]['start'], form[str(i)]['stop'])
elif form[str(i)]['start']:
dates_query += ' > %s)'
args_list += (form[str(i)]['start'],)
else:
dates_query += ' < %s)'
args_list += (form[str(i)]['stop'],)
args_list += (date_from,)
cr.execute('SELECT SUM(l.debit - l.credit)\
FROM account_move_line AS l, account_account, account_move am \
WHERE (l.account_id = account_account.id) AND (l.move_id = am.id)\
AND (am.state IN %s)\
AND (account_account.internal_type IN %s)\
AND (l.partner_id IS NULL)\
AND l.reconciled IS FALSE\
AND ' + dates_query + '\
AND (l.date <= %s)\
GROUP BY l.partner_id', args_list)
total_amount = cr.fetchall()
history_data = {}
for amount in total_amount:
history_data['Unknown Partner'] = amount[0]
history.append(history_data)
values = {}
after = False
if future_past.has_key('Unknown Partner'):
after = [ future_past['Unknown Partner'] ]
self.total_account[6] = self.total_account[6] + (after and after[0] or 0.0)
values['direction'] = after and after[0] or 0.0
for i in range(5):
during = False
if history[i].has_key('Unknown Partner'):
during = [ history[i]['Unknown Partner'] ]
self.total_account[(i)] = self.total_account[(i)] + (during and during[0] or 0)
values[str(i)] = during and during[0] or 0.0
total = False
if totals.has_key( 'Unknown Partner' ):
total = [ totals['Unknown Partner'] ]
values['total'] = total and total[0] or 0.0
## Add for total
self.total_account[(i+1)] = self.total_account[(i+1)] + (total and total[0] or 0.0)
values['name'] = 'Unknown Partner'
if values['total']:
res.append(values)
total = 0.0
totals = {}
for r in res:
total += float(r['total'] or 0.0)
for i in range(5)+['direction']:
totals.setdefault(str(i), 0.0)
totals[str(i)] += float(r[str(i)] or 0.0)
return res
@api.multi
def render_html(self, data):
self.total_account = []
model = self.env.context.get('active_model')
docs = self.env[model].browse(self.env.context.get('active_id'))
target_move = data['form'].get('target_move', 'all')
date_from = data['form'].get('date_from', time.strftime('%Y-%m-%d'))
if data['form']['result_selection'] == 'customer':
account_type = ['receivable']
elif data['form']['result_selection'] == 'supplier':
account_type = ['payable']
else:
account_type = ['payable','receivable']
without_partner_movelines = self._get_move_lines_with_out_partner(data['form'], account_type, date_from, target_move)
partner_movelines = self._get_partner_move_lines(data['form'], account_type, date_from, target_move)
movelines = partner_movelines + without_partner_movelines
docargs = {
'doc_ids': self.ids,
'doc_model': model,
'data': data['form'],
'docs': docs,
'time': time,
'get_partner_lines': movelines,
'get_direction': self.total_account,
}
return self.env['report'].render('account.report_agedpartnerbalance', docargs)
+74
View File
@@ -0,0 +1,74 @@
# -*- coding: utf-8 -*-
import time
from openerp import api, models
class ReportTrialBalance(models.AbstractModel):
_name = 'report.account.report_trialbalance'
def _get_accounts(self, accounts, display_account):
""" compute the balance, debit and credit for the provided accounts
:Arguments:
`accounts`: list of accounts record,
`display_account`: it's used to display either all accounts or those accounts which balance is > 0
:Returns a list of dictionary of Accounts with following key and value
`name`: Account name,
`code`: Account code,
`credit`: total amount of credit,
`debit`: total amount of debit,
`balance`: total amount of balance,
"""
account_result = {}
# Prepare sql query base on selected parameters from wizard
tables, where_clause, where_params = self.env['account.move.line']._query_get()
tables = tables.replace('"','')
if not tables:
tables = 'account_move_line'
wheres = [""]
if where_clause.strip():
wheres.append(where_clause.strip())
filters = " AND ".join(wheres)
# compute the balance, debit and credit for the provided accounts
request = ("SELECT account_id AS id, SUM(debit) AS debit, SUM(credit) AS credit, (SUM(debit) - SUM(credit)) AS balance" +\
" FROM " + tables + " WHERE account_id IN %s " + filters + " GROUP BY account_id")
params = (tuple(accounts.ids),) + tuple(where_params)
self.env.cr.execute(request, params)
for row in self.env.cr.dictfetchall():
account_result[row.pop('id')] = row
account_res = []
for account in accounts:
res = dict((fn, 0.0) for fn in ['credit', 'debit', 'balance'])
currency = account.currency_id and account.currency_id or account.company_id.currency_id
res['code'] = account.code
res['name'] = account.name
if account.id in account_result.keys():
res['debit'] = account_result[account.id].get('debit')
res['credit'] = account_result[account.id].get('credit')
res['balance'] = account_result[account.id].get('balance')
if display_account == 'all':
account_res.append(res)
if display_account in ['movement', 'not_zero'] and not currency.is_zero(res['balance']):
account_res.append(res)
return account_res
@api.multi
def render_html(self, data):
self.model = self.env.context.get('active_model')
docs = self.env[self.model].browse(self.env.context.get('active_id'))
display_account = data['form'].get('display_account')
accounts = self.env['account.account'].search([])
account_res = self.with_context(data['form'].get('used_context'))._get_accounts(accounts, display_account)
docargs = {
'doc_ids': self.ids,
'doc_model': self.model,
'data': data['form'],
'docs': docs,
'time': time,
'Accounts': account_res,
}
return self.env['report'].render('account.report_trialbalance', docargs)
@@ -0,0 +1,133 @@
# -*- coding: utf-8 -*-
import time
from openerp import api, models
class ReportGeneralLedger(models.AbstractModel):
_name = 'report.account.report_generalledger'
def _get_account_move_entry(self, accounts, init_balance, sortby, display_account):
"""
:param:
accounts: the recordset of accounts
init_balance: boolean value of initial_balance
sortby: sorting by date or partner and journal
display_account: type of account(receivable, payable and both)
Returns a dictionary of accounts with following key and value {
'code': account code,
'name': account name,
'debit': sum of total debit amount,
'credit': sum of total credit amount,
'balance': total balance,
'amount_currency': sum of amount_currency,
'move_lines': list of move line
}
"""
cr = self.env.cr
MoveLine = self.env['account.move.line']
move_lines = dict(map(lambda x: (x, []), accounts.ids))
# Prepare initial sql query and Get the initial move lines
if init_balance:
init_tables, init_where_clause, init_where_params = MoveLine.with_context(date_to=self.env.context.get('date_from'), date_from=False)._query_get()
init_wheres = [""]
if init_where_clause.strip():
init_wheres.append(init_where_clause.strip())
init_filters = " AND ".join(init_wheres)
filters = init_filters.replace('account_move_line__move_id', 'm').replace('account_move_line', 'l')
sql = ("SELECT 0 AS lid, l.account_id AS account_id, '' AS ldate, '' AS lcode, NULL AS amount_currency, '' AS lref, 'Initial Balance' AS lname, COALESCE(SUM(l.debit),0.0) AS debit, COALESCE(SUM(l.credit),0.0) AS credit, COALESCE(SUM(l.debit),0) - COALESCE(SUM(l.credit), 0) as balance, '' AS lpartner_id,\
'' AS move_name, '' AS mmove_id, '' AS currency_code,\
NULL AS currency_id,\
'' AS invoice_id, '' AS invoice_type, '' AS invoice_number,\
'' AS partner_name\
FROM account_move_line l\
LEFT JOIN account_move m ON (l.move_id=m.id)\
LEFT JOIN res_currency c ON (l.currency_id=c.id)\
LEFT JOIN res_partner p ON (l.partner_id=p.id)\
LEFT JOIN account_invoice i ON (m.id =i.move_id)\
JOIN account_journal j ON (l.journal_id=j.id)\
WHERE l.account_id IN %s" + filters + ' GROUP BY l.account_id')
params = (tuple(accounts.ids),) + tuple(init_where_params)
cr.execute(sql, params)
for row in cr.dictfetchall():
move_lines[row.pop('account_id')].append(row)
sql_sort = 'l.date, l.move_id'
if sortby == 'sort_journal_partner':
sql_sort = 'j.code, p.name, l.move_id'
# Prepare sql query base on selected parameters from wizard
tables, where_clause, where_params = MoveLine._query_get()
wheres = [""]
if where_clause.strip():
wheres.append(where_clause.strip())
filters = " AND ".join(wheres)
filters = filters.replace('account_move_line__move_id', 'm').replace('account_move_line', 'l')
# Get move lines base on sql query and Calculate the total balance of move lines
sql = ('SELECT l.id AS lid, l.account_id AS account_id, l.date AS ldate, j.code AS lcode, l.currency_id, l.amount_currency, l.ref AS lref, l.name AS lname, COALESCE(l.debit,0) AS debit, COALESCE(l.credit,0) AS credit, COALESCE(SUM(l.debit),0) - COALESCE(SUM(l.credit), 0) AS balance,\
m.name AS move_name, c.symbol AS currency_code, p.name AS partner_name\
FROM account_move_line l\
JOIN account_move m ON (l.move_id=m.id)\
LEFT JOIN res_currency c ON (l.currency_id=c.id)\
LEFT JOIN res_partner p ON (l.partner_id=p.id)\
JOIN account_journal j ON (l.journal_id=j.id)\
JOIN account_account acc ON (l.account_id = acc.id) \
WHERE l.account_id IN %s ' + filters + ' GROUP BY l.id, l.account_id, l.date, j.code, l.currency_id, l.amount_currency, l.ref, l.name, m.name, c.symbol, p.name ORDER BY ' + sql_sort)
params = (tuple(accounts.ids),) + tuple(where_params)
cr.execute(sql, params)
for row in cr.dictfetchall():
balance = 0
for line in move_lines.get(row['account_id']):
balance += line['debit'] - line['credit']
row['balance'] += balance
move_lines[row.pop('account_id')].append(row)
# Calculate the debit, credit and balance for Accounts
account_res = []
for account in accounts:
currency = account.currency_id and account.currency_id or account.company_id.currency_id
res = dict((fn, 0.0) for fn in ['credit', 'debit', 'balance'])
res['code'] = account.code
res['name'] = account.name
res['move_lines'] = move_lines[account.id]
for line in res.get('move_lines'):
res['debit'] += line['debit']
res['credit'] += line['credit']
res['balance'] = line['balance']
if display_account == 'all':
account_res.append(res)
if display_account == 'movement' and res.get('move_lines'):
account_res.append(res)
if display_account == 'not_zero' and not currency.is_zero(res['balance']):
account_res.append(res)
return account_res
@api.multi
def render_html(self, data):
self.model = self.env.context.get('active_model')
docs = self.env[self.model].browse(self.env.context.get('active_id'))
init_balance = data['form'].get('initial_balance', True)
sortby = data['form'].get('sortby', 'sort_date')
display_account = data['form']['display_account']
codes = []
if data['form'].get('journal_ids', False):
codes = [journal.code for journal in self.env['account.journal'].search([('id', 'in', data['form']['journal_ids'])])]
accounts = self.env['account.account'].search([])
accounts_res = self.with_context(data['form'].get('used_context',{}))._get_account_move_entry(accounts, init_balance, sortby, display_account)
docargs = {
'doc_ids': self.ids,
'doc_model': self.model,
'data': data['form'],
'docs': docs,
'time': time,
'Accounts': accounts_res,
'print_journal': codes,
}
return self.env['report'].render('account.report_generalledger', docargs)
@@ -0,0 +1,69 @@
# -*- coding: utf-8 -*-
import time
from openerp import api, fields, models
class ReportOverdue(models.AbstractModel):
_name = 'report.account.report_overdue'
def _get_account_move_lines(self, partner_ids):
res = dict(map(lambda x:(x,[]), partner_ids))
self.env.cr.execute("SELECT m.name AS move_id, l.date, l.name, l.ref, l.date_maturity, l.partner_id, l.blocked, l.amount_currency, l.currency_id, "
"CASE WHEN at.type = 'receivable' "
"THEN SUM(l.debit) "
"ELSE SUM(l.credit * -1) "
"END AS debit, "
"CASE WHEN at.type = 'receivable' "
"THEN SUM(l.credit) "
"ELSE SUM(l.debit * -1) "
"END AS credit, "
"CASE WHEN l.date_maturity < %s "
"THEN SUM(l.debit - l.credit) "
"ELSE 0 "
"END AS mat "
"FROM account_move_line l "
"JOIN account_account_type at ON (l.user_type_id = at.id) "
"JOIN account_move m ON (l.move_id = m.id) "
"WHERE l.partner_id IN %s AND at.type IN ('receivable', 'payable') GROUP BY l.date, l.name, l.ref, l.date_maturity, l.partner_id, at.type, l.blocked, l.amount_currency, l.currency_id, l.move_id, m.name", (((fields.date.today(), ) + (tuple(partner_ids),))))
for row in self.env.cr.dictfetchall():
res[row.pop('partner_id')].append(row)
return res
@api.multi
def render_html(self, data):
totals = {}
lines = self._get_account_move_lines(self.ids)
lines_to_display = {}
company_currency = self.env.user.company_id.currency_id
for partner_id in self.ids:
lines_to_display[partner_id] = {}
totals[partner_id] = {}
for line_tmp in lines[partner_id]:
line = line_tmp.copy()
currency = line['currency_id'] and self.env['res.currency'].browse(line['currency_id']) or company_currency
if currency not in lines_to_display[partner_id]:
lines_to_display[partner_id][currency] = []
totals[partner_id][currency] = dict((fn, 0.0) for fn in ['due', 'paid', 'mat', 'total'])
if line['debit'] and line['currency_id']:
line['debit'] = line['amount_currency']
if line['credit'] and line['currency_id']:
line['credit'] = line['amount_currency']
if line['mat'] and line['currency_id']:
line['mat'] = line['amount_currency']
lines_to_display[partner_id][currency].append(line)
if not line['blocked']:
totals[partner_id][currency]['due'] += line['debit']
totals[partner_id][currency]['paid'] += line['credit']
totals[partner_id][currency]['mat'] += line['mat']
totals[partner_id][currency]['total'] += line['debit'] - line['credit']
docargs = {
'doc_ids': self.ids,
'doc_model': 'res.partner',
'docs': self.env['res.partner'].browse(self.ids),
'time': time,
'Lines': lines_to_display,
'Totals': totals,
'Date': fields.date.today(),
}
return self.env['report'].render('account.report_overdue', values=docargs)
@@ -0,0 +1,156 @@
# -*- coding: utf-8 -*-
import time
from openerp import api, models
class ReportFinancial(models.AbstractModel):
_name = 'report.account.report_financial'
def _compute_account_balance(self, accounts):
""" compute the balance, debit and credit for the provided accounts
"""
mapping = {
'balance': "COALESCE(SUM(debit),0) - COALESCE(SUM(credit), 0) as balance",
'debit': "COALESCE(SUM(debit), 0) as debit",
'credit': "COALESCE(SUM(credit), 0) as credit",
}
res = {}
for account in accounts:
res[account.id] = dict((fn, 0.0) for fn in mapping.keys())
if accounts:
tables, where_clause, where_params = self.env['account.move.line']._query_get()
tables = tables.replace('"', '') if tables else "account_move_line"
wheres = [""]
if where_clause.strip():
wheres.append(where_clause.strip())
filters = " AND ".join(wheres)
request = "SELECT account_id as id, " + ', '.join(mapping.values()) + \
" FROM " + tables + \
" WHERE account_id IN %s " \
+ filters + \
" GROUP BY account_id"
params = (tuple(accounts._ids),) + tuple(where_params)
self.env.cr.execute(request, params)
for row in self.env.cr.dictfetchall():
res[row['id']] = row
return res
def _compute_report_balance(self, reports):
'''returns a dictionary with key=the ID of a record and value=the credit, debit and balance amount
computed for this record. If the record is of type :
'accounts' : it's the sum of the linked accounts
'account_type' : it's the sum of leaf accoutns with such an account_type
'account_report' : it's the amount of the related report
'sum' : it's the sum of the children of this record (aka a 'view' record)'''
res = {}
fields = ['credit', 'debit', 'balance']
for report in reports:
if report.id in res:
continue
res[report.id] = dict((fn, 0.0) for fn in fields)
if report.type == 'accounts':
# it's the sum of the linked accounts
res[report.id]['account'] = self._compute_account_balance(report.account_ids)
for value in res[report.id]['account'].values():
for field in fields:
res[report.id][field] += value.get(field)
elif report.type == 'account_type':
# it's the sum the leaf accounts with such an account type
accounts = self.env['account.account'].search([('user_type_id', 'in', report.account_type_ids.ids)])
res[report.id]['account'] = self._compute_account_balance(accounts)
for value in res[report.id]['account'].values():
for field in fields:
res[report.id][field] += value.get(field)
elif report.type == 'account_report' and report.account_report_id:
# it's the amount of the linked report
res2 = self._compute_report_balance(report.account_report_id)
for key, value in res2.items():
for field in fields:
res[report.id][field] += value[field]
elif report.type == 'sum':
# it's the sum of the children of this account.report
res2 = self._compute_report_balance(report.children_ids)
for key, value in res2.items():
for field in fields:
res[report.id][field] += value[field]
return res
def get_account_lines(self, data):
lines = []
account_report = self.env['account.financial.report'].search([('id', '=', data['account_report_id'][0])])
child_reports = account_report._get_children_by_order()
res = self.with_context(data.get('used_context'))._compute_report_balance(child_reports)
if data['enable_filter']:
comparison_res = self.with_context(data.get('comparison_context'))._compute_report_balance(child_reports)
for report_id, value in comparison_res.items():
res[report_id]['comp_bal'] = value['balance']
report_acc = res[report_id].get('account')
if report_acc:
for account_id, val in comparison_res[report_id].get('account').items():
report_acc[account_id]['comp_bal'] = val['balance']
for report in child_reports:
vals = {
'name': report.name,
'balance': res[report.id]['balance'] * report.sign,
'type': 'report',
'level': bool(report.style_overwrite) and report.style_overwrite or report.level,
'account_type': report.type or False, #used to underline the financial report balances
}
if data['debit_credit']:
vals['debit'] = res[report.id]['debit']
vals['credit'] = res[report.id]['credit']
if data['enable_filter']:
vals['balance_cmp'] = res[report.id]['comp_bal'] * report.sign
lines.append(vals)
if report.display_detail == 'no_detail':
#the rest of the loop is used to display the details of the financial report, so it's not needed here.
continue
if res[report.id].get('account'):
for account_id, value in res[report.id]['account'].items():
#if there are accounts to display, we add them to the lines with a level equals to their level in
#the COA + 1 (to avoid having them with a too low level that would conflicts with the level of data
#financial reports for Assets, liabilities...)
flag = False
account = self.env['account.account'].browse(account_id)
vals = {
'name': account.code + ' ' + account.name,
'balance': value['balance'] * report.sign or 0.0,
'type': 'account',
'level': report.display_detail == 'detail_with_hierarchy' and 4,
'account_type': account.internal_type,
}
if data['debit_credit']:
vals['debit'] = value['debit']
vals['credit'] = value['credit']
if not account.company_id.currency_id.is_zero(vals['debit']) or not account.company_id.currency_id.is_zero(vals['credit']):
flag = True
if not account.company_id.currency_id.is_zero(vals['balance']):
flag = True
if data['enable_filter']:
vals['balance_cmp'] = value['comp_bal'] * report.sign
if not account.company_id.currency_id.is_zero(vals['balance_cmp']):
flag = True
if flag:
lines.append(vals)
return lines
@api.multi
def render_html(self, data):
self.model = self.env.context.get('active_model')
docs = self.env[self.model].browse(self.env.context.get('active_id'))
report_lines = self.get_account_lines(data.get('form'))
docargs = {
'doc_ids': self.ids,
'doc_model': self.model,
'data': data['form'],
'docs': docs,
'time': time,
'get_account_lines': report_lines,
}
return self.env['report'].render('account.report_financial', docargs)
+1 -9
View File
@@ -72,18 +72,10 @@
from openerp.tools import test_reports
test_reports.try_report_action(cr, uid, 'action_account_general_journal',wiz_data=data_dict, context=ctx, our_module='account')
-
Print the General Ledger Report in Normal Mode
Print the General Ledger Report (in Landscape Mode)
-
!python {model: account.account}: |
ctx={}
data_dict = {'chart_account_id':ref('account.chart0'),'landscape':False}
from openerp.tools import test_reports
test_reports.try_report_action(cr, uid, 'action_account_general_ledger_menu',wiz_data=data_dict, context=ctx, our_module='account')
-
Print the General Ledger Report in Landscape Mode
-
!python {model: account.account}: |
ctx={'landscape': True}
data_dict = {'chart_account_id':ref('account.chart0')}
from openerp.tools import test_reports
test_reports.try_report_action(cr, uid, 'action_account_general_ledger_menu',wiz_data=data_dict, context=ctx, our_module='account')
@@ -0,0 +1,68 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data noupdate="1">
<!--
Financial Reports
-->
<record id="account_financial_report_profitandloss0" model="account.financial.report">
<field name="name">Profit and Loss</field>
<field name="sign" eval="-1" />
<field name="type">sum</field>
</record>
<record id="account_financial_report_income0" model="account.financial.report">
<field name="name">Income</field>
<field name="sign" eval="-1" />
<field name="parent_id" ref="account_financial_report_profitandloss0"/>
<field name="display_detail">detail_with_hierarchy</field>
<field name="type">account_type</field>
<field name="account_type_ids" eval="[(4,ref('account.data_account_type_other_income')), (4,ref('account.data_account_type_revenue'))]"/>
</record>
<record id="account_financial_report_expense0" model="account.financial.report">
<field name="name">Expense</field>
<field name="sign" eval="-1" />
<field name="parent_id" ref="account_financial_report_profitandloss0"/>
<field name="display_detail">detail_with_hierarchy</field>
<field name="type">account_type</field>
<field name="account_type_ids" eval="[(4,ref('account.data_account_type_expenses')), (4,ref('account.data_account_type_direct_costs')), (4,ref('account.data_account_type_depreciation'))]"/>
</record>
<record id="account_financial_report_balancesheet0" model="account.financial.report">
<field name="name">Balance Sheet</field>
<field name="type">sum</field>
</record>
<record id="account_financial_report_assets0" model="account.financial.report">
<field name="name">Assets</field>
<field name="parent_id" ref="account_financial_report_balancesheet0"/>
<field name="display_detail">detail_with_hierarchy</field>
<field name="type">account_type</field>
<field name="account_type_ids" eval="[(4,ref('account.data_account_type_receivable')), (4,ref('account.data_account_type_liquidity')), (4,ref('account.data_account_type_current_assets')), (4,ref('account.data_account_type_non_current_assets'), (4,ref('account.data_account_type_prepayments'))), (4,ref('account.data_account_type_fixed_assets'))]"/>
</record>
<record id="account_financial_report_liabilitysum0" model="account.financial.report">
<field name="name">Liability</field>
<field name="parent_id" ref="account_financial_report_balancesheet0"/>
<field name="display_detail">no_detail</field>
<field name="type">sum</field>
</record>
<record id="account_financial_report_liability0" model="account.financial.report">
<field name="name">Liability</field>
<field name="parent_id" ref="account_financial_report_liabilitysum0"/>
<field name="display_detail">detail_with_hierarchy</field>
<field name="type">account_type</field>
<field name="account_type_ids" eval="[(4,ref('account.data_account_type_payable')), (4,ref('account.data_account_type_equity')), (4,ref('account.data_account_type_current_liabilities')), (4,ref('account.data_account_type_non_current_liabilities'))]"/>
</record>
<record id="account_financial_report_profitloss_toreport0" model="account.financial.report">
<field name="name">Profit (Loss) to report</field>
<field name="parent_id" ref="account_financial_report_liabilitysum0"/>
<field name="display_detail">no_detail</field>
<field name="type">account_report</field>
<field name="account_report_id" ref="account_financial_report_profitandloss0"/>
</record>
</data>
</odoo>
@@ -153,6 +153,7 @@
<field name="amount_total_signed"/>
<field name="date_invoice"/>
<field name="state"/>
<field name="currency_id"/>
<templates>
<t t-name="kanban-box">
<div t-attf-class="oe_kanban_card oe_kanban_global_click">
@@ -160,8 +161,8 @@
<div class="col-xs-6">
<strong><span><t t-esc="record.partner_id.value"/></span></strong>
</div>
<div class="col-xs-6">
<strong><span class="pull-right text-right"><t t-esc="record.amount_total_signed.value"/></span></strong>
<div class="col-xs-6 pull-right text-right">
<strong><field name="amount_total_signed" widget="monetary"/></strong>
</div>
</div>
<div class="row">
@@ -27,6 +27,9 @@
<menuitem id="base.menu_action_currency_form" name="Currencies" parent="menu_config_multi_currency" sequence="20" groups="base.group_no_one"/>
<menuitem id="menu_finance_legal_statement" name="PDF Reports" parent="account.menu_finance_reports"/>
<menuitem id="menu_account_reports" name="Financial Reports" parent="menu_finance_configuration"/>
</data>
</openerp>
+46
View File
@@ -23,5 +23,51 @@
attachment_use="False"
/>
<report
id="action_report_print_overdue"
model="res.partner"
report_type="qweb-pdf"
string="Due Payments"
name="account.report_overdue"
file="account.report_overdue"
/>
<report
id="action_report_general_ledger"
model="account.report.general.ledger"
string="General Ledger"
report_type="qweb-pdf"
name="account.report_generalledger"
file="account.report_generalledger"
/>
<report
id="action_report_trial_balance"
model="account.balance.report"
string="Trial Balance"
report_type="qweb-pdf"
name="account.report_trialbalance"
file="account.report_trialbalance"
/>
<report
id="action_report_financial"
model="account.financial.report"
string="Financial report"
report_type="qweb-pdf"
name="account.report_financial"
file="account.report_financial"
/>
<report
id="action_report_aged_partner_balance"
model="res.partner"
string="Aged Partner Balance"
menu="False"
report_type="qweb-pdf"
name="account.report_agedpartnerbalance"
file="account.report_agedpartnerbalance"
/>
</data>
</openerp>
+93
View File
@@ -1798,6 +1798,99 @@
parent="menu_finance_payables"
action="base.action_partner_supplier_form" sequence="100"/>
<!-- Account Financial Report -->
<record id="view_account_financial_report_form" model="ir.ui.view">
<field name="name">account.financial.report.form</field>
<field name="model">account.financial.report</field>
<field name="arch" type="xml">
<form string="Account Report">
<group col="4">
<field name="name"/>
<field name="parent_id"/>
<field name="sequence"/>
<field name="type"/>
<field name="sign"/>
<field name="style_overwrite"/>
</group>
<notebook attrs="{'invisible': [('type','not in',['accounts','account_type', 'account_report'])]}">
<page string="Report">
<group>
<field name="display_detail" attrs="{'invisible': [('type','not in',['accounts','account_type'])]}"/>
<field name="account_report_id" attrs="{'invisible': [('type', '!=', 'account_report')]}"/>
</group>
<field name="account_ids" attrs="{'invisible': [('type', '!=', 'accounts')]}"/>
<field name="account_type_ids" attrs="{'invisible': [('type', '!=', 'account_type')]}"/>
</page>
</notebook>
</form>
</field>
</record>
<record id="view_account_financial_report_tree" model="ir.ui.view">
<field name="name">account.financial.report.tree</field>
<field name="model">account.financial.report</field>
<field name="arch" type="xml">
<tree string="Account Report">
<field name="name"/>
<field name="parent_id" invisible="1"/>
<field name="type"/>
<field name="account_report_id"/>
</tree>
</field>
</record>
<record id="view_account_financial_report_search" model="ir.ui.view">
<field name="name">account.financial.report.search</field>
<field name="model">account.financial.report</field>
<field name="arch" type="xml">
<search string="Account Report">
<field name="name" string="Account Report"/>
<field name="type"/>
<field name="account_report_id"/>
<group expand="0" string="Group By">
<filter string="Parent Report" icon="terp-folder-orange" domain="" context="{'group_by':'parent_id'}"/>
<filter string="Report Type" icon="terp-stock_symbol-selection" domain="[]" context="{'group_by':'type'}"/>
</group>
</search>
</field>
</record>
<record id="action_account_financial_report_tree" model="ir.actions.act_window">
<field name="name">Financial Reports</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">account.financial.report</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
<field name="search_view_id" ref="view_account_financial_report_search"/>
<field name="view_id" ref="view_account_financial_report_tree"/>
</record>
<menuitem id="menu_account_financial_reports_tree" name="Account Reports" parent="menu_account_reports" action="action_account_financial_report_tree"/>
<record id="view_account_report_tree_hierarchy" model="ir.ui.view">
<field name="name">account.report.hierarchy</field>
<field name="model">account.financial.report</field>
<field name="field_parent">children_ids</field>
<field name="arch" type="xml">
<tree string="Account Reports Hierarchy">
<field name="name"/>
<field name="type"/>
<field name="parent_id" invisible="1"/>
<field name="account_report_id"/>
</tree>
</field>
</record>
<record id="action_account_report_tree_hierarchy" model="ir.actions.act_window">
<field name="name">Financial Reports Hierarchy</field>
<field name="res_model">account.financial.report</field>
<field name="view_type">tree</field>
<field name="view_id" ref="view_account_report_tree_hierarchy"/>
<field name="domain">[('parent_id','=',False)]</field>
</record>
<menuitem id="menu_account_report_tree_hierarchy" name="Account Reports Hierarchy" parent="menu_account_reports" action="action_account_report_tree_hierarchy"/>
</data>
</openerp>
+6
View File
@@ -14,6 +14,12 @@
<field name="cash_account_code_prefix" groups="base.group_no_one"/>
<field name="accounts_code_digits" groups="base.group_no_one"/>
</xpath>
<notebook position="inside">
<page string="Overdue Payments">
<separator string="Overdue Payments Message" colspan="4"/>
<field name="overdue_msg" nolabel="1" colspan ="4"/>
</page>
</notebook>
</field>
</record>
@@ -0,0 +1,95 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<template id="report_agedpartnerbalance">
<t t-call="report.html_container">
<t t-call="report.internal_layout">
<div class="page">
<h2>Aged Trial Balance</h2>
<div class="row mt32">
<div class="col-xs-3">
<strong>Start Date:</strong>
<p t-esc="data['date_from']"/>
</div>
<div class="col-xs-3">
<strong>Period Length (days)</strong>
<p t-esc="data['period_length']"/>
</div>
</div>
<div class="row mb32">
<div class="col-xs-3">
<strong>Partner's:</strong>
<p>
<span t-if="data['result_selection'] == 'customer'">Receivable Accounts</span>
<span t-if="data['result_selection'] == 'supplier'">Payable Accounts</span>
<span t-if="data['result_selection'] == 'customer_supplier'">Receivable and Payable Accounts</span>
</p>
</div>
<div class="col-xs-3">
<strong>Target Moves:</strong>
<p>
<span t-if="data['target_move'] == 'all'">All Entries</span>
<span t-if="data['target_move'] == 'posted'">All Posted Entries</span>
</p>
</div>
</div>
<table class="table table-condensed">
<thead>
<tr>
<th>Partners</th>
<th class="text-right">
<span>Not due</span>
</th>
<th class="text-right"><span t-esc="data['4']['name']"/></th>
<th class="text-right"><span t-esc="data['3']['name']"/></th>
<th class="text-right"><span t-esc="data['2']['name']"/></th>
<th class="text-right"><span t-esc="data['1']['name']"/></th>
<th class="text-right"><span t-esc="data['0']['name']"/></th>
<th class="text-right">Total</th>
</tr>
<tr t-if="get_partner_lines">
<th>Account Total</th>
<th class="text-right"><span t-esc="get_direction[6]" t-esc-options='{"widget": "monetary", "display_currency": "res_company.currency_id"}'/></th>
<th class="text-right"><span t-esc="get_direction[4]" t-esc-options='{"widget": "monetary", "display_currency": "res_company.currency_id"}'/></th>
<th class="text-right"><span t-esc="get_direction[3]" t-esc-options='{"widget": "monetary", "display_currency": "res_company.currency_id"}'/></th>
<th class="text-right"><span t-esc="get_direction[2]" t-esc-options='{"widget": "monetary", "display_currency": "res_company.currency_id"}'/></th>
<th class="text-right"><span t-esc="get_direction[1]" t-esc-options='{"widget": "monetary", "display_currency": "res_company.currency_id"}'/></th>
<th class="text-right"><span t-esc="get_direction[0]" t-esc-options='{"widget": "monetary", "display_currency": "res_company.currency_id"}'/></th>
<th class="text-right"><span t-esc="get_direction[5]" t-esc-options='{"widget": "monetary", "display_currency": "res_company.currency_id"}'/></th>
</tr>
</thead>
<tbody>
<tr t-foreach="get_partner_lines" t-as="partner">
<td>
<span t-esc="partner['name']"/>
</td>
<td class="text-right">
<span t-esc="partner['direction']" t-esc-options='{"widget": "monetary", "display_currency": "res_company.currency_id"}'/>
</td>
<td class="text-right">
<span t-esc="partner['4']" t-esc-options='{"widget": "monetary", "display_currency": "res_company.currency_id"}'/>
</td>
<td class="text-right">
<span t-esc="partner['3']" t-esc-options='{"widget": "monetary", "display_currency": "res_company.currency_id"}'/>
</td>
<td class="text-right">
<span t-esc="partner['2']" t-esc-options='{"widget": "monetary", "display_currency": "res_company.currency_id"}'/>
</td>
<td class="text-right">
<span t-esc="partner['1']" t-esc-options='{"widget": "monetary", "display_currency": "res_company.currency_id"}'/>
</td>
<td class="text-right">
<span t-esc="partner['0']" t-esc-options='{"widget": "monetary", "display_currency": "res_company.currency_id"}'/>
</td>
<td class="text-right">
<span t-esc="partner['total']" t-esc-options='{"widget": "monetary", "display_currency": "res_company.currency_id"}'/>
</td>
</tr>
</tbody>
</table>
</div>
</t>
</t>
</template>
</odoo>
+110
View File
@@ -0,0 +1,110 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<template id="report_financial">
<t t-call="report.html_container">
<t t-foreach="docs" t-as="o">
<t t-call="report.internal_layout">
<div class="page">
<h2 t-esc="data['account_report_id'][1]"/>
<div class="row mt32 mb32">
<div class="col-xs-4">
<strong>Target Moves:</strong>
<p>
<span t-if="data['target_move'] == 'all'">All Entries</span>
<span t-if="data['target_move'] == 'posted'">All Posted Entries</span>
</p>
</div>
<div class="col-xs-4">
<p>
<t t-if="data['date_from']"><strong>Date from :</strong> <span t-esc="data['date_from']"/><br/></t>
<t t-if="data['date_to']"><strong>Date to :</strong> <span t-esc="data['date_to']"/></t>
</p>
</div>
</div>
<table class="table table-condensed" t-if="data['debit_credit'] == 1">
<thead>
<tr>
<th>Name</th>
<th class="text-right">Debit</th>
<th class="text-right">Credit</th>
<th class="text-right">Balance</th>
</tr>
</thead>
<tbody>
<tr t-foreach="get_account_lines" t-as="a">
<t t-if="a['level'] != 0">
<t t-if="a.get('level') &gt; 3"><t t-set="style" t-value="'font-weight: normal;'"/></t>
<t t-if="not a.get('level') &gt; 3"><t t-set="style" t-value="'font-weight: bold;'"/></t>
<td>
<span style="color: white;" t-esc="'..' * a.get('level', 0)"/>
<span t-att-style="style" t-esc="a.get('name')"/>
</td>
<td class="text-right" style="white-space: text-nowrap;">
<span t-att-style="style" t-esc="a.get('debit')" t-esc-options='{"widget": "monetary", "display_currency": "res_company.currency_id"}'/>
</td>
<td class="text-right" style="white-space: text-nowrap;">
<span t-att-style="style" t-esc="a.get('credit')" t-esc-options='{"widget": "monetary", "display_currency": "res_company.currency_id"}'/>
</td>
<td class="text-right" style="white-space: text-nowrap;">
<span t-att-style="style" t-esc="a.get('balance')" t-esc-options='{"widget": "monetary", "display_currency": "res_company.currency_id"}'/>
</td>
</t>
</tr>
</tbody>
</table>
<table class="table table-condensed" t-if="not data['enable_filter'] and not data['debit_credit']">
<thead>
<tr>
<th>Name</th>
<th class="text-right">Balance</th>
</tr>
</thead>
<tbody>
<tr t-foreach="get_account_lines" t-as="a">
<t t-if="a['level'] != 0">
<t t-if="a.get('level') &gt; 3"><t t-set="style" t-value="'font-weight: normal;'"/></t>
<t t-if="not a.get('level') &gt; 3"><t t-set="style" t-value="'font-weight: bold;'"/></t>
<td>
<span style="color: white;" t-esc="'..' * a.get('level', 0)"/>
<span t-att-style="style" t-esc="a.get('name')"/>
</td>
<td class="text-right"><span t-att-style="style" t-esc="a.get('balance')" t-esc-options='{"widget": "monetary", "display_currency": "res_company.currency_id"}'/></td>
</t>
</tr>
</tbody>
</table>
<table class="table table-condensed" t-if="data['enable_filter'] == 1 and not data['debit_credit']">
<thead>
<tr>
<th>Name</th>
<th class="text-right">Balance</th>
<th class="text-right"><span t-esc="data['label_filter']"/></th>
</tr>
</thead>
<tbody>
<tr t-foreach="get_account_lines" t-as="a">
<t t-if="a['level'] != 0">
<t t-if="a.get('level') &gt; 3"><t t-set="style" t-value="'font-weight: normal;'"/></t>
<t t-if="not a.get('level') &gt; 3"><t t-set="style" t-value="'font-weight: bold;'"/></t>
<td>
<span style="color: white;" t-esc="'..'"/>
<span t-att-style="style" t-esc="a.get('name')"/>
</td>
<td class="text-right"><span t-att-style="style" t-esc="a.get('balance')" t-esc-options='{"widget": "monetary", "display_currency": "res_company.currency_id"}'/></td>
<td class="text-right"><span t-att-style="style" t-esc="a.get('balance_cmp')"/></td>
</t>
</tr>
</tbody>
</table>
</div>
</t>
</t>
</t>
</template>
</odoo>
@@ -0,0 +1,107 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<template id="report_generalledger">
<t t-call="report.html_container">
<t t-set="data_report_margin_top" t-value="12"/>
<t t-set="data_report_header_spacing" t-value="9"/>
<t t-set="data_report_dpi" t-value="110"/>
<t t-call="report.internal_layout">
<div class="page">
<h2><span t-esc="res_company.name"/>: General ledger</h2>
<div class="row mt32">
<div class="col-xs-4">
<strong>Journals:</strong>
<p t-esc="', '.join([ lt or '' for lt in print_journal ])"/>
</div>
<div class="col-xs-4">
<strong>Display Account</strong>
<p>
<span t-if="data['display_account'] == 'all'">All accounts'</span>
<span t-if="data['display_account'] == 'movement'">With movements</span>
<span t-if="data['display_account'] == 'not_zero'">With balance not equal to zero</span>
</p>
</div>
<div class="col-xs-4">
<strong>Target Moves:</strong>
<p t-if="data['target_move'] == 'all'">All Entries</p>
<p t-if="data['target_move'] == 'posted'">All Posted Entries</p>
</div>
</div>
<div class="row mb32">
<div class="col-xs-4">
<strong>Sorted By:</strong>
<p t-if="data['sortby'] == 'sort_date'">Date</p>
<p t-if="data['sortby'] == 'sort_journal_partner'">Journal and Partner</p>
</div>
<div class="col-xs-4">
<t t-if="data['date_from']"><strong>Date from :</strong> <span t-esc="data['date_from']"/><br/></t>
<t t-if="data['date_to']"><strong>Date to :</strong> <span t-esc="data['date_to']"/></t>
</div>
</div>
<table class="table table-condensed">
<thead>
<tr class="text-center">
<th>Date</th>
<th>JRNL</th>
<th>Partner</th>
<th>Ref</th>
<th>Move</th>
<th>Entry Label</th>
<th>Debit</th>
<th>Credit</th>
<th>Balance</th>
<th groups="base.group_multi_currency">Currency</th>
</tr>
</thead>
<tbody>
<t t-foreach="Accounts" t-as="account">
<tr style="font-weight: bold;">
<td colspan="6">
<span style="color: white;" t-esc="'..'"/>
<span t-esc="account['code']"/>
<span t-esc="account['name']"/>
</td>
<td class="text-right">
<span t-esc="account['debit']" t-esc-options='{"widget": "monetary", "display_currency": "res_company.currency_id"}'/>
</td>
<td class="text-right">
<span t-esc="account['credit']" t-esc-options='{"widget": "monetary", "display_currency": "res_company.currency_id"}'/>
</td>
<td class="text-right">
<span t-esc="account['balance']" t-esc-options='{"widget": "monetary", "display_currency": "res_company.currency_id"}'/>
</td>
<td groups="base.group_multi_currency"/>
</tr>
<tr t-foreach="account['move_lines']" t-as="line">
<td><span t-esc="line['ldate']"/></td>
<td><span t-esc="line['lcode']"/></td>
<td><span t-esc="line['partner_name']"/></td>
<td><span t-if="line['lref']" t-esc="line['lref']"/></td>
<td><span t-esc="line['move_name']"/></td>
<td><span t-esc="line['lname']"/></td>
<td class="text-right">
<span t-esc="line['debit']" t-esc-options='{"widget": "monetary", "display_currency": "res_company.currency_id"}'/>
</td>
<td class="text-right">
<span t-esc="line['credit']" t-esc-options='{"widget": "monetary", "display_currency": "res_company.currency_id"}'/>
</td>
<td class="text-right">
<span t-esc="line['balance']" t-esc-options='{"widget": "monetary", "display_currency": "res_company.currency_id"}'/>
</td>
<td class="text-right" groups="base.group_multi_currency">
<span t-esc="line['amount_currency'] if line['amount_currency'] > 0.00 else ''"/>
<span t-esc="line['currency_code'] if line['amount_currency'] > 0.00 else ''"/>
</td>
</tr>
</t>
</tbody>
</table>
</div>
</t>
</t>
</template>
</odoo>
+88
View File
@@ -0,0 +1,88 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<template id="account.report_overdue_document">
<t t-call="report.external_layout">
<div class="page">
<div class="row">
<div class="col-xs-5 col-xs-offset-7">
<span t-field="o.name"/><br/>
<span t-raw="o._address_display(None, None)[o.id].replace('\n\n', '\n').replace('\n', '&lt;br&gt;')"/>
<span t-field="o.vat"/>
</div>
<p>
Document: Customer account statement<br/>
Date: <span t-esc="Date"/><br/>
<t t-if="o.ref">Customer ref: <span t-field="o.ref"/></t>
</p>
<t t-if="Lines[o.id]">
<span t-field="res_company.overdue_msg"/>
<table class="table table-condensed" t-foreach="Lines[o.id]" t-as="currency">
<thead>
<tr>
<th>Reference number</th>
<th class="text-center">Date</th>
<th class="text-center">Due Date</th>
<th>Communication</th>
<th class="text-right">Due</th>
<th class="text-right">Paid</th>
<th class="text-center">Litigation</th>
</tr>
</thead>
<tr t-foreach="Lines[o.id][currency]" t-as="line">
<td>
<span t-esc="line['move_id']"/>
</td>
<td>
<span t-esc="line['date']"/>
</td>
<td>
<span t-esc="line['date_maturity']"/>
</td>
<td>
<t t-if="line['name'] != '/'"><span t-esc="line['name']"/></t>
<span t-esc="line['ref']"/>
</td>
<td class="text-right">
<span t-esc="line['debit']" t-esc-options='{"widget": "monetary", "display_currency": "currency"}'/>
</td>
<td class="text-right">
<span t-esc="line['credit']" t-esc-options='{"widget": "monetary", "display_currency": "currency"}'/>
</td>
<td class="text-center">
<span t-if="line['blocked']">x</span>
</td>
</tr>
<tr>
<td colspan="3"></td>
<td><strong>Sub-Total :</strong></td>
<td class="text-right"><span t-esc="Totals[o.id][currency]['due']" t-esc-options='{"widget": "monetary", "display_currency": "currency"}'/></td>
<td class="text-right"><span t-esc="Totals[o.id][currency]['paid']" t-esc-options='{"widget": "monetary", "display_currency": "currency"}'/></td>
<td class="text-right"><span t-esc="Totals[o.id][currency]['mat']" t-esc-options='{"widget": "monetary", "display_currency": "currency"}'/></td>
<td></td>
</tr>
<tr>
<td colspan="3"></td>
<td><strong>Balance :</strong></td>
<td class="text-right">
<span t-esc="Totals[o.id][currency]['due'] - Totals[o.id][currency]['paid']" t-esc-options='{"widget": "monetary", "display_currency": "currency"}'/>
</td>
</tr>
</table>
</t>
<p t-if="not Lines[o.id]">
<strong>There is nothing due with this customer.</strong>
</p>
</div>
</div>
</t>
</template>
<template id="report_overdue">
<t t-call="report.html_container">
<t t-foreach="docs" t-as="o">
<t t-call="account.report_overdue_document" t-lang="o.lang"/>
</t>
</t>
</template>
</odoo>
@@ -0,0 +1,68 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<template id="report_trialbalance">
<t t-call="report.html_container">
<t t-call="report.internal_layout">
<div class="page">
<h2><span t-esc="res_company.name"/>: Trial Balance</h2>
<div class="row mt32">
<div class="col-xs-4">
<strong>Display Account:</strong>
<p>
<span t-if="data['display_account'] == 'all'">All accounts</span>
<span t-if="data['display_account'] == 'movement'">With movements</span>
<span t-if="data['display_account'] == 'not_zero'">With balance not equal to zero</span>
</p>
</div>
<div class="col-xs-4">
<p>
<t t-if="data['date_from']"><strong>Date from :</strong> <span t-esc="data['date_from']"/><br/></t>
<t t-if="data['date_to']"><strong>Date to :</strong> <span t-esc="data['date_to']"/></t>
</p>
</div>
<div class="col-xs-4">
<strong>Target Moves:</strong>
<p>
<span t-if="data['target_move'] == 'all'">All Entries</span>
<span t-if="data['target_move'] == 'posted'">All Posted Entries</span>
</p>
</div>
</div>
<table class="table table-condensed">
<thead>
<tr>
<th>Code</th>
<th>Account</th>
<th class="text-right">Debit</th>
<th class="text-right">Credit</th>
<th class="text-right">Balance</th>
</tr>
</thead>
<tbody>
<tr t-foreach="Accounts" t-as="account">
<td>
<span t-att-style="style" t-esc="account['code']"/>
</td>
<td>
<span style="color: white;" t-esc="'..'"/>
<span t-att-style="style" t-esc="account['name']"/>
</td>
<td class="text-right">
<span t-att-style="style" t-esc="account['debit']" t-esc-options='{"widget": "monetary", "display_currency": "res_company.currency_id"}'/>
</td>
<td class="text-right">
<span t-att-style="style" t-esc="account['credit']" t-esc-options='{"widget": "monetary", "display_currency": "res_company.currency_id"}'/>
</td>
<td class="text-right">
<span t-att-style="style" t-esc="account['balance']" t-esc-options='{"widget": "monetary", "display_currency": "res_company.currency_id"}'/>
</td>
</tr>
</tbody>
</table>
</div>
</t>
</t>
</template>
</odoo>
+5 -5
View File
@@ -195,7 +195,7 @@
<p>To use the <strong>multi-currency option:</strong>
<ol>
<li>Activate the option in the <a t-att-href="prepare_backend_url('account.action_account_config')">Accounting Settings</a></li>
<li>Review the list of available currencies (from the Configuration menu)</li>
<li>Review the list of available currencies (from the <a t-att-href="prepare_backend_url('base.action_currency_form')">Configuration menu</a>)</li>
</ol>
</p>
<p>
@@ -225,14 +225,14 @@
</div>
<div class="panel-body">
<p>
If you have less than 200 contacts, we recommand you
If you have less than 200 contacts, we recommend you
to create them manually.
</p>
<ul>
<li>
<a t-att-href="prepare_backend_url('base.action_partner_form','list')">Create Customers</a>
<a t-att-href="prepare_backend_url('base.action_partner_form','kanban')">Create Customers</a>
</li><li>
<a t-att-href="prepare_backend_url('base.action_partner_form','list')">Create Vendors</a>, if accounting or purchase is installed
<a t-att-href="prepare_backend_url('base.action_partner_supplier_form','kanban')">Create Vendors</a>, if accounting or purchase is installed
</li>
</ul>
</div>
@@ -284,7 +284,7 @@
</div>
<div class="panel-body">
<ul>
<li><a t-att-href="prepare_backend_url('product.product_template_action', 'from', 'sale')">Create your products</a></li>
<li><a t-att-href="prepare_backend_url('product.product_template_action', 'form')">Create your products</a></li>
</ul>
</div>
</div>
+7
View File
@@ -9,3 +9,10 @@ import account_invoice_state
import account_validate_account_move
import pos_box
import account_move_reversal
import account_report_common
import account_report_common_account
import account_report_common_partner
import account_report_general_ledger
import account_report_trial_balance
import account_financial_report
import account_report_aged_partner_balance
@@ -0,0 +1,51 @@
# -*- coding: utf-8 -*-
from openerp import api, fields, models
class AccountingReport(models.TransientModel):
_name = "accounting.report"
_inherit = "account.common.report"
_description = "Accounting Report"
@api.model
def _get_account_report(self):
reports = []
if self._context.get('active_id'):
menu = self.env['ir.ui.menu'].browse(self._context.get('active_id')).name
reports = self.env['account.financial.report'].search([('name', 'ilike', menu)])
return reports and reports[0] or False
enable_filter = fields.Boolean(string='Enable Comparison')
account_report_id = fields.Many2one('account.financial.report', string='Account Reports', required=True, default=_get_account_report)
label_filter = fields.Char(string='Column Label', help="This label will be displayed on report to show the balance computed for the given comparison filter.")
filter_cmp = fields.Selection([('filter_no', 'No Filters'), ('filter_date', 'Date')], string='Filter by', required=True, default='filter_no')
date_from_cmp = fields.Date(string='Start Date')
date_to_cmp = fields.Date(string='End Date')
debit_credit = fields.Boolean(string='Display Debit/Credit Columns', help="This option allows you to get more details about the way your balances are computed. Because it is space consuming, we do not allow to use it while doing a comparison.")
def _build_comparison_context(self, data):
result = {}
result['journal_ids'] = 'journal_ids' in data['form'] and data['form']['journal_ids'] or False
result['state'] = 'target_move' in data['form'] and data['form']['target_move'] or ''
if data['form']['filter_cmp'] == 'filter_date':
result['date_from'] = data['form']['date_from_cmp']
result['date_to'] = data['form']['date_to_cmp']
result['strict_range'] = True
return result
@api.multi
def check_report(self):
res = super(AccountingReport, self).check_report()
data = {}
data['form'] = self.read(['account_report_id', 'date_from_cmp', 'date_to_cmp', 'journal_ids', 'filter_cmp', 'target_move'])[0]
for field in ['account_report_id']:
if isinstance(data['form'][field], tuple):
data['form'][field] = data['form'][field][0]
comparison_context = self._build_comparison_context(data)
res['data']['form']['comparison_context'] = comparison_context
return res
def _print_report(self, data):
data['form'].update(self.read(['date_from_cmp', 'debit_credit', 'date_to_cmp', 'filter_cmp', 'account_report_id', 'enable_filter', 'label_filter', 'target_move'])[0])
return self.env['report'].get_action(self, 'account.report_financial', data=data)
@@ -0,0 +1,72 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="accounting_report_view" model="ir.ui.view">
<field name="name">Accounting Report</field>
<field name="model">accounting.report</field>
<field name="inherit_id" ref="account.account_common_report_view"/>
<field name="arch" type="xml">
<field name="target_move" position="before">
<field name="account_report_id" domain="[('parent_id','=',False)]"/>
</field>
<field name="target_move" position="after">
<field name="enable_filter"/>
<field name="debit_credit" attrs="{'invisible': [('enable_filter','=',True)]}"/>
</field>
<field name="journal_ids" position="after">
<notebook tabpos="up" colspan="4">
<page string="Comparison" name="comparison" attrs="{'invisible': [('enable_filter','=',False)]}">
<group>
<field name="label_filter" attrs="{'required': [('enable_filter', '=', True)]}"/>
<field name="filter_cmp"/>
</group>
<group string="Dates" attrs="{'invisible':[('filter_cmp', '!=', 'filter_date')]}">
<field name="date_from_cmp" attrs="{'required':[('filter_cmp', '=', 'filter_date')]}"/>
<field name="date_to_cmp" attrs="{'required':[('filter_cmp', '=', 'filter_date')]}"/>
</group>
</page>
</notebook>
</field>
<field name="journal_ids" position="replace"/>
</field>
</record>
<record id="action_account_report_bs" model="ir.actions.act_window">
<field name="name">Balance Sheet</field>
<field name="res_model">accounting.report</field>
<field name="type">ir.actions.act_window</field>
<field name="view_type">form</field>
<field name="view_mode">form</field>
<field name="view_id" ref="accounting_report_view"/>
<field name="target">new</field>
<field name="context" eval="{'default_account_report_id':ref('account.account_financial_report_balancesheet0')}"/>
</record>
<menuitem id="menu_account_report_bs" name="Balance Sheet" action="action_account_report_bs" parent="menu_finance_legal_statement"/>
<record id="action_account_report_pl" model="ir.actions.act_window">
<field name="name">Profit and Loss</field>
<field name="res_model">accounting.report</field>
<field name="type">ir.actions.act_window</field>
<field name="view_type">form</field>
<field name="view_mode">form</field>
<field name="view_id" ref="accounting_report_view"/>
<field name="target">new</field>
<field name="context" eval="{'default_account_report_id':ref('account.account_financial_report_profitandloss0')}"/>
</record>
<menuitem id="menu_account_report_pl" name="Profit And Loss" action="action_account_report_pl" parent="menu_finance_legal_statement"/>
<record id="action_account_report" model="ir.actions.act_window">
<field name="name">Financial Reports</field>
<field name="res_model">accounting.report</field>
<field name="type">ir.actions.act_window</field>
<field name="view_type">form</field>
<field name="view_mode">form</field>
<field name="view_id" ref="accounting_report_view"/>
<field name="target">new</field>
</record>
<menuitem id="menu_account_report" name="Financial Report" action="action_account_report" parent="menu_finance_legal_statement" sequence="100"/>
</odoo>
@@ -0,0 +1,41 @@
# -*- coding: utf-8 -*-
import time
from datetime import datetime
from dateutil.relativedelta import relativedelta
from openerp import api, fields, models, _
from openerp.exceptions import UserError
class AccountAgedTrialBalance(models.TransientModel):
_name = 'account.aged.trial.balance'
_inherit = 'account.common.partner.report'
_description = 'Account Aged Trial balance Report'
period_length = fields.Integer(string='Period Length (days)', required=True, default=30)
journal_ids = fields.Many2many('account.journal', string='Journals', required=True)
date_from = fields.Date(default=lambda *a: time.strftime('%Y-%m-%d'))
def _print_report(self, data):
res = {}
data = self.pre_print_report(data)
data['form'].update(self.read(['period_length'])[0])
period_length = data['form']['period_length']
if period_length<=0:
raise UserError(_('You must set a period length greater than 0.'))
if not data['form']['date_from']:
raise UserError(_('You must set a start date.'))
start = datetime.strptime(data['form']['date_from'], "%Y-%m-%d")
for i in range(5)[::-1]:
stop = start - relativedelta(days=period_length)
res[str(i)] = {
'name': (i!=0 and (str((5-(i+1)) * period_length) + '-' + str((5-i) * period_length)) or ('+'+str(4 * period_length))),
'stop': start.strftime('%Y-%m-%d'),
'start': (i!=0 and stop.strftime('%Y-%m-%d') or False),
}
start = stop - relativedelta(days=1)
data['form'].update(res)
return self.env['report'].with_context(landscape=True).get_action(self, 'account.report_agedpartnerbalance', data=data)
@@ -0,0 +1,44 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="account_aged_balance_view" model="ir.ui.view">
<field name="name">Aged Partner Balance</field>
<field name="model">account.aged.trial.balance</field>
<field name="arch" type="xml">
<form string="Report Options">
<separator string="Aged Partner Balance"/>
<label string="Aged Partner Balance is a more detailed report of your receivables by intervals. When opening that report, Odoo asks for the name of the company, the Start Date and the size of the interval to be analyzed (in days). Odoo then calculates a table of credit balance by start Date. So if you request an interval of 30 days Odoo generates an analysis of creditors for the past month, past two months, and so on. "/>
<group col="4">
<field name="date_from"/>
<field name="period_length"/>
<newline/>
<field name="result_selection" widget="radio"/>
<field name="target_move" widget="radio"/>
</group>
<field name="journal_ids" required="0" invisible="1"/>
<footer>
<button name="check_report" string="Print" type="object" default_focus="1" class="oe_highlight"/>
or
<button string="Cancel" class="oe_link" special="cancel"/>
</footer>
</form>
</field>
</record>
<record id="action_account_aged_balance_view" model="ir.actions.act_window">
<field name="name">Aged Partner Balance</field>
<field name="res_model">account.aged.trial.balance</field>
<field name="type">ir.actions.act_window</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
<field name="view_id" ref="account_aged_balance_view"/>
<field name="context">{}</field>
<field name="target">new</field>
</record>
<menuitem id="menu_aged_trial_balance"
name="Aged Partner Balance"
action="action_account_aged_balance_view"
parent="account.menu_finance_legal_statement"/>
</odoo>
@@ -0,0 +1,39 @@
# -*- coding: utf-8 -*-
from openerp import api, fields, models, _
class AccountCommonReport(models.TransientModel):
_name = "account.common.report"
_description = "Account Common Report"
company_id = fields.Many2one('res.company', string='Company', readonly=True, default=lambda self: self.env.user.company_id)
journal_ids = fields.Many2many('account.journal', string='Journals', required=True, default=lambda self: self.env['account.journal'].search([]))
date_from = fields.Date(string='Start Date')
date_to = fields.Date(string='End Date')
target_move = fields.Selection([('posted', 'All Posted Entries'),
('all', 'All Entries'),
], string='Target Moves', required=True, default='posted')
def _build_contexts(self, data):
result = {}
result['journal_ids'] = 'journal_ids' in data['form'] and data['form']['journal_ids'] or False
result['state'] = 'target_move' in data['form'] and data['form']['target_move'] or ''
result['date_from'] = data['form']['date_from'] or False
result['date_to'] = data['form']['date_to'] or False
result['strict_range'] = True if result['date_from'] else False
return result
def _print_report(self, data):
raise (_('Error!'), _('Not implemented.'))
@api.multi
def check_report(self):
self.ensure_one()
data = {}
data['ids'] = self.env.context.get('active_ids', [])
data['model'] = self.env.context.get('active_model', 'ir.ui.menu')
data['form'] = self.read(['date_from', 'date_to', 'journal_ids', 'target_move'])[0]
used_context = self._build_contexts(data)
data['form']['used_context'] = dict(used_context, lang=self.env.context.get('lang', 'en_US'))
return self._print_report(data)
@@ -0,0 +1,18 @@
# -*- coding: utf-8 -*-
from openerp import api, fields, models
class AccountCommonAccountReport(models.TransientModel):
_name = 'account.common.account.report'
_description = 'Account Common Account Report'
_inherit = "account.common.report"
display_account = fields.Selection([('all','All'), ('movement','With movements'),
('not_zero','With balance is not equal to 0'),],
string='Display Accounts', required=True, default='movement')
@api.multi
def pre_print_report(self, data):
data['form'].update(self.read(['display_account'])[0])
return data
@@ -0,0 +1,18 @@
# -*- coding: utf-8 -*-
from openerp import fields, models
class AccountingCommonPartnerReport(models.TransientModel):
_name = 'account.common.partner.report'
_description = 'Account Common Partner Report'
_inherit = "account.common.report"
result_selection = fields.Selection([('customer', 'Receivable Accounts'),
('supplier', 'Payable Accounts'),
('customer_supplier', 'Receivable and Payable Accounts')
], string="Partner's", required=True, default='customer')
def pre_print_report(self, data):
data['form'].update(self.read(['result_selection'])[0])
return data
@@ -0,0 +1,36 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="account_common_report_view" model="ir.ui.view">
<field name="name">Common Report</field>
<field name="model">account.common.report</field>
<field name="arch" type="xml">
<form string="Report Options">
<field name="company_id" invisible="1"/>
<group col="4">
<field name="target_move" widget="radio"/>
<field name="date_from"/>
<field name="date_to"/>
</group>
<group col="3">
<field name="journal_ids" widget="many2many_tags" options="{'no_create': True}"/>
</group>
<footer>
<button name="check_report" string="Print" type="object" default_focus="1" class="oe_highlight"/>
or
<button string="Cancel" class="oe_link" special="cancel" />
</footer>
</form>
</field>
</record>
<record id="action_account_common_menu" model="ir.actions.act_window">
<field name="name">Common Report</field>
<field name="res_model">account.common.report</field>
<field name="view_type">form</field>
<field name="view_mode">form</field>
<field name="view_id" ref="account_common_report_view"/>
<field name="target">new</field>
</record>
</odoo>
@@ -0,0 +1,22 @@
# -*- coding: utf-8 -*-
from openerp import fields, models, _
from openerp.exceptions import UserError
class AccountReportGeneralLedger(models.TransientModel):
_inherit = "account.common.account.report"
_name = "account.report.general.ledger"
_description = "General Ledger Report"
initial_balance = fields.Boolean(string='Include Initial Balances',
help='If you selected date, this field allow you to add a row to display the amount of debit/credit/balance that precedes the filter you\'ve set.')
sortby = fields.Selection([('sort_date', 'Date'), ('sort_journal_partner', 'Journal & Partner')], string='Sort by', required=True, default='sort_date')
journal_ids = fields.Many2many('account.journal', 'account_report_general_ledger_journal_rel', 'account_id', 'journal_id', string='Journals', required=True)
def _print_report(self, data):
data = self.pre_print_report(data)
data['form'].update(self.read(['initial_balance', 'sortby'])[0])
if data['form'].get('initial_balance') and not data['form'].get('date_from'):
raise UserError(_("You must define a Start Date"))
return self.env['report'].with_context(landscape=True).get_action(self, 'account.report_generalledger', data=data)
@@ -0,0 +1,47 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="account_report_general_ledger_view" model="ir.ui.view">
<field name="name">General Ledger</field>
<field name="model">account.report.general.ledger</field>
<field name="inherit_id" ref="account_common_report_view"/>
<field name="arch" type="xml">
<data>
<xpath expr="//field[@name='target_move']" position="after">
<field name="sortby" widget="radio"/>
<field name="display_account" widget="radio"/>
<field name="initial_balance"/>
<newline/>
</xpath>
</data>
</field>
</record>
<record id="action_account_general_ledger_menu" model="ir.actions.act_window">
<field name="name">General Ledger</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">account.report.general.ledger</field>
<field name="view_type">form</field>
<field name="view_mode">form</field>
<field name="view_id" ref="account_report_general_ledger_view"/>
<field name="target">new</field>
</record>
<record id="action_account_general_ledger_values" model="ir.values">
<field name="model_id" ref="account.model_account_account" />
<field name="name">General Ledger</field>
<field name="key2">client_print_multi</field>
<field name="value" eval="'ir.actions.act_window,' +str(ref('action_account_general_ledger_menu'))" />
<field name="key">action</field>
<field name="model">account.account</field>
</record>
<menuitem
id="menu_general_ledger"
name="General Ledger"
parent="account.menu_finance_legal_statement"
action="action_account_general_ledger_menu"
groups="group_account_manager,group_account_user"
/>
</odoo>
@@ -0,0 +1,15 @@
# -*- coding: utf-8 -*-
from openerp import fields, models
class AccountBalanceReport(models.TransientModel):
_inherit = "account.common.account.report"
_name = 'account.balance.report'
_description = 'Trial Balance Report'
journal_ids = fields.Many2many('account.journal', 'account_balance_report_journal_rel', 'account_id', 'journal_id', string='Journals', required=True, default=[])
def _print_report(self, data):
data = self.pre_print_report(data)
return self.env['report'].get_action(self, 'account.report_trialbalance', data=data)
@@ -0,0 +1,44 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="account_report_balance_view" model="ir.ui.view">
<field name="name">Trial Balance</field>
<field name="model">account.balance.report</field>
<field name="inherit_id" ref="account_common_report_view"/>
<field name="arch" type="xml">
<data>
<field name="journal_ids" position="replace"/>
<xpath expr="//field[@name='target_move']" position="after">
<field name="display_account" widget="radio"/>
<newline/>
</xpath>
</data>
</field>
</record>
<record id="action_account_balance_menu" model="ir.actions.act_window">
<field name="name">Trial Balance</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">account.balance.report</field>
<field name="view_type">form</field>
<field name="view_mode">form</field>
<field name="view_id" ref="account_report_balance_view"/>
<field name="target">new</field>
</record>
<menuitem id="menu_general_Balance_report"
name="Trial Balance"
parent="account.menu_finance_legal_statement"
action="action_account_balance_menu"/>
<record id="action_account_balance_report_values1" model="ir.values">
<field name="model_id" ref="account.model_account_account" />
<field name="name">Trial Balance</field>
<field name="key2">client_print_multi</field>
<field name="value" eval="'ir.actions.act_window,' +str(ref('action_account_balance_menu'))" />
<field name="key">action</field>
<field name="model">account.account</field>
</record>
</odoo>
@@ -236,11 +236,6 @@
domain="[('type', '=', 'purchase')]"
context="{'default_type': 'purchase'}"/>
</field>
<field name="property_account_income_id" position="before">
<field name="deferred_revenue_category_id"
domain="[('type', '=', 'sale')]"
context="{'default_type': 'sale'}"/>
</field>
</field>
</record>
@@ -37,25 +37,26 @@ class AccountJournal(models.Model):
@api.model
def create(self, vals):
if not vals.get('check_sequence_id'):
vals.update({'check_sequence_id': self._create_check_sequence(vals).id})
return super(AccountJournal, self).create(vals)
rec = super(AccountJournal, self).create(vals)
if not rec.check_sequence_id:
rec._create_check_sequence()
return rec
@api.one
def copy(self, default=None):
rec = super(AccountJournal, self).copy(default)
rec.write({'check_sequence_id': self._create_check_sequence({'name': rec.name, 'company_id': rec.company_id.id}).id})
rec._create_check_sequence()
return rec
@api.model
def _create_check_sequence(self, vals):
@api.one
def _create_check_sequence(self):
""" Create a check sequence for the journal """
return self.env['ir.sequence'].sudo().create({
'name': vals['name'] + _(" : Check Number Sequence"),
self.check_sequence_id = self.env['ir.sequence'].sudo().create({
'name': self.name + _(" : Check Number Sequence"),
'implementation': 'no_gap',
'padding': 5,
'number_increment': 1,
'company_id': vals.get('company_id', self.env.user.company_id.id),
'company_id': self.company_id.id,
})
def _default_outbound_payment_methods(self):
@@ -70,8 +71,7 @@ class AccountJournal(models.Model):
check_printing = self.env.ref('account_check_printing.account_payment_method_check')
bank_journals = self.search([('type', '=', 'bank')])
for bank_journal in bank_journals:
check_sequence = self._create_check_sequence({'name': bank_journal.name, 'company_id': bank_journal.company_id.id})
bank_journal._create_check_sequence()
bank_journal.write({
'outbound_payment_method_ids': [(4, check_printing.id, None)],
'check_sequence_id': check_sequence.id,
})
+1 -9
View File
@@ -41,14 +41,6 @@ class account_analytic_account(models.Model):
account.credit = data_credit.get(account.id, 0.0)
account.balance = account.credit - account.debit
@api.model
def _default_company(self):
return self.env.user.company_id.id
@api.model
def _default_user(self):
return self.env.user.id
name = fields.Char(string='Analytic Account', index=True, required=True, track_visibility='onchange')
code = fields.Char(string='Reference', index=True, track_visibility='onchange')
account_type = fields.Selection([
@@ -58,7 +50,7 @@ class account_analytic_account(models.Model):
tag_ids = fields.Many2many('account.analytic.tag', 'account_analytic_account_tag_rel', 'account_id', 'tag_id', string='Tags', copy=True)
line_ids = fields.One2many('account.analytic.line', 'account_id', string="Analytic Lines")
company_id = fields.Many2one('res.company', string='Company', required=True, default=_default_company)
company_id = fields.Many2one('res.company', string='Company', required=True, default=lambda self: self.env.user.company_id)
partner_id = fields.Many2one('res.partner', string='Customer')
balance = fields.Monetary(compute='_compute_debit_credit_balance', string='Balance')
@@ -89,7 +89,7 @@
<input type="hidden" name="token" t-att-value="token"/>
<div class="clearfix oe_login_buttons">
<a t-attf-href="/web/login?{{ keep_query() }}" class="btn btn-link pull-right">Back to Login</a>
<button type="submit" class="btn btn-primary pull-left">Reset password</button>
<button type="submit" class="btn btn-primary pull-left">Confirm</button>
</div>
</form>
+2
View File
@@ -1197,6 +1197,8 @@ Update your business card, phone book, social media,... Send an email right now
res['done']['target'] = user.target_sales_done
res['won']['target'] = user.target_sales_won
res['currency_id'] = user.company_id.currency_id.id
return res
def modify_target_sales_dashboard(self, cr, uid, target_name, target_value, context=None):
+2 -1
View File
@@ -292,6 +292,7 @@
<field name="tag_ids"/>
<field name="partner_id"/>
<field name="active"/>
<field name="company_currency"/>
<templates>
<field name="date_deadline"/>
<t t-name="kanban-box">
@@ -317,7 +318,7 @@
<strong><field name="name"/></strong>
</div>
<div class="text-muted">
<span t-if="record.planned_revenue.raw_value"><t t-esc="record.planned_revenue.value"/><field name="company_currency"/></span> <span t-if="record.partner_id.value"> - <t t-esc="record.partner_id.value"/></span>
<t t-if="record.planned_revenue.raw_value"><field name="planned_revenue" widget="monetary" options="{'currency_field': 'company_currency'}"/></t> <span t-if="record.partner_id.value"> - <t t-esc="record.partner_id.value"/></span>
</div>
<div class="text-muted">
<t t-if="record.date_deadline.raw_value and record.date_deadline.raw_value lt (new Date())" t-set="red">oe_kanban_text_red</t>
+185 -41
View File
@@ -6,8 +6,8 @@ msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 9.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-09-07 14:39+0000\n"
"PO-Revision-Date: 2015-09-07 14:39+0000\n"
"POT-Creation-Date: 2015-09-10 10:19+0000\n"
"PO-Revision-Date: 2015-09-10 10:19+0000\n"
"Last-Translator: <>\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
@@ -63,11 +63,6 @@ msgstr ""
msgid "<span class=\"fa fa-arrow-circle-o-down\"/> Install Events"
msgstr ""
#. module: crm
#: model:ir.ui.view,arch_db:crm.crm_planner
msgid "<span class=\"fa fa-arrow-circle-o-down\"/> Install Live Chat"
msgstr ""
#. module: crm
#: model:ir.ui.view,arch_db:crm.crm_planner
msgid "<span class=\"fa fa-arrow-circle-o-down\"/> Install Mailing"
@@ -83,6 +78,11 @@ msgstr ""
msgid "<span class=\"fa fa-arrow-circle-o-down\"/> Install Surveys"
msgstr ""
#. module: crm
#: model:ir.ui.view,arch_db:crm.crm_planner
msgid "<span class=\"fa fa-arrow-circle-o-down\"/> Install Website Live Chat"
msgstr ""
#. module: crm
#: model:ir.ui.view,arch_db:crm.crm_planner
msgid "<span class=\"fa fa-arrow-circle-o-down\"/> Install e-Commerce"
@@ -101,7 +101,7 @@ msgid "<span class=\"fa fa-lightbulb-o fa-lg\"/>\n"
" Using templates can boost the quality of your\n"
" quotations and their success rate. However,\n"
" creating such templates can be a huge effort.\n"
" We recommand to start with standard quotations\n"
" We recommend to start with standard quotations\n"
" and upgrade later."
msgstr ""
@@ -185,7 +185,7 @@ msgstr ""
msgid "<span class=\"panel-title\">\n"
" <span class=\"fa\" data-icon=\"&#57408;\"/>\n"
" <strong>Import a file</strong><br/>\n"
" <span class=\"small\">Recommanded if &gt;100 products</span>\n"
" <span class=\"small\">Recommended if &gt;100 products</span>\n"
" </span>"
msgstr ""
@@ -221,7 +221,7 @@ msgstr ""
msgid "<span class=\"panel-title\">\n"
" <span class=\"fa\" data-icon=\"&#57440;\"/>\n"
" <strong> Create manually</strong><br/>\n"
" <span class=\"small\">Recommanded if &lt;100 products</span>\n"
" <span class=\"small\">Recommended if &lt;100 products</span>\n"
" </span>"
msgstr ""
@@ -336,11 +336,6 @@ msgid "<strong>Forecast future revenues</strong><br/>\n"
" accurate expected revenues by closing date."
msgstr ""
#. module: crm
#: model:ir.ui.view,arch_db:crm.crm_planner
msgid "<strong>Live Chat</strong>"
msgstr ""
#. module: crm
#: model:ir.ui.view,arch_db:crm.crm_planner
msgid "<strong>Mass mailing</strong>"
@@ -446,6 +441,11 @@ msgid "<strong>Trainings</strong><br/>\n"
" apps of Odoo:"
msgstr ""
#. module: crm
#: model:ir.ui.view,arch_db:crm.crm_planner
msgid "<strong>Website Live Chat</strong>"
msgstr ""
#. module: crm
#: model:ir.ui.view,arch_db:crm.crm_planner
msgid "<strong>You</strong> called the prospect for a follow up on your offer"
@@ -453,7 +453,7 @@ msgstr ""
#. module: crm
#: model:ir.ui.view,arch_db:crm.crm_planner
msgid "<strong>You</strong> understand the customer need, it's budget and his pain points"
msgid "<strong>You</strong> understand the customer's needs and pain points, and you have a fairly good idea of his budget to spend"
msgstr ""
#. module: crm
@@ -503,6 +503,16 @@ msgstr ""
msgid "Accept Emails From"
msgstr ""
#. module: crm
#: model:ir.model.fields,field_description:crm.field_res_users_property_account_payable_id
msgid "Account Payable"
msgstr ""
#. module: crm
#: model:ir.model.fields,field_description:crm.field_res_users_property_account_receivable_id
msgid "Account Receivable"
msgstr ""
#. module: crm
#: model:ir.ui.view,arch_db:crm.crm_activity_view_search
msgid "Action Search"
@@ -709,6 +719,11 @@ msgstr ""
msgid "B2C"
msgstr ""
#. module: crm
#: model:ir.model.fields,field_description:crm.field_res_users_bank_account_count
msgid "Bank"
msgstr ""
#. module: crm
#: model:ir.ui.view,arch_db:crm.crm_planner
msgid "Better structure the sales process"
@@ -902,6 +917,11 @@ msgstr ""
msgid "Color Index"
msgstr ""
#. module: crm
#: model:ir.model.fields,field_description:crm.field_res_users_ref_company_ids
msgid "Companies that refers to partner"
msgstr ""
#. module: crm
#: model:ir.model.fields,field_description:crm.field_crm_activity_report_company_id
#: model:ir.model.fields,field_description:crm.field_crm_lead_company_id
@@ -957,6 +977,12 @@ msgstr ""
msgid "Contacts"
msgstr ""
#. module: crm
#: model:ir.model.fields,field_description:crm.field_res_users_contract_ids
#: model:ir.model.fields,field_description:crm.field_res_users_contracts_count
msgid "Contracts"
msgstr ""
#. module: crm
#: model:ir.model.fields,field_description:crm.field_crm_lead2opportunity_partner_mass_name
#: model:ir.model.fields,field_description:crm.field_crm_lead2opportunity_partner_name
@@ -1119,6 +1145,11 @@ msgstr ""
msgid "Currency"
msgstr ""
#. module: crm
#: model:ir.model.fields,field_description:crm.field_res_users_currency_id
msgid "Currency id"
msgstr ""
#. module: crm
#: model:ir.ui.view,arch_db:crm.crm_opportunity_report_view_search
msgid "Current"
@@ -1154,6 +1185,11 @@ msgstr ""
msgid "Customer Name"
msgstr ""
#. module: crm
#: model:ir.model.fields,field_description:crm.field_res_users_property_payment_term_id
msgid "Customer Payment Term"
msgstr ""
#. module: crm
#: model:ir.ui.view,arch_db:crm.view_crm_lead2opportunity_partner
#: model:ir.ui.view,arch_db:crm.view_crm_lead2opportunity_partner_mass
@@ -1477,6 +1513,11 @@ msgstr ""
msgid "Finished"
msgstr ""
#. module: crm
#: model:ir.model.fields,field_description:crm.field_res_users_property_account_position_id
msgid "Fiscal Position"
msgstr ""
#. module: crm
#: model:ir.model.fields,field_description:crm.field_crm_stage_fold
msgid "Folded in Pipeline"
@@ -1606,6 +1647,11 @@ msgstr ""
msgid "Happy Selling!<br/>- The Odoo Team"
msgstr ""
#. module: crm
#: model:ir.model.fields,field_description:crm.field_res_users_has_unreconciled_entries
msgid "Has unreconciled entries"
msgstr ""
#. module: crm
#: model:ir.ui.view,arch_db:crm.crm_planner
msgid "Have clear forecasts on sales"
@@ -1618,7 +1664,7 @@ msgstr ""
#. module: crm
#: model:ir.ui.view,arch_db:crm.crm_planner
msgid "Here are a few examples of document you should provide to your sales team based on the sales stage:"
msgid "Here are a few examples of documents you should provide to your sales team based on the sales stage:"
msgstr ""
#. module: crm
@@ -1701,7 +1747,7 @@ msgstr ""
#. module: crm
#: model:ir.ui.view,arch_db:crm.crm_planner
msgid "If you have less than 200 contacts, we recommand you\n"
msgid "If you have less than 200 contacts, we recommend you\n"
" to create them manually."
msgstr ""
@@ -1737,6 +1783,12 @@ msgstr ""
msgid "In Odoo, there are 3 different ways to manage your products prices.<br/>"
msgstr ""
#. module: crm
#: code:addons/crm/sales_team.py:15
#, python-format
msgid "Incoming"
msgstr ""
#. module: crm
#: model:ir.ui.view,arch_db:crm.crm_planner
msgid "Incoming email create leads automatically when a new prospect contacts you.\n"
@@ -1759,6 +1811,11 @@ msgstr ""
msgid "Invoice Analysis"
msgstr ""
#. module: crm
#: model:ir.model.fields,field_description:crm.field_res_users_invoice_ids
msgid "Invoices"
msgstr ""
#. module: crm
#: model:ir.model.fields,field_description:crm.field_base_partner_merge_automatic_wizard_group_by_is_company
msgid "Is Company"
@@ -1769,6 +1826,12 @@ msgstr ""
msgid "Is Follower"
msgstr ""
#. module: crm
#: model:ir.model.fields,field_description:crm.field_res_users_issued_total
#: model:ir.model.fields,field_description:crm.field_res_users_journal_item_count
msgid "Journal Items"
msgstr ""
#. module: crm
#: model:ir.model.fields,field_description:crm.field_base_partner_merge_automatic_wizard_exclude_journal_item
msgid "Journal Items associated to the contact"
@@ -1849,6 +1912,21 @@ msgstr ""
msgid "Last Updated on"
msgstr ""
#. module: crm
#: model:ir.model.fields,field_description:crm.field_res_users_calendar_last_notif_ack
msgid "Last notification marked as read from base Calendar"
msgstr ""
#. module: crm
#: model:ir.model.fields,help:crm.field_res_users_last_time_entries_checked
msgid "Last time the invoices & payments matching was performed for this partner. It is set either if there's not at least an unreconciled debit and an unreconciled credit or if you click the \"Done\" button."
msgstr ""
#. module: crm
#: model:ir.model.fields,field_description:crm.field_res_users_last_time_entries_checked
msgid "Latest Invoices & Payments Matching Date"
msgstr ""
#. module: crm
#: code:addons/crm/crm_lead.py:834
#: selection:crm.activity.report,lead_type:0
@@ -2297,10 +2375,8 @@ msgid "Negotiation"
msgstr ""
#. module: crm
#: code:addons/crm/sales_team.py:15
#: model:crm.stage,name:crm.crm_stage_2_1
#: model:crm.stage,name:crm.stage_lead1
#, python-format
msgid "New"
msgstr ""
@@ -2415,7 +2491,7 @@ msgstr ""
#. module: crm
#: model:ir.model.fields,help:crm.field_crm_activity_days
msgid "Number of days before doing fulfilling the action, allowing to plan the action date."
msgid "Number of days before executing the action, allowing you to plan the date of the action."
msgstr ""
#. module: crm
@@ -2448,7 +2524,7 @@ msgstr ""
#. module: crm
#: model:ir.ui.view,arch_db:crm.crm_planner
msgid "Odoo is the world's only software to have a full integration of Marketing Apps your sales channel: insight sales, point of sale, ecommerce."
msgid "Odoo is the world's only software to have a full integration of Marketing Apps for your sales channel: insight sales, point of sale, ecommerce."
msgstr ""
#. module: crm
@@ -2641,12 +2717,12 @@ msgstr ""
#. module: crm
#: model:ir.model.fields,help:crm.field_crm_team_alias_parent_model_id
msgid "Parent model holding the alias. The model holding the alias referenceis not necessarily the model given by alias_model_id(example: project (parent_model) and task (model))"
msgid "Parent model holding the alias. The model holding the alias reference is not necessarily the model given by alias_model_id (example: project (parent_model) and task (model))"
msgstr ""
#. module: crm
#: model:ir.model.fields,help:crm.field_crm_activity_parent_id
msgid "Parent subtype, used for automatic subscription. This field is notcorrectly named. For example on a project, project subtypes haveparent_id to task-related subtypes."
msgid "Parent subtype, used for automatic subscription. This field is not correctly named. For example on a project, the parent_id of project subtypes refers to task-related subtypes."
msgstr ""
#. module: crm
@@ -2677,6 +2753,11 @@ msgstr ""
msgid "Partners"
msgstr ""
#. module: crm
#: model:ir.model.fields,field_description:crm.field_res_users_debit_limit
msgid "Payable Limit"
msgstr ""
#. module: crm
#: model:ir.model.fields,field_description:crm.field_crm_lead_phone
msgid "Phone"
@@ -2705,12 +2786,20 @@ msgstr ""
#. module: crm
#: model:ir.actions.act_window,help:crm.crm_opportunity_report_action
msgid "Pipeline Analysis gives you an instant access to\n"
"your opportunities with information such as the expected revenue, planned cost,\n"
"missed deadlines or the number of interactions per opportunity. This report is\n"
"mainly used by the sales manager in order to do the periodic review with the\n"
"teams of the sales pipeline."
msgstr ""
#. module: crm
#: model:ir.actions.act_window,help:crm.crm_opportunity_report_action_graph
msgid "Pipeline Analysis gives you an instant access to\n"
"your opportunities with information such as the expected revenue, planned cost,\n"
"µmissed deadlines or the number of interactions per opportunity. This report is\n"
"mainly used by the sales manager in order to do the periodic review with the\n"
"teams of the sales pipeline."
"missed deadlines or the number of interactions per opportunity. This report is\n"
"mainly used by the sales manager in order to periodically review the pipeline\n"
"with the the sales teams."
msgstr ""
#. module: crm
@@ -3008,7 +3097,7 @@ msgstr ""
#. module: crm
#: model:ir.ui.view,arch_db:crm.crm_planner
msgid "Show advanced filters and options by clicking on next to the search bar."
msgid "Show advanced filters and options by clicking on the magnifying glass icon next to the search bar."
msgstr ""
#. module: crm
@@ -3220,6 +3309,11 @@ msgstr ""
msgid "The first stage is usually \"New\" and the last one is \"Won\""
msgstr ""
#. module: crm
#: model:ir.model.fields,help:crm.field_res_users_property_account_position_id
msgid "The fiscal position will determine taxes and accounts used for the partner."
msgstr ""
#. module: crm
#: model:ir.model.fields,help:crm.field_crm_team_alias_model_id
msgid "The model (Odoo Document Kind) to which this alias corresponds. Any incoming email that does not reply to an existing record will cause the creation of a new record of this model (e.g. a Project Task)"
@@ -3240,6 +3334,11 @@ msgstr ""
msgid "The owner of records created upon receiving emails on this alias. If this field is not set the system will attempt to find the right owner based on the sender (From) address, or will use the Administrator account if no system user is found for that address."
msgstr ""
#. module: crm
#: model:ir.model.fields,help:crm.field_res_users_has_unreconciled_entries
msgid "The partner has at least one unreconciled debit and credit since last time the invoices & payments matching was performed."
msgstr ""
#. module: crm
#: model:ir.ui.view,arch_db:crm.crm_planner
msgid "The point of contact <strong>for all your prospects</strong>"
@@ -3274,6 +3373,16 @@ msgstr ""
msgid "These email addresses will be added to the CC field of all inbound and outbound emails for this record before being sent. Separate multiple email addresses with a comma"
msgstr ""
#. module: crm
#: model:ir.model.fields,help:crm.field_res_users_property_account_payable_id
msgid "This account will be used instead of the default one as the payable account for the current partner"
msgstr ""
#. module: crm
#: model:ir.model.fields,help:crm.field_res_users_property_account_receivable_id
msgid "This account will be used instead of the default one as the receivable account for the current partner"
msgstr ""
#. module: crm
#: model:ir.ui.view,arch_db:crm.crm_planner
msgid "This email address has been preconfigured as the default\n"
@@ -3314,6 +3423,16 @@ msgstr ""
msgid "This is the source of the link Ex: Search Engine, another domain, or name of email list"
msgstr ""
#. module: crm
#: model:ir.model.fields,help:crm.field_res_users_property_supplier_payment_term_id
msgid "This payment term will be used instead of the default one for purchase orders and vendor bills"
msgstr ""
#. module: crm
#: model:ir.model.fields,help:crm.field_res_users_property_payment_term_id
msgid "This payment term will be used instead of the default one for sale orders and customer invoices"
msgstr ""
#. module: crm
#: model:ir.model.fields,help:crm.field_crm_stage_probability
msgid "This percentage depicts the default/average probability of the Case for this stage to be a success"
@@ -3353,11 +3472,36 @@ msgstr ""
msgid "Title"
msgstr ""
#. module: crm
#: model:ir.model.fields,field_description:crm.field_res_users_total_invoiced
msgid "Total Invoiced"
msgstr ""
#. module: crm
#: model:ir.model.fields,field_description:crm.field_res_users_debit
msgid "Total Payable"
msgstr ""
#. module: crm
#: model:ir.model.fields,field_description:crm.field_res_users_credit
msgid "Total Receivable"
msgstr ""
#. module: crm
#: model:ir.model.fields,field_description:crm.field_crm_opportunity_report_total_revenue
msgid "Total Revenue"
msgstr ""
#. module: crm
#: model:ir.model.fields,help:crm.field_res_users_credit
msgid "Total amount this customer owes you."
msgstr ""
#. module: crm
#: model:ir.model.fields,help:crm.field_res_users_debit
msgid "Total amount you have to pay to this vendor."
msgstr ""
#. module: crm
#: model:ir.ui.view,arch_db:crm.crm_case_form_view_leads
msgid "Tracking"
@@ -3499,6 +3643,11 @@ msgstr ""
msgid "Users"
msgstr ""
#. module: crm
#: model:ir.model.fields,help:crm.field_res_users_currency_id
msgid "Utility field to express amount currency"
msgstr ""
#. module: crm
#: model:ir.model.fields,field_description:crm.field_base_partner_merge_automatic_wizard_group_by_vat
msgid "VAT"
@@ -3509,6 +3658,11 @@ msgstr ""
msgid "VIP letter to potential sponsors"
msgstr ""
#. module: crm
#: model:ir.model.fields,field_description:crm.field_res_users_property_supplier_payment_term_id
msgid "Vendor Payment Term"
msgstr ""
#. module: crm
#: selection:crm.lead,priority:0
#: selection:crm.opportunity.report,priority:0
@@ -3557,16 +3711,6 @@ msgstr ""
msgid "We hope this process helped you improve your sales strategy."
msgstr ""
#. module: crm
#: model:ir.model.fields,field_description:crm.field_crm_lead_website_message_ids
msgid "Website Messages"
msgstr ""
#. module: crm
#: model:ir.model.fields,help:crm.field_crm_lead_website_message_ids
msgid "Website communication history"
msgstr ""
#. module: crm
#: model:ir.ui.view,arch_db:crm.crm_planner
msgid "What <strong>kind of proposals</strong> do you usually send to your customers ?"
@@ -3574,7 +3718,7 @@ msgstr ""
#. module: crm
#: model:ir.ui.view,arch_db:crm.crm_planner
msgid "What are the main KPIs you need to track the sales actities?"
msgid "What are the main KPIs you need to track for your the sales actities?"
msgstr ""
#. module: crm
@@ -3656,8 +3800,8 @@ msgstr ""
#. module: crm
#: model:ir.ui.view,arch_db:crm.crm_planner
msgid "You may have different sale price for different\n"
" group of customers:"
msgid "You may have a different sale price for different\n"
" groups of customers:"
msgstr ""
#. module: crm
+1 -1
View File
@@ -25,7 +25,7 @@ class CrmActivity(models.Model):
_order = "sequence"
days = fields.Integer('Number of days', default=0,
help='Number of days before doing fulfilling the action, allowing to plan the action date.')
help='Number of days before executing the action, allowing you to plan the date of the action.')
sequence = fields.Integer('Sequence', default=0)
team_id = fields.Many2one('crm.team', string='Sales Team')
subtype_id = fields.Many2one('mail.message.subtype', string='Message Subtype', required=True, ondelete='cascade')
@@ -161,7 +161,7 @@
(0, 0, {'view_mode': 'graph', 'view_id': ref('crm_opportunity_report_view_graph')})]"/>
<field name="help">Pipeline Analysis gives you an instant access to
your opportunities with information such as the expected revenue, planned cost,
µmissed deadlines or the number of interactions per opportunity. This report is
missed deadlines or the number of interactions per opportunity. This report is
mainly used by the sales manager in order to do the periodic review with the
teams of the sales pipeline.</field>
</record>
@@ -180,9 +180,9 @@ teams of the sales pipeline.</field>
(0, 0, {'view_mode': 'pivot', 'view_id': ref('crm_opportunity_report_view_pivot')})]"/>
<field name="help">Pipeline Analysis gives you an instant access to
your opportunities with information such as the expected revenue, planned cost,
µmissed deadlines or the number of interactions per opportunity. This report is
mainly used by the sales manager in order to do the periodic review with the
teams of the sales pipeline.</field>
missed deadlines or the number of interactions per opportunity. This report is
mainly used by the sales manager in order to periodically review the pipeline
with the the sales teams.</field>
</record>
<record id="crm_opportunity_report_action_lead" model="ir.actions.act_window">
+12 -12
View File
@@ -84,7 +84,7 @@
<t t-call="web_planner.page">
<t t-set="page_title" t-value="'Your KPIs'"/>
<p class="text-muted">
What are the main KPIs you need to track the sales actities?
What are the main KPIs you need to track for your the sales actities?
</p>
<div class="row">
<div class="o_planner_notebook_container col-md-12">
@@ -403,7 +403,7 @@
Using templates can boost the quality of your
quotations and their success rate. However,
creating such templates can be a huge effort.
We recommand to start with standard quotations
We recommend to start with standard quotations
and upgrade later.
</div>
</t>
@@ -425,14 +425,14 @@
</div>
<div class="panel-body">
<p>
If you have less than 200 contacts, we recommand you
If you have less than 200 contacts, we recommend you
to create them manually.
</p>
<ul>
<li>
<a t-att-href="prepare_backend_url('base.action_partner_form','list')">Create Customers</a>
<a t-att-href="prepare_backend_url('base.action_partner_form','kanban')">Create Customers</a>
</li><li>
<a t-att-href="prepare_backend_url('base.action_partner_form','list')">Create Vendors</a>, if accounting or purchase is installed
<a t-att-href="prepare_backend_url('base.action_partner_supplier_form','kanban')">Create Vendors</a>, if accounting or purchase is installed
</li>
</ul>
</div>
@@ -491,7 +491,7 @@
</div>
<div class="panel-body">
<ul>
<li><a t-att-href="prepare_backend_url('product.product_template_action', 'from', 'sale')">Create your products</a></li>
<li><a t-att-href="prepare_backend_url('product.product_template_action', 'form')">Create your products</a></li>
</ul>
</div>
</div>
@@ -525,7 +525,7 @@
<div class="alert alert-info info_icon" role="alert">
<span class="fa fa-lightbulb-o fa-lg"/>
<strong>Tip:</strong>
You can also use our API to load data automatically through scripts: read this <a href="https://www.odoo.com/documentation/8.0/" target="_blank">technical documentation</a>.
You can also use our API to load data automatically through scripts: read this <a href="https://www.odoo.com/documentation/8.0/api_integration.html" target="_blank">technical documentation</a>.
</div>
</t>
@@ -560,8 +560,8 @@
</div>
<div class="panel-body">
<p>
You may have different sale price for different
group of customers:
You may have a different sale price for different
groups of customers:
</p>
<ul>
<li>Consumers</li>
@@ -726,7 +726,7 @@
<div class="alert alert-info info_icon" role="alert">
<span class="fa fa-lightbulb-o fa-2x"></span>
<strong>Tips:</strong>
<li>Show advanced filters and options by clicking on next to the search bar.</li>
<li>Show advanced filters and options by clicking on the magnifying glass icon next to the search bar.</li>
<li>Save filters or add any report to your dashboard with the Favorites menu.</li>
</div>
</t>
@@ -826,7 +826,7 @@
</p>
</div>
</div>
<p>Here are a few examples of document you should provide to your sales team based on the sales stage:</p>
<p>Here are a few examples of documents you should provide to your sales team based on the sales stage:</p>
<section>
<div class="well well-lg">
<p><strong>New:</strong></p>
@@ -862,7 +862,7 @@
<t t-call="web_planner.page">
<t t-set="page_title" t-value="'Add Features'"/>
<p class="text-muted">
Odoo is the world's only software to have a full integration of Marketing Apps your sales channel: insight sales, point of sale, ecommerce.
Odoo is the world's only software to have a full integration of Marketing Apps for your sales channel: insight sales, point of sale, ecommerce.
</p>
<h4>
<strong>To boost your leads acquisition,</strong> you should have a look at our marketing apps:
@@ -6,8 +6,8 @@ msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 9.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-09-07 14:40+0000\n"
"PO-Revision-Date: 2015-09-07 14:40+0000\n"
"POT-Creation-Date: 2015-09-10 10:20+0000\n"
"PO-Revision-Date: 2015-09-10 10:20+0000\n"
"Last-Translator: <>\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
@@ -68,9 +68,15 @@ msgid "<p>I am interested by this lead.</p>"
msgstr ""
#. module: crm_partner_assign
#: code:addons/crm_partner_assign/wizard/crm_channel_interested.py:34
#: code:addons/crm_partner_assign/wizard/crm_channel_interested.py:35
#, python-format
msgid "<p>I am not interested by this lead. I %scontacted the lead.</p>"
msgid "<p>I am not interested by this lead. I contacted the lead.</p>"
msgstr ""
#. module: crm_partner_assign
#: code:addons/crm_partner_assign/wizard/crm_channel_interested.py:37
#, python-format
msgid "<p>I am not interested by this lead. I have not contacted the lead.</p>"
msgstr ""
#. module: crm_partner_assign
@@ -519,7 +525,7 @@ msgid "Leads Analysis"
msgstr ""
#. module: crm_partner_assign
#: model:ir.model.fields,field_description:crm_partner_assign.field_res_partner_grade_id_9493
#: model:ir.model.fields,field_description:crm_partner_assign.field_res_partner_grade_id_4327
#: model:ir.ui.view,arch_db:crm_partner_assign.view_partner_grade_form
msgid "Level"
msgstr ""
@@ -22,7 +22,6 @@
-
!python {model: crm.lead}: |
lead = self.browse(cr, uid, ref('crm.crm_case_21'))
# import pdb; pdb.set_trace()
assert lead.partner_assigned_id.id == ref('base.res_partner_18') , "Opportuniy is not assigned nearest partner"
assert 50 < lead.partner_latitude < 55, "Latitude is wrong: 50 < %s < 55" % lead.partner_latitude
assert -4 < lead.partner_longitude < -1, "Longitude is wrong: -4 < %s < -1" % lead.partner_longitude
@@ -31,7 +31,10 @@ class crm_lead_forward_to_partner(osv.TransientModel):
values = {}
else:
stage = 'stage_portal_lead_recycle'
message = _('<p>I am not interested by this lead. I %scontacted the lead.</p>') % (not wizard.contacted and 'have not ' or '')
if wizard.contacted:
message = _('<p>I am not interested by this lead. I contacted the lead.</p>')
else:
message = _('<p>I am not interested by this lead. I have not contacted the lead.</p>')
values = {'partner_assigned_id': False}
user = self.pool.get('res.users').browse(cr, uid, uid, context=context)
partner_ids = self.pool.get('res.partner').search(cr, SUPERUSER_ID, [('id', 'child_of', user.partner_id.commercial_partner_id.id)], context=context)
+40
View File
@@ -6,6 +6,22 @@ from openerp.exceptions import UserError
import openerp.addons.decimal_precision as dp
class StockQuantPackage(models.Model):
_inherit = "stock.quant.package"
@api.one
@api.depends('quant_ids', 'children_ids')
def _compute_weight(self):
weight = 0
for quant in self.quant_ids:
weight += quant.qty * quant.product_id.weight
for pack in self.children_ids:
pack._compute_weight()
weight += pack.weight
self.weight = weight
weight = fields.Float(compute='_compute_weight')
class StockPicking(models.Model):
_inherit = 'stock.picking'
@@ -14,6 +30,28 @@ class StockPicking(models.Model):
uom_categ_id = self.env.ref('product.product_uom_categ_kgm').id
return self.env['product.uom'].search([('category_id', '=', uom_categ_id), ('factor', '=', 1)], limit=1)
@api.one
@api.depends('pack_operation_ids')
def _compute_packages(self):
self.ensure_one()
packs = set()
for packop in self.pack_operation_ids:
if packop.result_package_id:
packs.add(packop.result_package_id.id)
elif packop.package_id and not packop.product_id:
packs.add(packop.package_id.id)
self.package_ids = list(packs)
@api.one
@api.depends('pack_operation_ids')
def _compute_bulk_weight(self):
weight = 0.0
uom_obj = self.env['product.uom']
for packop in self.pack_operation_ids:
if packop.product_id and not packop.result_package_id:
weight += uom_obj._compute_qty_obj(packop.product_uom_id , packop.product_qty, packop.product_id.uom_id) * packop.product_id.weight
self.weight_bulk = weight
carrier_price = fields.Float(string="Shipping Cost", readonly=True)
delivery_type = fields.Selection(related='carrier_id.delivery_type', readonly=True)
carrier_id = fields.Many2one("delivery.carrier", string="Carrier")
@@ -22,6 +60,8 @@ class StockPicking(models.Model):
carrier_tracking_ref = fields.Char(string='Carrier Tracking Ref', copy=False)
number_of_packages = fields.Integer(string='Number of Packages', copy=False)
weight_uom_id = fields.Many2one('product.uom', string='Unit of Measure', required=True, readonly="1", help="Unit of measurement for Weight", default=_default_uom)
package_ids = fields.Many2many('stock.quant.package', compute='_compute_packages', string='Packages')
weight_bulk = fields.Float('Bulk Weight', compute='_compute_bulk_weight')
@api.depends('product_id', 'move_lines')
def _cal_weight(self):
+11
View File
@@ -195,6 +195,17 @@
</field>
</record>
<record id="view_quant_package_weight_form" model="ir.ui.view">
<field name="name">stock.quant.package.weight.form</field>
<field name="model">stock.quant.package</field>
<field name="inherit_id" ref="stock.view_quant_package_form"/>
<field name="arch" type="xml">
<field name="company_id" position="before">
<field name="weight"/>
</field>
</field>
</record>
<record id="view_move_withweight_form" model="ir.ui.view">
<field name="name">stock.move.form.weight</field>
<field name="model">stock.move</field>
+1 -1
View File
@@ -2,7 +2,7 @@
<odoo>
<record model="web.tip" id="event_tip_1">
<field name="title"></field>
<field name="description">By clicking here, you can create and manage registration(s) for this event, send emails to attendee(s) and print identification badges.</field>
<field name="description">Create and manage registrations for this event, send emails to attendees and print identification badges.</field>
<field name="action_id" ref="event.action_event_view"/>
<field name="model">event.event</field>
<field name="mode">form</field>
+7 -7
View File
@@ -29,7 +29,7 @@ class event_event(models.Model):
_order = 'date_begin'
name = fields.Char(
string='Name', translate=True, required=True,
string='Event Name', translate=True, required=True,
readonly=False, states={'done': [('readonly', True)]})
active = fields.Boolean(default=True, track_visibility="onchange")
user_id = fields.Many2one(
@@ -60,20 +60,20 @@ class event_event(models.Model):
# Seats and computation
seats_max = fields.Integer(
string='Maximum Available Seats', oldname='register_max',
string='Maximum Attendees Number', oldname='register_max',
readonly=True, states={'draft': [('readonly', False)], 'confirm': [('readonly', False)]},
help="For each event you can define a maximum registration of seats(number of attendees), above this numbers the registrations are not accepted.")
seats_availability = fields.Selection(
[('limited', 'Limited'), ('unlimited', 'Unlimited')],
'Available Seat', required=True, default='unlimited')
'Maximum Attendees', required=True, default='unlimited')
seats_min = fields.Integer(
string='Minimum Reservation of Seats Required', oldname='register_min',
help="For each event you can define a minimum reserved seats(number of attendees), if it does not reach the mentioned registrations the event can not be confirmed (keep 0 to ignore this rule)")
string='Minimum Attendees', oldname='register_min',
help="For each event you can define a minimum reserved seats (number of attendees), if it does not reach the mentioned registrations the event can not be confirmed (keep 0 to ignore this rule)")
seats_reserved = fields.Integer(
oldname='register_current', string='Reserved Seats',
store=True, readonly=True, compute='_compute_seats')
seats_available = fields.Integer(
oldname='register_avail', string='Available Seats',
oldname='register_avail', string='Maximum Attendees',
store=True, readonly=True, compute='_compute_seats')
seats_unconfirmed = fields.Integer(
oldname='register_prospect', string='Unconfirmed Seat Reservations',
@@ -158,7 +158,7 @@ class event_event(models.Model):
('confirm', 'Confirmed'), ('done', 'Done')],
string='Status', default='draft', readonly=True, required=True, copy=False,
help="If event is created, the status is 'Draft'. If event is confirmed for the particular dates the status is set to 'Confirmed'. If the event is over, the status is set to 'Done'. If event is cancelled the status is set to 'Cancelled'.")
auto_confirm = fields.Boolean(string='Auto Confirmation Activated', compute='_compute_auto_confirm')
auto_confirm = fields.Boolean(string='Confirmation not required', compute='_compute_auto_confirm')
@api.one
def _compute_auto_confirm(self):
+14 -6
View File
@@ -101,10 +101,18 @@
<page name="registrations" string="Registrations">
<group>
<group>
<field name="auto_confirm" invisible="1"/>
<field name="seats_min"/>
<field name="seats_availability" widget='radio'/>
<field name="seats_max" attrs="{'invisible': [('seats_availability', '=', 'unlimited')], 'required': [('seats_availability', '=', 'limited')]}"/>
<label for="seats_availability"/>
<div>
<field name="seats_availability" widget='radio'/>
<span attrs="{'invisible': [('seats_availability', '=', 'unlimited')]}" class="oe_read_only">
to
</span>
<field name="seats_max" attrs="{'invisible': [('seats_availability', '=', 'unlimited')], 'required': [('seats_availability', '=', 'limited')]}"/>
</div>
</group>
<group>
<field name="auto_confirm" groups="base.group_no_one"/>
</group>
</group>
</page>
@@ -198,11 +206,11 @@
</div>
<h4>
<a name="%(act_event_registration_from_event)d" type="action">
<t t-esc="record.seats_expected.raw_value"> Attendees Expected</t>
<t t-esc="record.seats_expected.raw_value"> Attendees expected</t>
</a>
<t t-if="(record.seats_reserved.raw_value + record.seats_used.raw_value) > 0 "><br/>
<t t-esc="record.seats_reserved.raw_value + record.seats_used.raw_value"/> Attendees Confirmed
<a name="action_event_registration_report" type="object" >&#40;Report&#41;</a>
<t t-esc="record.seats_reserved.raw_value + record.seats_used.raw_value"/> Attendees confirmed
<a name="action_event_registration_report" type="object" >&#40;stats&#41;</a>
</t>
</h4>
</div>
+1
View File
@@ -32,6 +32,7 @@ You can manage:
'mail',
'resource',
'web_kanban',
'web_tip',
],
'data': [
'security/hr_security.xml',
@@ -1,37 +0,0 @@
<?xml version="1.0"?>
<odoo>
<data>
<record id="view_hr_applicant_document_search_inherit" model="ir.ui.view">
<field name="name">hr.applicant.document.search.inherit</field>
<field name="model">hr.applicant</field>
<field name="inherit_id" ref="hr_recruitment.view_crm_case_jobs_filter"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='partner_name']" position="attributes">
<attribute name="filter_domain">['|','|','|','|',('partner_id','ilike',self),('partner_name','ilike',self),('email_from','ilike',self),('name', 'ilike', self),('attachment_ids.index_content', 'ilike', self)]</attribute>
</xpath>
</field>
</record>
<record model="ir.actions.act_window" id="hr_applicant_resumes">
<field name="name">Resumes and Letters</field>
<field name="res_model">ir.attachment</field>
<field name="view_type">form</field>
<field name="view_mode">kanban,tree,form</field>
<field name="view_id" ref="mail.view_document_file_kanban"/>
<field name="domain">[('res_model','=','hr.applicant')]</field>
<field name="context" eval="{'default_res_model': 'hr.applicant'}"/>
<field name="help" type="html">
<p>
Search through resumes and motivation letters.
</p>
</field>
</record>
<menuitem
name="Resumes and Letters"
parent="hr_recruitment.menu_hr_recruitment_root"
id="menu_crm_case_categ0_act_job02" action="hr_applicant_resumes" sequence="3"/>
</data>
</odoo>
+3 -3
View File
@@ -1,14 +1,14 @@
# -*- coding: utf-8 -*-
{
'name': 'Track Employees Equipment',
'name': 'IT Assets',
'version': '1.0',
'sequence': 125,
'description': """
Track employees' equipment and manage its allocation """,
Track employees' IT assets: computers, printers, software licenses and manage makntenance requests.""",
'author': 'Odoo S.A.',
'depends': ['hr'],
'summary': 'Internal Equipments, Allocation Tracking',
'summary': 'Equipments, IT Assets, Internal Hardware',
'data': [
'security/hr_equipment.xml',
'security/ir.model.access.csv',
@@ -17,11 +17,13 @@
<field name="name">Repaired</field>
<field name="sequence" eval="3" />
<field name="fold" eval="True" />
<field name="done" eval="True" />
</record>
<record id="stage_4" model="hr.equipment.stage">
<field name="name">Scrap</field>
<field name="sequence" eval="4" />
<field name="fold" eval="True" />
<field name="done" eval="True" />
</record>
<!-- email alias for maintenance requests -->
@@ -68,5 +70,15 @@
<field name="relation_field">category_id</field>
</record>
<record id="hr_equipment_computer" model="hr.equipment.category">
<field name="name">Computers</field>
</record>
<record id="hr_equipment_software" model="hr.equipment.category">
<field name="name">Software</field>
</record>
<record id="hr_equipment_printer" model="hr.equipment.category">
<field name="name">Printers</field>
</record>
</data>
</odoo>
@@ -3,23 +3,11 @@
<data noupdate="1">
<!-- Equipment categories -->
<record id="hr_equipment_computer" model="hr.equipment.category">
<field name="name">Computers</field>
<field name="user_id" ref="base.user_root"/>
</record>
<record id="hr_equipment_monitor" model="hr.equipment.category">
<field name="name">Monitors</field>
<field name="user_id" ref="base.user_root"/>
<field name="color">3</field>
</record>
<record id="hr_equipment_software" model="hr.equipment.category">
<field name="name">Softwares</field>
<field name="user_id" ref="base.user_root"/>
</record>
<record id="hr_equipment_printer" model="hr.equipment.category">
<field name="name">Printers</field>
<field name="user_id" ref="base.user_root"/>
</record>
<record id="hr_equipment_phone" model="hr.equipment.category">
<field name="name">Phones</field>
<field name="user_id" ref="base.user_root"/>
+21 -15
View File
@@ -9,19 +9,20 @@ class HrEquipmentStage(models.Model):
""" Model for case stages. This models the main stages of a Maintenance Request management flow. """
_name = 'hr.equipment.stage'
_description = 'Equipment Stage'
_description = 'Maintenance Stage'
_order = 'sequence, id'
name = fields.Char('Name', required=True, translate=True)
sequence = fields.Integer('Sequence', default=20)
fold = fields.Boolean('Folded in Recruitment Pipe')
done = fields.Boolean('Request Done')
class HrEquipmentCategory(models.Model):
_name = 'hr.equipment.category'
_inherits = {"mail.alias": "alias_id"}
_inherit = ['mail.thread']
_description = 'Equipment Category'
_description = 'Asset Category'
@api.one
@api.depends('equipment_ids')
@@ -34,7 +35,7 @@ class HrEquipmentCategory(models.Model):
note = fields.Text('Comments', translate=True)
equipment_ids = fields.One2many('hr.equipment', 'category_id', string='Equipments', copy=False)
equipment_count = fields.Integer(string="Equipment", compute='_compute_equipment_count')
maintenance_ids = fields.One2many('hr.equipment.request', 'category_id', copy=False, domain=[('stage_id.fold', '=', False)])
maintenance_ids = fields.One2many('hr.equipment.request', 'category_id', copy=False)
maintenance_count = fields.Integer(string="Maintenance", compute='_compute_maintenance_count')
alias_id = fields.Many2one(
'mail.alias', 'Alias', ondelete='cascade', required=True,
@@ -75,7 +76,7 @@ class HrEquipmentCategory(models.Model):
class HrEquipment(models.Model):
_name = 'hr.equipment'
_inherit = ['mail.thread']
_description = 'Equipment'
_description = 'IT Assets'
@api.multi
def _track_subtype(self, init_values):
@@ -104,32 +105,37 @@ class HrEquipment(models.Model):
recs = self.search([('name', operator, name)] + args, limit=limit)
return recs.name_get()
name = fields.Char('Name', required=True, translate=True)
name = fields.Char('Asset Name', required=True, translate=True)
user_id = fields.Many2one('res.users', string='Technician', track_visibility='onchange')
employee_id = fields.Many2one('hr.employee', string='Assigned to Employee', track_visibility='onchange')
department_id = fields.Many2one('hr.department', string='Assigned to Department', track_visibility='onchange')
category_id = fields.Many2one('hr.equipment.category', string='Equipment Category', track_visibility='onchange')
category_id = fields.Many2one('hr.equipment.category', string='Asset Category', track_visibility='onchange')
partner_id = fields.Many2one('res.partner', string='Vendor', domain="[('supplier', '=', 1)]")
partner_ref = fields.Char('Vendor Reference')
location = fields.Char('Location')
model = fields.Char('Model')
serial_no = fields.Char('Serial Number', copy=False)
assign_date = fields.Date('Assigned Date', track_visibility='onchange')
cost = fields.Float('Cost')
note = fields.Text('Note')
warranty = fields.Date('Warranty')
color = fields.Integer('Color Index')
scrap_date = fields.Date('Scrap Date')
equipment_assign_to = fields.Selection(
[('department', 'By Department'), ('employee', 'By Employee')],
string='Allocate To',
help='By Employee: equipment assigned to individual Employee, By Department: equipment assigned to group of employees in department',
[('department', 'Department'), ('employee', 'Employee')],
string='Used By',
required=True,
default='employee')
maintenance_ids = fields.One2many('hr.equipment.request', 'equipment_id', domain=[('stage_id.fold', '=', False)])
maintenance_count = fields.Integer(compute='_compute_maintenance_count', string="Maintenance")
maintenance_ids = fields.One2many('hr.equipment.request', 'equipment_id')
maintenance_count = fields.Integer(compute='_compute_maintenance_count', string="Maintenance", store=True)
maintenance_open_count = fields.Integer(compute='_compute_maintenance_count', string="Current Maintenance", store=True)
@api.one
@api.depends('maintenance_ids')
@api.depends('maintenance_ids.stage_id.done')
def _compute_maintenance_count(self):
self.maintenance_count = len(self.maintenance_ids)
self.maintenance_open_count = len(self.maintenance_ids.filtered(lambda x: not x.stage_id.done))
@api.onchange('equipment_assign_to')
def _onchange_equipment_assign_to(self):
@@ -144,7 +150,7 @@ class HrEquipment(models.Model):
self.user_id = self.category_id.user_id
_sql_constraints = [
('serial_no', 'unique(serial_no)', "The serial number of this equipment must be unique !"),
('serial_no', 'unique(serial_no)', "Another asset already exists with this serial number!"),
]
@api.model
@@ -205,7 +211,7 @@ class HrEquipment(models.Model):
class HrEquipmentRequest(models.Model):
_name = 'hr.equipment.request'
_inherit = ['mail.thread']
_description = 'Equipment Request'
_description = 'Maintenance Requests'
@api.returns('self')
def _default_employee_get(self):
@@ -230,7 +236,7 @@ class HrEquipmentRequest(models.Model):
employee_id = fields.Many2one('hr.employee', string='Employee', default=_default_employee_get)
department_id = fields.Many2one('hr.department', string='Department')
category_id = fields.Many2one('hr.equipment.category', string='Category')
equipment_id = fields.Many2one('hr.equipment', string='Equipment', select=True)
equipment_id = fields.Many2one('hr.equipment', string='Asset', select=True)
user_id = fields.Many2one('res.users', string='Assigned to', track_visibility='onchange')
stage_id = fields.Many2one('hr.equipment.stage', string='Stage', track_visibility='onchange', default=_default_stage)
priority = fields.Selection([('0', 'Very Low'), ('1', 'Low'), ('2', 'Normal'), ('3', 'High')], string='Priority')
@@ -18,14 +18,14 @@
<!-- Rules -->
<record id="hr_equipment_request_rule_user" model="ir.rule">
<field name="name">Employee is allowed to see its own maintenance requests</field>
<field name="name">Employees are allowed to access their own maintenance requests</field>
<field name="model_id" ref="model_hr_equipment_request"/>
<field name="domain_force">['|', ('user_id.id', '=', user.id), ('employee_id.user_id.id', '=', user.id)]</field>
<field name="groups" eval="[(4, ref('base.group_user'))]"/>
</record>
<record id="hr_equipment_rule_user" model="ir.rule">
<field name="name">Employee is allowed to see its own equipments</field>
<field name="name">Employees are allowed to access their own equipments</field>
<field name="model_id" ref="model_hr_equipment"/>
<field name="domain_force">[('employee_id.user_id.id', '=', user.id)]</field>
<field name="groups" eval="[(4, ref('base.group_user'))]"/>
@@ -24,6 +24,7 @@ class TestHrEquipment(TransactionCase):
email="empuser@yourcompany.example.com",
groups_id=[(6, 0, [res_hr_user.id])]
))
self.env.ref('hr.employee_qdp').write({'user_id': self.hr_user.id})
self.hr_manager = self.user.create(dict(
name="HR Manager",
@@ -40,7 +41,7 @@ class TestHrEquipment(TransactionCase):
equipment_01 = self.equipment.sudo(self.hr_manager).create({
'name': 'Samsung Monitor "15',
'category_id': self.ref('hr_equipment.hr_equipment_monitor'),
'employee_id': self.ref('hr.employee_al'),
'employee_id': self.ref('hr.employee_qdp'),
'user_id': self.ref('base.user_root'),
'assign_date': time.strftime('%Y-%m-%d'),
'serial_no': 'MT/127/18291015',
@@ -199,6 +199,10 @@
<field name="model">hr.equipment</field>
<field name="arch" type="xml">
<form string="Equipments">
<header>
<field name="category_id" widget="statusbar" clickable="True"
options="{'fold_field': 'fold'}"/>
</header>
<sheet>
<div class="oe_button_box" name="button_box">
<button name="%(hr_equipment_request_action_from_equipment)d"
@@ -209,7 +213,7 @@
</button>
</div>
<div class="oe_title">
<label for="name" class="oe_edit_only" string="Name"/>
<label for="name" class="oe_edit_only"/>
<h1><field name="name" string="Name" placeholder="Equipment Name"/></h1>
<label for="serial_no" class="oe_edit_only"/>
<field name="serial_no"/>
@@ -232,10 +236,16 @@
<field name="note"/>
</page>
<page string="Product Information">
<group col="4">
<field name="partner_id"/>
<field name="cost" groups="base.group_hr_user"/>
<field name="model"/>
<group>
<group>
<field name="partner_id"/>
<field name="partner_ref"/>
<field name="model"/>
</group><group>
<field name="cost" groups="base.group_hr_user"/>
<field name="warranty"/>
<field name="location"/>
</group>
</group>
</page>
</notebook>
@@ -260,6 +270,7 @@
<field name="serial_no"/>
<field name="model"/>
<field name="maintenance_ids"/>
<field name="maintenance_open_count"/>
<templates>
<t t-name="kanban-tooltip">
<ul class="oe_kanban_tooltip">
@@ -291,10 +302,8 @@
<div class="oe_kanban_bottom_right">
<img t-att-src="kanban_image('hr.employee', 'image_small', record.employee_id.raw_value)" t-att-title="record.employee_id.value" width="27" height="27" class="oe_kanban_avatar"/>
</div>
<div class="oe_kanban_footer_left mt4">
<a t-if="record.maintenance_ids.raw_value" type="action" name="%(hr_equipment_request_action_from_equipment)d">
<t t-raw="record.maintenance_ids.raw_value.length"/> Maintenance Request
</a>
<div class="oe_kanban_footer_left mt4 label label-danger" t-if="record.maintenance_open_count.raw_value" >
<t t-raw="record.maintenance_open_count.raw_value"/> Request
</div>
</div>
<div class="oe_clear"></div>
@@ -328,17 +337,16 @@
<field name="model">hr.equipment</field>
<field name="arch" type="xml">
<search string="Search">
<field name="name"/>
<field name="serial_no"/>
<field name="name" filter_domain="['|','|','|',('name','ilike',self),('model','ilike',self),('serial_no','ilike',self),('partner_ref', 'ilike', self)]"/>
<field name="category_id"/>
<field name="employee_id"/>
<field name="department_id"/>
<field name="model"/>
<filter string="New" help="Unassigned" domain="[('employee_id', '=', False), ('department_id', '=', False)]"/>
<filter string="To Do" help="Under Maintenance" domain="[('maintenance_ids', '!=', False), ('maintenance_ids.stage_id.fold', '=', False)]"/>
<filter string="Assigned" domain="['|', ('employee_id', '!=', False), ('department_id', '!=', False)]"/>
<filter string="Under Maintenance" domain="[('maintenance_open_count', '&gt;', 0)]"/>
<separator/>
<filter string="My Equipments" domain="['|', ('employee_id.user_id', '=', uid), ('department_id.manager_id.user_id', '=', uid)]"/>
<filter string="Assigned" domain="['|', ('employee_id', '!=', False), ('department_id', '!=', False)]"/>
<filter string="Available" domain="[('employee_id', '=', False), ('department_id', '=', False)]"/>
<separator/>
<filter string="My Assets" domain="[('employee_id.user_id', '=', uid)]"/>
<separator/>
<filter string="Important Messages" name="message_needaction" domain="[('message_needaction','=',True)]"/>
<group expand='0' string='Group by...'>
@@ -354,7 +362,7 @@
</record>
<record id="hr_equipment_action" model="ir.actions.act_window">
<field name="name">Equipments</field>
<field name="name">IT Assets</field>
<field name="res_model">hr.equipment</field>
<field name="view_mode">kanban,tree,form</field>
<field name="view_id" ref="hr_equipment_view_kanban"/>
@@ -362,8 +370,8 @@
<p class="oe_view_nocontent_create">
Click to add a new equipment.
</p><p>
This application helps you to track all equipment allocated to employees.
Create some laptop, printer or phone and link each equipment to an employee or departement.
This application helps you to track equipments used by employees.
Create some laptops, printers or phones and link each asset to an employee or departement.
You will manage allocations, issues and maintenance of equipment.
</p>
</field>
@@ -371,7 +379,7 @@
<!-- hr.equiment : actions -->
<record id="hr_equipment_action_from_category_form" model="ir.actions.act_window">
<field name="name">Equipments</field>
<field name="name">Assets</field>
<field name="res_model">hr.equipment</field>
<field name="view_mode">kanban,tree,form</field>
<field name="search_view_id" ref="hr_equipment_view_search"/>
@@ -384,7 +392,7 @@
<p class="oe_view_nocontent_create">
Click to add a new Engine.
</p><p>
This application helps you to track all equipment allocated to employees.
This application helps you to track equipments used by employees.
Create some laptop, printer or phone and link each equipment to an employee or departement.
You will manage allocations, issues and mainteannce of equipment.
</p>
@@ -403,7 +411,7 @@
class="oe_stat_button"
icon="fa-laptop"
type="action">
<field string="Equipment" name="equipment_count" widget="statinfo"/>
<field string="Assets" name="equipment_count" widget="statinfo"/>
</button>
<button name="%(hr_equipment_request_action_link)d"
type="action"
@@ -468,7 +476,7 @@
<!-- hr.equipment.category : actions -->
<record id="hr_equipment_category_action" model="ir.actions.act_window">
<field name="name">Equipment Categories</field>
<field name="name">Asset Categories</field>
<field name="res_model">hr.equipment.category</field>
<field name="view_mode">tree,form</field>
<field name="view_id" ref="hr_equipment_category_view_tree"/>
@@ -498,6 +506,7 @@
<field name="sequence" widget="handle"/>
<field name="name"/>
<field name="fold"/>
<field name="done"/>
</tree>
</field>
</record>
@@ -520,7 +529,7 @@
<!-- Menu items hierachy -->
<menuitem
id="menu_equipment_title"
name="Equipments"
name="IT Assets"
web_icon="hr_equipment,static/description/icon.png"
sequence="110"/>
@@ -537,15 +546,15 @@
parent="menu_equipment_title"
action="hr_equipment_request_action"
groups="base.group_hr_manager,base.group_hr_user,base.group_user"
sequence="1"/>
sequence="2"/>
<menuitem
id="menu_hr_equipment_form"
name="Equipments"
name="Assets"
parent="menu_equipment_title"
action="hr_equipment_action"
groups="base.group_hr_manager,base.group_hr_user,base.group_user"
sequence="2"/>
sequence="1"/>
<menuitem
id="menu_equipment_global_settings"
@@ -556,7 +565,7 @@
<menuitem
id="menu_equipment_cat"
name="Equipment Categories"
name="Asset Categories"
parent="menu_equipment_configuration"
action="hr_equipment_category_action"
groups="base.group_no_one"
@@ -573,7 +582,7 @@
<data noupdate="1">
<!-- After installation of the module, open the related menu -->
<record id="action_client_hr_equipment_menu" model="ir.actions.client">
<field name="name">Open HR Menu</field>
<field name="name">Open Assets Menu</field>
<field name="tag">reload</field>
<field name="params" eval="{'menu_id': ref('menu_equipment_title')}"/>
</record>
@@ -12,6 +12,7 @@
'product_uom_id': ref('product.product_uom_hour'),
'account_id': ref('analytic.analytic_administratif'),
'amount': -60.00,
'is_timesheet': True,
}
self._update(cr, uid, 'account.analytic.line', 'hr_timesheet', vals, 'working_hours_requirements')
vals = {
@@ -23,6 +24,7 @@
'product_uom_id': ref('product.product_uom_hour'),
'account_id': ref('analytic.analytic_administratif'),
'amount': -30.00,
'is_timesheet': True,
}
self._update(cr, uid, 'account.analytic.line', 'hr_timesheet', vals, 'working_hours_design')
vals = {
@@ -34,6 +36,7 @@
'product_uom_id': ref('product.product_uom_hour'),
'account_id': ref('analytic.analytic_administratif'),
'amount': -90.00,
'is_timesheet': True,
}
self._update(cr, uid, 'account.analytic.line', 'hr_timesheet', vals, 'working_hours_coding')
vals = {
@@ -45,6 +48,7 @@
'product_uom_id': ref('product.product_uom_hour'),
'account_id': ref('analytic.analytic_administratif'),
'amount': -30.00,
'is_timesheet': True,
}
self._update(cr, uid, 'account.analytic.line', 'hr_timesheet', vals, 'working_hours_testing')
vals = {
@@ -56,5 +60,6 @@
'product_uom_id': ref('product.product_uom_hour'),
'account_id': ref('analytic.analytic_administratif'),
'amount': -30.00,
'is_timesheet': True,
}
self._update(cr, uid, 'account.analytic.line', 'hr_timesheet', vals, 'working_hours_maintenance')
@@ -139,7 +139,7 @@
<t t-set="info" t-value="request.env['im_livechat.channel'].match_rules(request, channel)"/>
</t>
<t t-if="info" t-translate="off">
<t t-if="info" t-translation="off">
document.addEventListener("DOMContentLoaded", function(event) {
odoo.define('web.session', function (require) {
+1 -1
View File
@@ -4,7 +4,7 @@
# Copyright (c) 2011 Cubic ERP - Teradata SAC. (http://cubicerp.com)
{
'name': 'Argentina Localization Chart Account',
'name': 'Argentina - Accounting',
'version': '1.0',
'description': """
Argentinian accounting chart and tax localization.
+1 -1
View File
@@ -4,7 +4,7 @@
# Copyright (c) 2011 Cubic ERP - Teradata SAC. (https://cubicerp.com).
{
"name": "Bolivia Localization Chart Account",
"name": "Bolivia - Accounting",
"version": "1.0",
"description": """
Bolivian accounting chart and tax localization.
+1 -1
View File
@@ -179,7 +179,7 @@
<field name="type_tax_use">sale</field>
<field name="refund_account_id" ref="ch_coa_2200"/>
<field name="account_id" ref="ch_coa_2200"/>
<field name="tag_ids" eval="[(6,0,[ref('tag_3_8_invest')])]"/>
<field name="tag_ids" eval="[(6,0,[ref('tag_0%')])]"/>
</record>
<record model="account.tax.template" id="vat_O_exclude">
<field name="name">TVA 0% exclue</field>
+1 -1
View File
@@ -4,7 +4,7 @@
# Copyright (c) 2011 Cubic ERP - Teradata SAC. (http://cubicerp.com).
{
'name': 'Chile Localization Chart Account',
'name': 'Chile - Accounting',
'version': '1.0',
'description': """
Chilean accounting chart and tax localization.
+18 -18
View File
@@ -1,19 +1,19 @@
id,name,description,type_tax_use,amount_type,amount,sequence,refund_account_id:id,account_id:id,chart_template_id:id,tag_ids:id
default_chart_a_tax_1,10% Honorarios por Servicios Independientes,R-ISR 10%,purchase,percent,-10,1,default_chart_a_account_712,default_chart_a_account_712,default_chart_a,
default_chart_a_tax_2,ITBIS Exento en compras,C-EXENTA,purchase,percent,0,1,,,default_chart_a,,
default_chart_a_tax_3,ITBIS 8% Ventas,V-ITBIS 8%,sale,percent,11,1,,,default_chart_a,,
default_chart_a_tax_4,ITBIS 8% Compras,C-ITBIS 8%,purchase,percent,11,1,,,default_chart_a,,
default_chart_a_tax_5,ITBIS 11% Ventas,V-ITBIS 11%,sale,percent,11,1,,,default_chart_a,,
default_chart_a_tax_6,ITBIS 11% Compras,C-ITBIS 11%,purchase,percent,11,1,,,default_chart_a,,
default_chart_a_tax_7,ITBIS Exento en ventas,V-EXENTA,sale,percent,18,1,,,default_chart_a,tax_V-EXENTA,tax_R-ITBIS_18%
default_chart_a_tax_8,ITBIS 18% Compras,C-ITBIS 18%,purchase,percent,18,1,default_chart_a_account_53,default_chart_a_account_53,default_chart_a,tax_C-ITBIS_18%,
default_chart_a_tax_9,ITBIS 18% Compras Servicios,CS-ITBIS 18%,purchase,percent,18,1,default_chart_a_account_57,default_chart_a_account_57,default_chart_a,tax_CS-ITBIS_18%,
default_chart_a_tax_10,ITBIS 18% Compras Importaciones,IMP-ITBIS 18%,purchase,percent,18,1,default_chart_a_account_56,default_chart_a_account_56,default_chart_a,tax_IMP-ITBIS_18%,
default_chart_a_tax_12,2% Otras Retenciones (Norma 07-2007),R-ISR 2%,purchase,percent,-2,1,,,default_chart_a,,
default_chart_a_tax_13,18% ITBIS Retenido,R-ITBIS 18%,purchase,percent,-18,1,default_chart_a_account_163,default_chart_a_account_163,default_chart_a,tax_R-ITBIS_18%,
default_chart_a_tax_14,ITBIS 18% Ventas,V-ITBIS 18%,sale,percent,18,10,default_chart_a_account_71,default_chart_a_account_71,default_chart_a,tax_V-ITBIS_18%,
default_chart_a_tax_15,ITBIS 18% Compras Includo,C-ITBIS 18% Incluido,purchase,percent,18,1,default_chart_a_account_53,default_chart_a_account_53,default_chart_a,tax_C-ITBIS_18%_Incluido,
default_chart_a_tax_16,ITBIS 18% Compras Servicios Incluido,CS-ITBIS 18% Incluido,purchase,percent,18,1,default_chart_a_account_57,,default_chart_a,tax_CS-ITBIS_18%_Incluido,
default_chart_a_tax_19,ISC Telecomunicacones,TELE-ISC,purchase,percent,10,1,default_chart_a_account_529,,default_chart_a,,
default_chart_a_tax_20,CDT Telecomunicacones,TELE-CDT,purchase,percent,2,1,default_chart_a_account_529,,default_chart_a,,
default_chart_a_tax_23,10% Retencion por alquileres,R-Alquileres 10%,purchase,percent,-10,1,default_chart_a_account_712,default_chart_a_account_712,default_chart_a,,
default_chart_a_tax_1,10% Honorarios por Servicios Independientes,R-ISR 10%,purchase,percent,-10,1,default_chart_a_account_712,default_chart_a_account_712,default_chart_a,tag_R_ISR_10
default_chart_a_tax_2,ITBIS Exento en compras,C-EXENTA,purchase,percent,0,1,,,default_chart_a,tag_C_EXENTA
default_chart_a_tax_3,ITBIS 8% Ventas,V-ITBIS 8%,sale,percent,11,1,,,default_chart_a,tag_V_ITBIS_8
default_chart_a_tax_4,ITBIS 8% Compras,C-ITBIS 8%,purchase,percent,11,1,,,default_chart_a,tag_C_ITBIS_8
default_chart_a_tax_5,ITBIS 11% Ventas,V-ITBIS 11%,sale,percent,11,1,,,default_chart_a,tag_V_ITBIS_11
default_chart_a_tax_6,ITBIS 11% Compras,C-ITBIS 11%,purchase,percent,11,1,,,default_chart_a,tag_C_ITBIS_11
default_chart_a_tax_7,ITBIS Exento en ventas,V-EXENTA,sale,percent,18,1,,,default_chart_a,tag_V_EXENTA
default_chart_a_tax_8,ITBIS 18% Compras,C-ITBIS 18%,purchase,percent,18,1,default_chart_a_account_53,default_chart_a_account_53,default_chart_a,tag_C_ITBIS_18
default_chart_a_tax_9,ITBIS 18% Compras Servicios,CS-ITBIS 18%,purchase,percent,18,1,default_chart_a_account_57,default_chart_a_account_57,default_chart_a,tag_CS_ITBIS_18
default_chart_a_tax_10,ITBIS 18% Compras Importaciones,IMP-ITBIS 18%,purchase,percent,18,1,default_chart_a_account_56,default_chart_a_account_56,default_chart_a,tag_IMP_ITBIS_18
default_chart_a_tax_12,2% Otras Retenciones (Norma 07-2007),R-ISR 2%,purchase,percent,-2,1,,,default_chart_a,tag_R_ISR_2
default_chart_a_tax_13,18% ITBIS Retenido,R-ITBIS 18%,purchase,percent,-18,1,default_chart_a_account_163,default_chart_a_account_163,default_chart_a,tag_R_ITBIS_18
default_chart_a_tax_14,ITBIS 18% Ventas,V-ITBIS 18%,sale,percent,18,10,default_chart_a_account_71,default_chart_a_account_71,default_chart_a,tag_V_ITBIS_18
default_chart_a_tax_15,ITBIS 18% Compras Includo,C-ITBIS 18% Incluido,purchase,percent,18,1,default_chart_a_account_53,default_chart_a_account_53,default_chart_a,tag_C_ITBIS_18_Incluido
default_chart_a_tax_16,ITBIS 18% Compras Servicios Incluido,CS-ITBIS 18% Incluido,purchase,percent,18,1,default_chart_a_account_57,,default_chart_a,tag_CS_ITBIS_18_Incluido
default_chart_a_tax_19,ISC Telecomunicacones,TELE-ISC,purchase,percent,10,1,default_chart_a_account_529,,default_chart_a,tag_TELE_ISC
default_chart_a_tax_20,CDT Telecomunicacones,TELE-CDT,purchase,percent,2,1,default_chart_a_account_529,,default_chart_a,tag_TELE_CDT
default_chart_a_tax_23,10% Retencion por alquileres,R-Alquileres 10%,purchase,percent,-10,1,default_chart_a_account_712,default_chart_a_account_712,default_chart_a,tag_R_Alquileres_10
1 id,name,description,type_tax_use,amount_type,amount,sequence,refund_account_id:id,account_id:id,chart_template_id:id,tag_ids:id id name description type_tax_use amount_type amount sequence refund_account_id:id account_id:id chart_template_id:id tag_ids:id
2 default_chart_a_tax_1,10% Honorarios por Servicios Independientes,R-ISR 10%,purchase,percent,-10,1,default_chart_a_account_712,default_chart_a_account_712,default_chart_a, default_chart_a_tax_1 10% Honorarios por Servicios Independientes R-ISR 10% purchase percent -10 1 default_chart_a_account_712 default_chart_a_account_712 default_chart_a tag_R_ISR_10
3 default_chart_a_tax_2,ITBIS Exento en compras,C-EXENTA,purchase,percent,0,1,,,default_chart_a,, default_chart_a_tax_2 ITBIS Exento en compras C-EXENTA purchase percent 0 1 default_chart_a tag_C_EXENTA
4 default_chart_a_tax_3,ITBIS 8% Ventas,V-ITBIS 8%,sale,percent,11,1,,,default_chart_a,, default_chart_a_tax_3 ITBIS 8% Ventas V-ITBIS 8% sale percent 11 1 default_chart_a tag_V_ITBIS_8
5 default_chart_a_tax_4,ITBIS 8% Compras,C-ITBIS 8%,purchase,percent,11,1,,,default_chart_a,, default_chart_a_tax_4 ITBIS 8% Compras C-ITBIS 8% purchase percent 11 1 default_chart_a tag_C_ITBIS_8
6 default_chart_a_tax_5,ITBIS 11% Ventas,V-ITBIS 11%,sale,percent,11,1,,,default_chart_a,, default_chart_a_tax_5 ITBIS 11% Ventas V-ITBIS 11% sale percent 11 1 default_chart_a tag_V_ITBIS_11
7 default_chart_a_tax_6,ITBIS 11% Compras,C-ITBIS 11%,purchase,percent,11,1,,,default_chart_a,, default_chart_a_tax_6 ITBIS 11% Compras C-ITBIS 11% purchase percent 11 1 default_chart_a tag_C_ITBIS_11
8 default_chart_a_tax_7,ITBIS Exento en ventas,V-EXENTA,sale,percent,18,1,,,default_chart_a,tax_V-EXENTA,tax_R-ITBIS_18% default_chart_a_tax_7 ITBIS Exento en ventas V-EXENTA sale percent 18 1 default_chart_a tag_V_EXENTA
9 default_chart_a_tax_8,ITBIS 18% Compras,C-ITBIS 18%,purchase,percent,18,1,default_chart_a_account_53,default_chart_a_account_53,default_chart_a,tax_C-ITBIS_18%, default_chart_a_tax_8 ITBIS 18% Compras C-ITBIS 18% purchase percent 18 1 default_chart_a_account_53 default_chart_a_account_53 default_chart_a tag_C_ITBIS_18
10 default_chart_a_tax_9,ITBIS 18% Compras Servicios,CS-ITBIS 18%,purchase,percent,18,1,default_chart_a_account_57,default_chart_a_account_57,default_chart_a,tax_CS-ITBIS_18%, default_chart_a_tax_9 ITBIS 18% Compras Servicios CS-ITBIS 18% purchase percent 18 1 default_chart_a_account_57 default_chart_a_account_57 default_chart_a tag_CS_ITBIS_18
11 default_chart_a_tax_10,ITBIS 18% Compras Importaciones,IMP-ITBIS 18%,purchase,percent,18,1,default_chart_a_account_56,default_chart_a_account_56,default_chart_a,tax_IMP-ITBIS_18%, default_chart_a_tax_10 ITBIS 18% Compras Importaciones IMP-ITBIS 18% purchase percent 18 1 default_chart_a_account_56 default_chart_a_account_56 default_chart_a tag_IMP_ITBIS_18
12 default_chart_a_tax_12,2% Otras Retenciones (Norma 07-2007),R-ISR 2%,purchase,percent,-2,1,,,default_chart_a,, default_chart_a_tax_12 2% Otras Retenciones (Norma 07-2007) R-ISR 2% purchase percent -2 1 default_chart_a tag_R_ISR_2
13 default_chart_a_tax_13,18% ITBIS Retenido,R-ITBIS 18%,purchase,percent,-18,1,default_chart_a_account_163,default_chart_a_account_163,default_chart_a,tax_R-ITBIS_18%, default_chart_a_tax_13 18% ITBIS Retenido R-ITBIS 18% purchase percent -18 1 default_chart_a_account_163 default_chart_a_account_163 default_chart_a tag_R_ITBIS_18
14 default_chart_a_tax_14,ITBIS 18% Ventas,V-ITBIS 18%,sale,percent,18,10,default_chart_a_account_71,default_chart_a_account_71,default_chart_a,tax_V-ITBIS_18%, default_chart_a_tax_14 ITBIS 18% Ventas V-ITBIS 18% sale percent 18 10 default_chart_a_account_71 default_chart_a_account_71 default_chart_a tag_V_ITBIS_18
15 default_chart_a_tax_15,ITBIS 18% Compras Includo,C-ITBIS 18% Incluido,purchase,percent,18,1,default_chart_a_account_53,default_chart_a_account_53,default_chart_a,tax_C-ITBIS_18%_Incluido, default_chart_a_tax_15 ITBIS 18% Compras Includo C-ITBIS 18% Incluido purchase percent 18 1 default_chart_a_account_53 default_chart_a_account_53 default_chart_a tag_C_ITBIS_18_Incluido
16 default_chart_a_tax_16,ITBIS 18% Compras Servicios Incluido,CS-ITBIS 18% Incluido,purchase,percent,18,1,default_chart_a_account_57,,default_chart_a,tax_CS-ITBIS_18%_Incluido, default_chart_a_tax_16 ITBIS 18% Compras Servicios Incluido CS-ITBIS 18% Incluido purchase percent 18 1 default_chart_a_account_57 default_chart_a tag_CS_ITBIS_18_Incluido
17 default_chart_a_tax_19,ISC Telecomunicacones,TELE-ISC,purchase,percent,10,1,default_chart_a_account_529,,default_chart_a,, default_chart_a_tax_19 ISC Telecomunicacones TELE-ISC purchase percent 10 1 default_chart_a_account_529 default_chart_a tag_TELE_ISC
18 default_chart_a_tax_20,CDT Telecomunicacones,TELE-CDT,purchase,percent,2,1,default_chart_a_account_529,,default_chart_a,, default_chart_a_tax_20 CDT Telecomunicacones TELE-CDT purchase percent 2 1 default_chart_a_account_529 default_chart_a tag_TELE_CDT
19 default_chart_a_tax_23,10% Retencion por alquileres,R-Alquileres 10%,purchase,percent,-10,1,default_chart_a_account_712,default_chart_a_account_712,default_chart_a,, default_chart_a_tax_23 10% Retencion por alquileres R-Alquileres 10% purchase percent -10 1 default_chart_a_account_712 default_chart_a_account_712 default_chart_a tag_R_Alquileres_10
+58 -8
View File
@@ -5,45 +5,95 @@
<!-- Account Tags -->
<record id="tax_V-EXENTA" model="account.account.tag">
<record id="tag_R_ISR_10" model="account.account.tag">
<field name="name">R-ISR 10%</field>
<field name="applicability">taxes</field>
</record>
<record id="tag_C_EXENTA" model="account.account.tag">
<field name="name">C-EXENTA</field>
<field name="applicability">taxes</field>
</record>
<record id="tag_V_ITBIS_8" model="account.account.tag">
<field name="name">V-ITBIS 8%</field>
<field name="applicability">taxes</field>
</record>
<record id="tag_C_ITBIS_8" model="account.account.tag">
<field name="name">C-ITBIS 8%</field>
<field name="applicability">taxes</field>
</record>
<record id="tag_V_ITBIS_11" model="account.account.tag">
<field name="name">V-ITBIS 11%</field>
<field name="applicability">taxes</field>
</record>
<record id="tag_C_ITBIS_11" model="account.account.tag">
<field name="name">C-ITBIS 11%</field>
<field name="applicability">taxes</field>
</record>
<record id="tag_V_EXENTA" model="account.account.tag">
<field name="name">V-EXENTA</field>
<field name="applicability">taxes</field>
</record>
<record id="tax_V-ITBIS_18%" model="account.account.tag">
<record id="tag_V_ITBIS_18" model="account.account.tag">
<field name="name">V-ITBIS 18%</field>
<field name="applicability">taxes</field>
</record>
<record id="tax_C-ITBIS_18%_Incluido" model="account.account.tag">
<record id="tag_C_ITBIS_18_Incluido" model="account.account.tag">
<field name="name">C-ITBIS 18% Incluido</field>
<field name="applicability">taxes</field>
</record>
<record id="tax_C-ITBIS_18%" model="account.account.tag">
<record id="tag_C_ITBIS_18" model="account.account.tag">
<field name="name">C-ITBIS 18%</field>
<field name="applicability">taxes</field>
</record>
<record id="tax_CS-ITBIS_18%_Incluido" model="account.account.tag">
<record id="tag_CS_ITBIS_18_Incluido" model="account.account.tag">
<field name="name">CS-ITBIS 18% Incluido</field>
<field name="applicability">taxes</field>
</record>
<record id="tax_CS-ITBIS_18%" model="account.account.tag">
<record id="tag_CS_ITBIS_18" model="account.account.tag">
<field name="name">CS-ITBIS 18%</field>
<field name="applicability">taxes</field>
</record>
<record id="tax_IMP-ITBIS_18%" model="account.account.tag">
<record id="tag_IMP_ITBIS_18" model="account.account.tag">
<field name="name">IMP-ITBIS 18%</field>
<field name="applicability">taxes</field>
</record>
<record id="tax_R-ITBIS_18%" model="account.account.tag">
<record id="tag_R_ITBIS_18" model="account.account.tag">
<field name="name">R-ITBIS 18%</field>
<field name="applicability">taxes</field>
</record>
<record id="tag_R_ISR_2" model="account.account.tag">
<field name="name">R-ISR 2%</field>
<field name="applicability">taxes</field>
</record>
<record id="tag_TELE_ISC" model="account.account.tag">
<field name="name">TELE-ISC</field>
<field name="applicability">taxes</field>
</record>
<record id="tag_TELE_CDT" model="account.account.tag">
<field name="name">TELE-CDT</field>
<field name="applicability">taxes</field>
</record>
<record id="tag_R_Alquileres_10" model="account.account.tag">
<field name="name">R-Alquileres 10%</field>
<field name="applicability">taxes</field>
</record>
</data>
</odoo>
+1 -1
View File
@@ -9,7 +9,7 @@
# Pedro Manuel Baeza <pedro.baeza@serviciosbaeza.com>
{
"name" : "Spanish Charts of Accounts (PGCE 2008)",
"name" : "Spain - Accounting (PGCE 2008)",
"version" : "4.0",
"author" : "Spanish Localization Team",
'website' : 'https://launchpad.net/openerp-spain',
+1 -1
View File
@@ -9,7 +9,7 @@
# - account types
{
"name": "Croatia - RRIF 2012 COA",
"name": "Croatia - Accounting (RRIF 2012)",
"description": """
Croatian localisation.
======================
+11 -11
View File
@@ -28,15 +28,15 @@ rrif_pp_ino_10,Plaćeni PDV 10% na usluge inozemnih poduzetnika,l10n_hr_chart_te
rrif_ppr2_25,25% R-2 dobavljač,l10n_hr_chart_template_rrif,25% R-2 dobavljač,25,percent,purchase,100,kp_rrif1409,kp_rrif1409,tax_tag_33,
rrif_pp_uvoz_samopdv_25,Samo PDV kod uvoza 25%,l10n_hr_chart_template_rrif,Samo PDV kod uvoza 25%,25,percent,purchase,100,kp_rrif4199,kp_rrif4199,tax_tag_32,
rrif_pp_uvoz_samopdv_25usl,Samo PDV kod uvoza 25% usluge,l10n_hr_chart_template_rrif,Samo PDV kod uvoza 25% usluge,25,percent,purchase,100,kp_rrif4199,kp_rrif4199,tax_tag_29,
rrif_ppdnp1_3070_70_3,pp 70% priz.(25%),l10n_hr_chart_template_rrif,Pp 70% priz.(25%),17.5,percent,none,100,kp_rrif14002,kp_rrif14002,,
rrif_ppdnp1_3070_30_3,pp 30% nep.(25%),l10n_hr_chart_template_rrif,pp 30% nep.(25%),7.5,percent,none,100,kp_rrif4199,kp_rrif4199,,
rrif_ppdnp1_3070_1,pp 30% Nepriznat 70% Priznat,l10n_hr_chart_template_rrif,pp 30% Nepriznat 70% Priznat,100,group,purchase,100,kp_rrif4199,kp_rrif4199,tax_tag_21,"rrif_ppdnp1_3070_70_3,rrif_ppdnp1_3070_30_3"
rrif_ppdnp1_7030_30_3,Pp 30% priz.(25%),l10n_hr_chart_template_rrif,Pp 30% priz.(25%),7.5,percent,none,100,kp_rrif14002,kp_rrif14002,,
rrif_ppdnp1_7030_70_3,Pp 70% nep.(25%),l10n_hr_chart_template_rrif,Pp 70% nep.(25%),17.5,percent,none,100,kp_rrif4199,kp_rrif4199,,
rrif_ppdnp1_3070_30_3,pp 30% nep.(25%),l10n_hr_chart_template_rrif,pp 30% nep.(25%),7.5,percent,none,100,kp_rrif4199,kp_rrif4199,tax_tag_21_1,
rrif_ppdnp1_3070_70_3,pp 70% priz.(25%),l10n_hr_chart_template_rrif,Pp 70% priz.(25%),17.5,percent,none,100,kp_rrif14002,kp_rrif14002,tax_tag_21_2,
rrif_ppdnp1_3070_1,pp 30% Nepriznat 70% Priznat,l10n_hr_chart_template_rrif,pp 30% Nepriznat 70% Priznat,100,group,purchase,100,kp_rrif4199,kp_rrif4199,tax_tag_21,"rrif_ppdnp1_3070_30_3,rrif_ppdnp1_3070_70_3"
rrif_ppdnp1_7030_70_3,Pp 70% nep.(25%),l10n_hr_chart_template_rrif,Pp 70% nep.(25%),17.5,percent,none,100,kp_rrif4199,kp_rrif4199,tax_tag_20_1,
rrif_ppdnp1_7030_30_3,Pp 30% priz.(25%),l10n_hr_chart_template_rrif,Pp 30% priz.(25%),7.5,percent,none,100,kp_rrif14002,kp_rrif14002,tax_tag_20_2,
rrif_ppdnp1_7030_1,pp 70% Nepriznat 30% Priznat,l10n_hr_chart_template_rrif,pp 70% Nepriznat 30% Priznat,100,group,purchase,100,kp_rrif4199,kp_rrif4199,tax_tag_20,"rrif_ppdnp1_7030_70_3,rrif_ppdnp1_7030_30_3"
rrif_ppdnp1_3070_70_3_r2,R2 pp 70% priz.(25%),l10n_hr_chart_template_rrif,R2 pp 70% priz.(25%),17.5,percent,none,100,kp_rrif1408,kp_rrif1408,,
rrif_ppdnp1_3070_30_3_r2,R2 pp 30% nep.(25%),l10n_hr_chart_template_rrif,R2 pp 30% nep.(25%),7.5,percent,none,100,kp_rrif4199,kp_rrif4199,,
rrif_ppdnp1_3070_1_r2,R2 pp 30% Nepriznat 70% Priznat,l10n_hr_chart_template_rrif,R2 pp 30% Nepriznat 70% Priznat,100,group,purchase,100,kp_rrif4199,kp_rrif4199,tax_tag_30,"rrif_ppdnp1_3070_70_3_r2,rrif_ppdnp1_3070_30_3_r2"
rrif_ppdnp1_7030_30_3_r2,R2 Pp 30% priz.(25%),l10n_hr_chart_template_rrif,R2 Pp 30% priz.(25%),7.5,percent,none,100,kp_rrif1408,kp_rrif1408,,
rrif_ppdnp1_7030_70_3_r2,R2 Pp 70% nep.(25%),l10n_hr_chart_template_rrif,R2 Pp 70% nep.(25%),17.5,percent,none,100,kp_rrif4199,kp_rrif4199,,
rrif_ppdnp1_7030_1_r2,R2 pp 70% Nepriznat 30% Priznat,l10n_hr_chart_template_rrif,R2 pp 70% Nepriznat 30% Priznat,100,group,purchase,100,kp_rrif4199,kp_rrif4199,tax_tag_31,"rrif_ppdnp1_7030_30_3_r2,rrif_ppdnp1_7030_70_3_r2"
rrif_ppdnp1_3070_30_3_r2,R2 pp 30% nep.(25%),l10n_hr_chart_template_rrif,R2 pp 30% nep.(25%),7.5,percent,none,100,kp_rrif4199,kp_rrif4199,tax_tag_30_1,
rrif_ppdnp1_3070_70_3_r2,R2 pp 70% priz.(25%),l10n_hr_chart_template_rrif,R2 pp 70% priz.(25%),17.5,percent,none,100,kp_rrif1408,kp_rrif1408,tax_tag_30_2,
rrif_ppdnp1_3070_1_r2,R2 pp 30% Nepriznat 70% Priznat,l10n_hr_chart_template_rrif,R2 pp 30% Nepriznat 70% Priznat,100,group,purchase,100,kp_rrif4199,kp_rrif4199,tax_tag_30,"rrif_ppdnp1_3070_30_3_r2,rrif_ppdnp1_3070_70_3_r2"
rrif_ppdnp1_7030_70_3_r2,R2 Pp 70% nep.(25%),l10n_hr_chart_template_rrif,R2 Pp 70% nep.(25%),17.5,percent,none,100,kp_rrif4199,kp_rrif4199,tax_tag_31_1,
rrif_ppdnp1_7030_30_3_r2,R2 Pp 30% priz.(25%),l10n_hr_chart_template_rrif,R2 Pp 30% priz.(25%),7.5,percent,none,100,kp_rrif1408,kp_rrif1408,tax_tag_31_2,
rrif_ppdnp1_7030_1_r2,R2 pp 70% Nepriznat 30% Priznat,l10n_hr_chart_template_rrif,R2 pp 70% Nepriznat 30% Priznat,100,group,purchase,100,kp_rrif4199,kp_rrif4199,tax_tag_31,"rrif_ppdnp1_7030_70_3_r2,rrif_ppdnp1_7030_30_3_r2"
1 id description chart_template_id/id name amount amount_type type_tax_use sequence account_id/id refund_account_id/id tag_ids/id children_tax_ids/id
28 rrif_ppr2_25 25% R-2 dobavljač l10n_hr_chart_template_rrif 25% R-2 dobavljač 25 percent purchase 100 kp_rrif1409 kp_rrif1409 tax_tag_33
29 rrif_pp_uvoz_samopdv_25 Samo PDV kod uvoza 25% l10n_hr_chart_template_rrif Samo PDV kod uvoza 25% 25 percent purchase 100 kp_rrif4199 kp_rrif4199 tax_tag_32
30 rrif_pp_uvoz_samopdv_25usl Samo PDV kod uvoza 25% usluge l10n_hr_chart_template_rrif Samo PDV kod uvoza 25% usluge 25 percent purchase 100 kp_rrif4199 kp_rrif4199 tax_tag_29
31 rrif_ppdnp1_3070_70_3 rrif_ppdnp1_3070_30_3 pp 70% priz.(25%) pp 30% nep.(25%) l10n_hr_chart_template_rrif Pp 70% priz.(25%) pp 30% nep.(25%) 17.5 7.5 percent none 100 kp_rrif14002 kp_rrif4199 kp_rrif14002 kp_rrif4199 tax_tag_21_1
32 rrif_ppdnp1_3070_30_3 rrif_ppdnp1_3070_70_3 pp 30% nep.(25%) pp 70% priz.(25%) l10n_hr_chart_template_rrif pp 30% nep.(25%) Pp 70% priz.(25%) 7.5 17.5 percent none 100 kp_rrif4199 kp_rrif14002 kp_rrif4199 kp_rrif14002 tax_tag_21_2
33 rrif_ppdnp1_3070_1 pp 30% Nepriznat 70% Priznat l10n_hr_chart_template_rrif pp 30% Nepriznat 70% Priznat 100 group purchase 100 kp_rrif4199 kp_rrif4199 tax_tag_21 rrif_ppdnp1_3070_70_3,rrif_ppdnp1_3070_30_3 rrif_ppdnp1_3070_30_3,rrif_ppdnp1_3070_70_3
34 rrif_ppdnp1_7030_30_3 rrif_ppdnp1_7030_70_3 Pp 30% priz.(25%) Pp 70% nep.(25%) l10n_hr_chart_template_rrif Pp 30% priz.(25%) Pp 70% nep.(25%) 7.5 17.5 percent none 100 kp_rrif14002 kp_rrif4199 kp_rrif14002 kp_rrif4199 tax_tag_20_1
35 rrif_ppdnp1_7030_70_3 rrif_ppdnp1_7030_30_3 Pp 70% nep.(25%) Pp 30% priz.(25%) l10n_hr_chart_template_rrif Pp 70% nep.(25%) Pp 30% priz.(25%) 17.5 7.5 percent none 100 kp_rrif4199 kp_rrif14002 kp_rrif4199 kp_rrif14002 tax_tag_20_2
36 rrif_ppdnp1_7030_1 pp 70% Nepriznat 30% Priznat l10n_hr_chart_template_rrif pp 70% Nepriznat 30% Priznat 100 group purchase 100 kp_rrif4199 kp_rrif4199 tax_tag_20 rrif_ppdnp1_7030_70_3,rrif_ppdnp1_7030_30_3
37 rrif_ppdnp1_3070_70_3_r2 rrif_ppdnp1_3070_30_3_r2 R2 pp 70% priz.(25%) R2 pp 30% nep.(25%) l10n_hr_chart_template_rrif R2 pp 70% priz.(25%) R2 pp 30% nep.(25%) 17.5 7.5 percent none 100 kp_rrif1408 kp_rrif4199 kp_rrif1408 kp_rrif4199 tax_tag_30_1
38 rrif_ppdnp1_3070_30_3_r2 rrif_ppdnp1_3070_70_3_r2 R2 pp 30% nep.(25%) R2 pp 70% priz.(25%) l10n_hr_chart_template_rrif R2 pp 30% nep.(25%) R2 pp 70% priz.(25%) 7.5 17.5 percent none 100 kp_rrif4199 kp_rrif1408 kp_rrif4199 kp_rrif1408 tax_tag_30_2
39 rrif_ppdnp1_3070_1_r2 R2 pp 30% Nepriznat 70% Priznat l10n_hr_chart_template_rrif R2 pp 30% Nepriznat 70% Priznat 100 group purchase 100 kp_rrif4199 kp_rrif4199 tax_tag_30 rrif_ppdnp1_3070_70_3_r2,rrif_ppdnp1_3070_30_3_r2 rrif_ppdnp1_3070_30_3_r2,rrif_ppdnp1_3070_70_3_r2
40 rrif_ppdnp1_7030_30_3_r2 rrif_ppdnp1_7030_70_3_r2 R2 Pp 30% priz.(25%) R2 Pp 70% nep.(25%) l10n_hr_chart_template_rrif R2 Pp 30% priz.(25%) R2 Pp 70% nep.(25%) 7.5 17.5 percent none 100 kp_rrif1408 kp_rrif4199 kp_rrif1408 kp_rrif4199 tax_tag_31_1
41 rrif_ppdnp1_7030_70_3_r2 rrif_ppdnp1_7030_30_3_r2 R2 Pp 70% nep.(25%) R2 Pp 30% priz.(25%) l10n_hr_chart_template_rrif R2 Pp 70% nep.(25%) R2 Pp 30% priz.(25%) 17.5 7.5 percent none 100 kp_rrif4199 kp_rrif1408 kp_rrif4199 kp_rrif1408 tax_tag_31_2
42 rrif_ppdnp1_7030_1_r2 R2 pp 70% Nepriznat 30% Priznat l10n_hr_chart_template_rrif R2 pp 70% Nepriznat 30% Priznat 100 group purchase 100 kp_rrif4199 kp_rrif4199 tax_tag_31 rrif_ppdnp1_7030_30_3_r2,rrif_ppdnp1_7030_70_3_r2 rrif_ppdnp1_7030_70_3_r2,rrif_ppdnp1_7030_30_3_r2
+32
View File
@@ -95,10 +95,26 @@
<field name="name">pp 70% Nepriznat 30% Priznat</field>
<field name="applicability">taxes</field>
</record>
<record id="tax_tag_20_1" model="account.account.tag">
<field name="name">Pp 30% priz.(25%)</field>
<field name="applicability">taxes</field>
</record>
<record id="tax_tag_20_2" model="account.account.tag">
<field name="name">Pp 70% nep.(25%)</field>
<field name="applicability">taxes</field>
</record>
<record id="tax_tag_21" model="account.account.tag">
<field name="name">pp 30% Nepriznat 70% Priznat</field>
<field name="applicability">taxes</field>
</record>
<record id="tax_tag_21_1" model="account.account.tag">
<field name="name">pp 30% nep.(25%)</field>
<field name="applicability">taxes</field>
</record>
<record id="tax_tag_21_2" model="account.account.tag">
<field name="name">pp 70% priz.(25%)</field>
<field name="applicability">taxes</field>
</record>
<record id="tax_tag_22" model="account.account.tag">
<field name="name">Plaćeni PDV 25% pri uvozu dobara</field>
<field name="applicability">taxes</field>
@@ -135,10 +151,26 @@
<field name="name">R2 pp 30% Nepriznat 70% Priznat</field>
<field name="applicability">taxes</field>
</record>
<record id="tax_tag_30_1" model="account.account.tag">
<field name="name">R2 pp 30% nep.(25%)</field>
<field name="applicability">taxes</field>
</record>
<record id="tax_tag_30_2" model="account.account.tag">
<field name="name">R2 pp 70% priz.(25%)</field>
<field name="applicability">taxes</field>
</record>
<record id="tax_tag_31" model="account.account.tag">
<field name="name">R2 pp 70% Nepriznat 30% Priznat</field>
<field name="applicability">taxes</field>
</record>
<record id="tax_tag_31_1" model="account.account.tag">
<field name="name">R2 Pp 70% nep.(25%)</field>
<field name="applicability">taxes</field>
</record>
<record id="tax_tag_31_2" model="account.account.tag">
<field name="name">R2 Pp 30% priz.(25%)</field>
<field name="applicability">taxes</field>
</record>
<record id="tax_tag_32" model="account.account.tag">
<field name="name">Samo PDV kod uvoza 25%</field>
<field name="applicability">taxes</field>
+1 -1
View File
@@ -2,7 +2,7 @@
# Part of Odoo. See LICENSE file for full copyright and licensing details.
{
"name" : "Norway - Chart of Accounts",
"name" : "Norway - Accounting",
"version" : "1.0",
"author" : "Rolv Råen",
"category" : "Localization/Account Charts",
+1 -1
View File
@@ -4,7 +4,7 @@
# Copyright (c) 2011 Cubic ERP - Teradata SAC. (http://cubicerp.com).
{
"name": "Panama Localization Chart Account",
"name": "Panama - Accounting",
"version": "1.0",
"description": """
Panamenian accounting chart and tax localization.
+1 -1
View File
@@ -4,7 +4,7 @@
# Copyright (c) 2011 Cubic ERP - Teradata SAC. (http://cubicerp.com).
{
'name': 'Peru Localization Chart Account',
'name': 'Peru - Accounting',
'version': '1.0',
'description': """
Peruvian accounting chart and tax localization. According the PCGE 2010.
+1 -1
View File
@@ -5,7 +5,7 @@
# http://www.thinkopensolutions.com.
{
'name': 'Portugal - Chart of Accounts',
'name': 'Portugal - Accounting',
'version': '0.011',
'author': 'ThinkOpen Solutions',
'website': 'http://www.thinkopensolutions.com/',
+1 -1
View File
@@ -1,7 +1,7 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
{
'name': 'United States - Chart of accounts',
'name': 'United States - Accounting',
'version': '1.1',
'category': 'Localization/Account Charts',
'description': """
+1 -1
View File
@@ -4,7 +4,7 @@
# This module is Copyright (c) 2009-2013 General Solutions (http://gscom.vn) All Rights Reserved.
{
"name" : "Vietnam Chart of Accounts",
"name" : "Vietnam - Accounting",
"version" : "1.0",
"author" : "General Solutions",
'website': 'http://gscom.vn',
+26 -15
View File
@@ -6,8 +6,8 @@ msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 9.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-09-07 14:40+0000\n"
"PO-Revision-Date: 2015-09-07 14:40+0000\n"
"POT-Creation-Date: 2015-09-10 10:19+0000\n"
"PO-Revision-Date: 2015-09-10 10:19+0000\n"
"Last-Translator: <>\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
@@ -783,11 +783,6 @@ msgstr ""
msgid "Create %s"
msgstr ""
#. module: mail
#: model:ir.model.fields,field_description:mail.field_mail_channel_create_date
msgid "Create Date"
msgstr ""
#. module: mail
#: model:ir.model.fields,field_description:mail.field_email_template_preview_create_uid
#: model:ir.model.fields,field_description:mail.field_mail_alias_create_uid
@@ -807,6 +802,7 @@ msgstr ""
#. module: mail
#: model:ir.model.fields,field_description:mail.field_email_template_preview_create_date
#: model:ir.model.fields,field_description:mail.field_mail_alias_create_date
#: model:ir.model.fields,field_description:mail.field_mail_channel_create_date
#: model:ir.model.fields,field_description:mail.field_mail_channel_partner_create_date
#: model:ir.model.fields,field_description:mail.field_mail_compose_message_create_date
#: model:ir.model.fields,field_description:mail.field_mail_mail_create_date
@@ -909,6 +905,11 @@ msgstr ""
msgid "Description that will be added in the message posted for this subtype. If void, the name will be added instead."
msgstr ""
#. module: mail
#: model:ir.actions.client,help:mail.mail_channel_action_client_chat
msgid "Did you know ? Type '@someone' in the composer to cite someone in your message, and make it appear in his own inbox."
msgstr ""
#. module: mail
#: model:ir.model,name:mail.model_mail_channel
msgid "Discussion channel"
@@ -1088,6 +1089,11 @@ msgstr ""
msgid "Error, a partner cannot follow twice the same object."
msgstr ""
#. module: mail
#: sql_constraint:mail.followers:0
msgid "Error: A follower must be either a partner or a channel (but not both)."
msgstr ""
#. module: mail
#: selection:mail.alias,alias_contact:0
#: selection:mail.channel,public:0
@@ -1571,11 +1577,6 @@ msgstr ""
msgid "Listeners"
msgstr ""
#. module: mail
#: selection:mail.channel,channel_type:0
msgid "Livechat Conversation"
msgstr ""
#. module: mail
#. openerp-web
#: code:addons/mail/static/src/xml/mail_chatter.xml:61
@@ -1870,6 +1871,11 @@ msgstr ""
msgid "New Value Integer"
msgstr ""
#. module: mail
#: model:ir.model.fields,field_description:mail.field_mail_tracking_value_new_value_monetary
msgid "New Value Monetary"
msgstr ""
#. module: mail
#: model:ir.model.fields,field_description:mail.field_mail_tracking_value_new_value_text
msgid "New Value Text"
@@ -1987,6 +1993,11 @@ msgstr ""
msgid "Old Value Integer"
msgstr ""
#. module: mail
#: model:ir.model.fields,field_description:mail.field_mail_tracking_value_old_value_monetary
msgid "Old Value Monetary"
msgstr ""
#. module: mail
#: model:ir.model.fields,field_description:mail.field_mail_tracking_value_old_value_text
msgid "Old Value Text"
@@ -2117,12 +2128,12 @@ msgstr ""
#: model:ir.model.fields,help:mail.field_mail_alias_alias_parent_model_id
#: model:ir.model.fields,help:mail.field_mail_channel_alias_parent_model_id
#: model:ir.model.fields,help:mail.field_res_users_alias_parent_model_id
msgid "Parent model holding the alias. The model holding the alias referenceis not necessarily the model given by alias_model_id(example: project (parent_model) and task (model))"
msgid "Parent model holding the alias. The model holding the alias reference is not necessarily the model given by alias_model_id (example: project (parent_model) and task (model))"
msgstr ""
#. module: mail
#: model:ir.model.fields,help:mail.field_mail_message_subtype_parent_id
msgid "Parent subtype, used for automatic subscription. This field is notcorrectly named. For example on a project, project subtypes haveparent_id to task-related subtypes."
msgid "Parent subtype, used for automatic subscription. This field is not correctly named. For example on a project, the parent_id of project subtypes refers to task-related subtypes."
msgstr ""
#. module: mail
@@ -2602,7 +2613,7 @@ msgstr ""
#: model:ir.model.fields,field_description:mail.field_mail_compose_message_subtype_id
#: model:ir.model.fields,field_description:mail.field_mail_followers_subtype_ids
#: model:ir.model.fields,field_description:mail.field_mail_mail_subtype_id
#: model:ir.model.fields,field_description:mail.field_mail_message_subtype_id_2097
#: model:ir.model.fields,field_description:mail.field_mail_message_subtype_id_1654
#: model:ir.ui.view,arch_db:mail.view_message_subtype_tree
msgid "Subtype"
msgstr ""
+2 -2
View File
@@ -66,8 +66,8 @@ class Alias(models.Model):
default=lambda self: self.env["ir.config_parameter"].get_param("mail.catchall.domain"))
alias_parent_model_id = fields.Many2one(
'ir.model', 'Parent Model',
help="Parent model holding the alias. The model holding the alias reference"
"is not necessarily the model given by alias_model_id"
help="Parent model holding the alias. The model holding the alias reference "
"is not necessarily the model given by alias_model_id "
"(example: project (parent_model) and task (model))")
alias_parent_thread_id = fields.Integer('Parent Record Thread ID', help="ID of the parent record holding the alias (example: project holding the task creation alias)")
alias_contact = fields.Selection([
+1
View File
@@ -128,4 +128,5 @@ class Followers(models.Model):
_sql_constraints = [
('mail_followers_res_partner_res_model_id_uniq', 'unique(res_model,res_id,partner_id)', 'Error, a partner cannot follow twice the same object.'),
('mail_followers_res_channel_res_model_id_uniq', 'unique(res_model,res_id,channel_id)', 'Error, a channel cannot follow twice the same object.'),
('partner_xor_channel', 'CHECK((partner_id IS NULL) != (channel_id IS NULL))', 'Error: A follower must be either a partner or a channel (but not both).')
]
+3 -3
View File
@@ -27,9 +27,9 @@ class MailMessageSubtype(models.Model):
help='Messages with internal subtypes will be visible only by employees, aka members of base_user group')
parent_id = fields.Many2one(
'mail.message.subtype', string='Parent', ondelete='set null',
help='Parent subtype, used for automatic subscription. This field is not'
'correctly named. For example on a project, project subtypes have'
'parent_id to task-related subtypes.')
help='Parent subtype, used for automatic subscription. This field is not '
'correctly named. For example on a project, the parent_id of project '
'subtypes refers to task-related subtypes.')
relation_field = fields.Char(
'Relation field',
help='Field used to link the related model to the subtype model when '
+1 -1
View File
@@ -438,7 +438,7 @@ class MailThread(models.AbstractModel):
_logger.debug('subtype %s not found' % subtype_xmlid)
continue
record.message_post(subtype=subtype_xmlid, tracking_value_ids=tracking_value_ids)
else:
elif tracking_value_ids:
record.message_post(tracking_value_ids=tracking_value_ids)
return True
+5 -3
View File
@@ -13,12 +13,14 @@ class MailTracking(models.Model):
old_value_integer = fields.Integer('Old Value Integer', readonly=1)
old_value_float = fields.Float('Old Value Float', readonly=1)
old_value_monetary = fields.Float('Old Value Monetary', readonly=1)
old_value_char = fields.Char('Old Value Char', readonly=1)
old_value_text = fields.Text('Old Value Text', readonly=1)
old_value_datetime = fields.Datetime('Old Value DateTime', readonly=1)
new_value_integer = fields.Integer('New Value Integer', readonly=1)
new_value_float = fields.Float('New Value Float', readonly=1)
new_value_monetary = fields.Float('New Value Monetary', readonly=1)
new_value_char = fields.Char('New Value Char', readonly=1)
new_value_text = fields.Text('New Value Text', readonly=1)
new_value_datetime = fields.Datetime('New Value Datetime', readonly=1)
@@ -30,7 +32,7 @@ class MailTracking(models.Model):
tracked = True
values = {'field': col_name, 'field_desc': col_info['string'], 'field_type': col_info['type']}
if col_info['type'] in ['integer', 'float', 'char', 'text', 'datetime']:
if col_info['type'] in ['integer', 'float', 'char', 'text', 'datetime', 'monetary']:
values.update({
'old_value_%s' % col_info['type']: initial_value,
'new_value_%s' % col_info['type']: new_value
@@ -68,7 +70,7 @@ class MailTracking(models.Model):
def get_old_display_value(self):
result = []
for record in self:
if record.field_type in ['integer', 'float', 'char', 'text', 'datetime']:
if record.field_type in ['integer', 'float', 'char', 'text', 'datetime', 'monetary']:
result.append(getattr(record, 'old_value_%s' % record.field_type))
elif record.field_type == 'date':
if record.old_value_datetime:
@@ -88,7 +90,7 @@ class MailTracking(models.Model):
def get_new_display_value(self):
result = []
for record in self:
if record.field_type in ['integer', 'float', 'char', 'text', 'datetime']:
if record.field_type in ['integer', 'float', 'char', 'text', 'datetime', 'monetary']:
result.append(getattr(record, 'new_value_%s' % record.field_type))
elif record.field_type == 'date':
if record.new_value_datetime:
+16
View File
@@ -1,5 +1,6 @@
# -*- coding: utf-8 -*-
from psycopg2 import IntegrityError
from openerp.addons.mail.tests.common import TestMail
@@ -102,3 +103,18 @@ class TestMailFollowers(TestMail):
('partner_id', '=', self.user_employee.partner_id.id)])
self.assertEqual(len(follower), 1)
self.assertEqual(follower.subtype_ids, self.mt_mg_nodef | self.mt_al_nodef)
def test_no_DID(self):
"""Test that a follower cannot suffer from dissociative identity disorder.
It cannot be both a partner and a channel.
"""
test_channel = self.env['mail.channel'].create({
'name': 'I used to be schizo, but now we are alright.'
})
with self.assertRaises(IntegrityError):
self.env['mail.followers'].create({
'res_model': 'mail.channel',
'res_id': test_channel.id,
'partner_id': self.user_employee.partner_id.id,
'channel_id': self.group_pigs.id,
})
-1
View File
@@ -30,7 +30,6 @@ invoice and send propositions for membership renewal.
],
'demo': [
'membership_demo.xml',
'membership_demo.yml',
],
'website': 'https://www.odoo.com/page/community-builder',
'test': [
-49
View File
@@ -1,49 +0,0 @@
-
create invoice and state is 'open' and pay some invoice
-
!python {model: res.partner}: |
vals = {'free_member': False}
self.pool.get('ir.model.data')._update(cr, uid, 'res.partner', 'base', vals, 'res_partner_18')
self.pool.get('ir.model.data')._update(cr, uid, 'res.partner', 'base', vals, 'res_partner_4')
self.pool.get('ir.model.data')._update(cr, uid, 'res.partner', 'base', vals, 'res_partner_12')
self.pool.get('ir.model.data')._update(cr, uid, 'res.partner', 'base', vals, 'res_partner_1')
if self.pool.get('account.invoice')._default_currency(cr, uid):
import time
invoice_ids = self.create_membership_invoice(cr, uid, [ref("base.res_partner_1"),ref("base.res_partner_4"),ref("base.res_partner_10"),ref("base.res_partner_2"),ref("base.res_partner_12"),ref("base.res_partner_3"),ref("base.res_partner_4"),ref("base.res_partner_1"),ref("base.res_partner_1"),ref("base.res_partner_10")], product_id=ref("membership_1"), datas={"amount":80.00})
invoice_pool = self.pool.get('account.invoice')
invoice_pool.signal_workflow(cr, uid, invoice_ids, 'invoice_open')
bank_journal_id = self.pool.get('account.journal').search(cr, uid, [('type', '=', 'bank')])
if bank_journal_id:
for id in invoice_ids[-4:]:
pay = invoice_pool.pay_and_reconcile(cr, uid, [id], bank_journal_id[0], 9050.0)
self.create_membership_invoice(cr, uid, ref('base.res_partner_2'), ref('membership_0'), {'amount':180})
self.create_membership_invoice(cr, uid, ref('base.res_partner_10'), ref('membership_0'), {'amount':180})
self.create_membership_invoice(cr, uid, ref('base.res_partner_12'), ref('membership_0'), {'amount':180})
self.create_membership_invoice(cr, uid, ref('base.res_partner_2'), ref('membership_0'), {'amount':180})
self.create_membership_invoice(cr, uid, ref('base.res_partner_18'), ref('membership_1'), {'amount':180})
self.create_membership_invoice(cr, uid, ref('base.res_partner_4'), ref('membership_1'), {'amount':180})
self.create_membership_invoice(cr, uid, ref('base.res_partner_1'), ref('membership_1'), {'amount':180})
self.create_membership_invoice(cr, uid, ref('base.res_partner_12'), ref('membership_1'), {'amount':180})
self.create_membership_invoice(cr, uid, ref('base.res_partner_12'), ref('membership_2'), {'amount':180})
self.create_membership_invoice(cr, uid, ref('base.res_partner_3'), ref('membership_2'), {'amount':180})
self.create_membership_invoice(cr, uid, ref('base.res_partner_3'), ref('membership_2'), {'amount':180})
self.create_membership_invoice(cr, uid, ref('base.res_partner_3'), ref('membership_2'), {'amount':180})
vals = {'free_member': True}
self.pool.get('ir.model.data')._update(cr, uid, 'res.partner', 'base', vals, 'res_partner_18')
self.pool.get('ir.model.data')._update(cr, uid, 'res.partner', 'base', vals, 'res_partner_4')
self.pool.get('ir.model.data')._update(cr, uid, 'res.partner', 'base', vals, 'res_partner_12')
self.pool.get('ir.model.data')._update(cr, uid, 'res.partner', 'base', vals, 'res_partner_1')
vals = {'associate_member': ref('base.res_partner_2')}
self.pool.get('ir.model.data')._update(cr, uid, 'res.partner', 'base', vals, 'res_partner_12')
self.pool.get('ir.model.data')._update(cr, uid, 'res.partner', 'base', vals, 'res_partner_12')
self.pool.get('ir.model.data')._update(cr, uid, 'res.partner', 'base', vals, 'res_partner_3')
self.pool.get('ir.model.data')._update(cr, uid, 'res.partner', 'base', vals, 'res_partner_4')
self.pool.get('ir.model.data')._update(cr, uid, 'res.partner', 'base', vals, 'res_partner_12')
+4 -3
View File
@@ -56,6 +56,8 @@
<div t-attf-class="#{kanban_color(record.color.raw_value)} oe_kanban_global_click_edit oe_semantic_html_override oe_kanban_card">
<field name="tag_ids"/>
<div class="o_dropdown_kanban dropdown">
<a class="dropdown-toggle btn" data-toggle="dropdown" href="#" >
<span class="fa fa-bars fa-lg"/>
@@ -75,7 +77,6 @@
<field name="name"/>
</span>
<div class="clearfix"></div>
<field name="tag_ids"/>
<t t-foreach="record.message_follower_ids.raw_value" t-as="follower">
<img t-att-src="kanban_image('res.partner', 'image_small', follower)" width="24" height="24" class="oe_kanban_avatar pull-right" t-att-data-member_id="follower"/>
</t>
@@ -87,7 +88,7 @@
</field>
</record>
<!-- New note Form View -->
<!-- New note Tree View -->
<record model="ir.ui.view" id="view_note_note_tree">
<field name="name">note.note.tree</field>
<field name="model">note.note</field>
@@ -108,10 +109,10 @@
<field name="arch" type="xml">
<form string="Note" class="oe_form_nomargin o_note_form_view">
<header>
<field name="tag_ids" widget="many2many_tags" placeholder="Tags"/>
<field name="stage_id" domain="[('user_id','=',uid)]" widget="statusbar" clickable="1"/>
</header>
<sheet>
<field name="tag_ids" widget="many2many_tags" placeholder="Tags"/>
<field name="memo" widget="html" class="oe_memo" editor_height="450px" />
</sheet>
<div class="oe_chatter">
@@ -51,9 +51,9 @@
<field name="session_ids"/>
<field name="current_session_id"/>
<field name="current_session_state"/>
<field name="last_session_closing_cash"/>
<field name="last_session_closing_date"/>
<field name="pos_session_username"/>
<field name="currency_id"/>
<templates>
<t t-name="kanban-box">
<div>
@@ -94,7 +94,7 @@
<span>Cash Balance</span>
</div>
<div class="col-xs-6">
<span><t t-esc="record.last_session_closing_cash.value"/></span>
<span><field name="last_session_closing_cash" widget="monetary"/></span>
</div>
</div>
</div>
+1 -1
View File
@@ -595,7 +595,7 @@
<record id="product.product_product_57" model="product.product"> <field name="available_in_pos" eval="False"/> </record>
<record id="product.product_product_58" model="product.product"> <field name="available_in_pos" eval="False"/> </record>
<record id="product.product_product_59" model="product.product"> <field name="available_in_pos" eval="False"/> </record>
<record id="sale.advance_product_0" model="product.product"> <field name="available_in_pos" eval="False"/> </record>
<record id="sale.advance_product_1" model="product.template"> <field name="available_in_pos" eval="False"/> </record>
+2
View File
@@ -450,6 +450,8 @@ class product_template(osv.osv):
def _compute_product_template_field(self, cr, uid, ids, names, arg, context=None):
''' Compute the field from the product_variant if there is only one variant, otherwise returns 0.0 '''
if isinstance(names, basestring):
names = [names]
res = {id: {} for id in ids}
templates = self.browse(cr, uid, ids, context=context)
unique_templates = [template.id for template in templates if template.product_variant_count == 1]
+14 -15
View File
@@ -82,7 +82,7 @@
<field name='product_variant_count' invisible='1'/>
<field name="id" invisible="True"/>
<div class="oe_button_box" name="button_box">
<button name="toggle_active" type="object" groups="base.group_no_one"
<button name="toggle_active" type="object"
class="oe_stat_button" icon="fa-archive">
<field name="active" widget="boolean_button"
options='{"terminology": "archive"}'/>
@@ -125,11 +125,9 @@
<field name="categ_id" string="Internal Category"/>
</group>
<group name="group_lots_and_weight">
<label for="weight"/>
<div class="o_row" name="weight">
<field digits="(14, 3)" name="weight" string="Weight"
attrs="{'invisible':[('type', 'not in', ['product', 'consu'])]}"/>
<span>kg</span>
<label for="weight" attrs="{'invisible':[('type', 'not in', ['product', 'consu']), ('product_variant_count', '&gt;', 1)]}"/>
<div class="o_row" name="weight" attrs="{'invisible':[('type', 'not in', ['product', 'consu']), ('product_variant_count', '&gt;', 1)]}">
<field name="weight" string="Weight"/>
</div>
</group>
</group>
@@ -145,7 +143,7 @@
<page string="Sales" attrs="{'invisible':[('sale_ok','=',False)]}" name="sales">
<div name="pricelist_item" groups="product.group_product_pricelist">
<separator string="Pricing"/>
<field name="item_ids" nolabel="1" context="{'default_base':'list_price', 'default_applied_on' :'1'}">
<field name="item_ids" nolabel="1" context="{'default_base':'list_price', 'default_applied_on' :'1_product'}">
<tree string="Pricelist Items" editable="bottom">
<field name="pricelist_id" string="Pricelist" required='1'/>
<field name="fixed_price" string="Price" required='1'/>
@@ -265,7 +263,7 @@
</div>
<label for="weight"/>
<div class="o_row">
<field digits="(14, 3)" name="weight"/>
<field name="weight"/>
<span>kg</span>
</div>
</group>
@@ -354,6 +352,7 @@
<field name="is_product_variant"/>
<field name="product_variant_count"/>
<field name="product_variant_ids"/>
<field name="currency_id"/>
<templates>
<t t-name="kanban-box">
<div class="oe_kanban_global_click">
@@ -372,7 +371,7 @@
</div>
<div name="tags"/>
<ul>
<li>Price: <field name="lst_price"></field></li>
<li>Price: <field name="lst_price" widget="monetary"></field></li>
</ul>
<div name="tags"/>
</div>
@@ -482,12 +481,12 @@
<field name="standard_price" attrs="{'invisible':[('product_variant_count','=', 1)]}"
widget='monetary' options="{'currency_field': 'currency_id'}"/>
</field>
<field name="weight" position="replace">
<field digits="(14, 3)" name="volume"
attrs="{'invisible':['|', ('type', 'not in', ['product', 'consu']),('product_variant_count','=',1)]}"/>
<field digits="(14, 3)" name="weight"
attrs="{'invisible':['|', ('type', 'not in', ['product', 'consu']),('product_variant_count','=',1)]}"/>
</field>
<label for="weight" position="attributes">
<attribute name="attrs">{'invisible':[('type', 'not in', ['product', 'consu'])]}</attribute>
</label>
<div name="weight" position="attributes">
<attribute name="attrs">{'invisible':[('type', 'not in', ['product', 'consu'])]}</attribute>
</div>
<xpath expr="//div[@class='oe_title']" position="inside">
<field name="attribute_value_ids" widget="many2many_tags" groups="product.group_product_variant"/>
</xpath>
+5 -2
View File
@@ -105,9 +105,12 @@ class project(osv.osv):
res[id] = (project_attachments or 0) + (task_attachments or 0)
return res
def _task_count(self, cr, uid, ids, field_name, arg, context=None):
if context is None:
context = {}
res={}
for tasks in self.browse(cr, uid, ids, dict(context, active_test=False)):
res[tasks.id] = len(tasks.task_ids)
for project in self.browse(cr, uid, ids, context=context):
tasks_undefined_stage = self.pool['project.task'].search_count(cr, uid, [('stage_id', '=', None), ('project_id', '=', project.id)], context=context)
res[project.id] = len(project.task_ids) + int(tasks_undefined_stage)
return res
def _get_alias_models(self, cr, uid, context=None):
""" Overriden in project_issue to offer more options """
+6 -6
View File
@@ -245,7 +245,7 @@
<div class="well well-lg">
<strong>Need help with defining your Projects? Contact us now.</strong><br/>
<a href="https://www.odoo.com/page/live-chat" target="_blank" style="margin-right:10px"><span class="fa fa-comment-o"/> Website Live Chat on</a>
<a href="mailto:info@odoo.com?subject=Project%20Planner"><span class="fa fa-envelope-o"/> Email Our Project Expert</a>
<a href="mailto:online@odoo.com?subject=Project%20Planner"><span class="fa fa-envelope-o"/> Email Our Project Expert</a>
</div>
</t>
@@ -329,7 +329,7 @@
<div class="well well-lg">
<strong>Need help to structure your projects ?</strong><br/>
<a href="https://www.odoo.com/page/live-chat" target="_blank" style="margin-right:10px"><span class="fa fa-comment-o"/> Website Live Chat on</a><br/>
<a href="mailto:info@odoo.com?subject=Project%20Planner"><span class="fa fa-envelope-o"/> Email Our Project Expert</a>
<a href="mailto:online@odoo.com?subject=Project%20Planner"><span class="fa fa-envelope-o"/> Email Our Project Expert</a>
</div>
</div>
</div>
@@ -540,7 +540,7 @@
<a href="https://www.odoo.com/page/live-chat" target="_blank" style="margin-right:10px">
<span class="fa fa-comment-o"/> Website Live Chat on
</a>
<a href="mailto:info@odoo.com?subject=Project%20Planner">
<a href="mailto:online@odoo.com?subject=Project%20Planner">
<span class="fa fa-envelope-o"/> Email Our Project Expert
</a>
</div>
@@ -621,7 +621,7 @@
<div class="well well-lg">
<strong>Contact us now:</strong><br/>
<a href="https://www.odoo.com/page/live-chat" target="_blank" style="margin-right:10px"><span class="fa fa-comment-o"/> Website Live Chat on</a><br/>
<a href="mailto:info@odoo.com?subject=Project%20Planner"><span class="fa fa-envelope-o"/> Email Our Project Expert</a>
<a href="mailto:online@odoo.com?subject=Project%20Planner"><span class="fa fa-envelope-o"/> Email Our Project Expert</a>
</div>
</div>
</div>
@@ -639,7 +639,7 @@
<span class="fa fa-eur fa-4x"></span>
<h3><strong>Billing</strong></h3>
<p>Create bills automatically based on Time &amp; Material.</p>
<a t-att-href="prepare_backend_url('base.open_module_tree', 'form', 'account_voucher')"
<a t-att-href="prepare_backend_url('base.open_module_tree', 'form', 'account')"
class="btn odoo_purple">
<span class="fa fa-arrow-circle-o-down"/> Install now
</a>
@@ -1017,7 +1017,7 @@
<div class="well well-lg">
<strong>Contact us now:</strong><br/>
<a href="https://www.odoo.com/page/live-chat" target="_blank" style="margin-right:10px"><span class="fa fa-comment-o"/> Website Live Chat on</a><br/>
<a href="mailto:info@odoo.com?subject=Project%20Planner"><span class="fa fa-envelope-o"/> Email Our Project Expert</a>
<a href="mailto:online@odoo.com?subject=Project%20Planner"><span class="fa fa-envelope-o"/> Email Our Project Expert</a>
</div>
</div>
</div>
+2 -2
View File
@@ -16,7 +16,7 @@ class PurchaseOrder(models.Model):
_description = "Purchase Order"
_order = 'date_order desc, id desc'
@api.depends('order_line.product_qty', 'order_line.price_unit', 'order_line.taxes_id')
@api.depends('order_line.price_total')
def _amount_all(self):
amount_untaxed = amount_tax = 0.0
for line in self.order_line:
@@ -117,7 +117,7 @@ class PurchaseOrder(models.Model):
('purchase', 'Purchase Order'),
('done', 'Done'),
('cancel', 'Cancelled')
], string='Status', readonly=True, select=True, copy=False, default='draft')
], string='Status', readonly=True, select=True, copy=False, default='draft', track_visibility='onchange')
order_line = fields.One2many('purchase.order.line', 'order_id', string='Order Lines', states=READONLY_STATES, copy=True)
notes = fields.Text('Terms and Conditions')
+4 -3
View File
@@ -296,7 +296,7 @@
<!-- Purchase Orders Kanban View -->
<record model="ir.ui.view" id="view_sale_order_kanban">
<record model="ir.ui.view" id="view_purchase_order_kanban">
<field name="name">purchase.order.kanban</field>
<field name="model">purchase.order</field>
<field name="arch" type="xml">
@@ -306,6 +306,7 @@
<field name="amount_total"/>
<field name="state"/>
<field name="date_order"/>
<field name="currency_id"/>
<templates>
<t t-name="kanban-box">
<div t-attf-class="oe_kanban_card oe_kanban_global_click">
@@ -313,8 +314,8 @@
<div class="col-xs-6">
<strong><span><t t-esc="record.partner_id.value"/></span></strong>
</div>
<div class="col-xs-6">
<strong><span class="pull-right text-right"><t t-esc="record.amount_total.value"/></span></strong>
<div class="col-xs-6 pull-right text-right">
<strong><field name="amount_total" widget="monetary"/></strong>
</div>
</div>
<div class="row">
+1 -1
View File
@@ -59,7 +59,7 @@
<search string="Sales Analysis">
<field name="date"/>
<filter string="This Year" name="year" invisible="1" domain="[('date','&lt;=', time.strftime('%%Y-12-31')),('date','&gt;=',time.strftime('%%Y-01-01'))]"/>
<filter name="Quotations" domain="[('state','in',('draft'))]"/>
<filter name="Quotations" domain="[('state','=','draft')]"/>
<filter name="Sales" string="Sales" domain="[('state','not in',('draft', 'cancel', 'sent'))]"/>
<separator/>
<field name="partner_id"/>

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