[MERGE] Forward-port 9.0 up to d982ba0d5a
This commit is contained in:
@@ -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',
|
||||
|
||||
@@ -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=\"\"/>\n"
|
||||
" <strong>Import a file</strong><br/>\n"
|
||||
" <span class=\"small\">Recommanded if >100 products</span>\n"
|
||||
" <span class=\"small\">Recommended if >100 products</span>\n"
|
||||
" </span>"
|
||||
msgstr ""
|
||||
|
||||
@@ -219,7 +219,7 @@ msgstr ""
|
||||
msgid "<span class=\"panel-title\">\n"
|
||||
" <span class=\"fa\" data-icon=\"\"/>\n"
|
||||
" <strong> Create manually</strong><br/>\n"
|
||||
" <span class=\"small\">Recommanded if <100 products</span>\n"
|
||||
" <span class=\"small\">Recommended if <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 & 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"
|
||||
|
||||
@@ -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):
|
||||
|
||||
@@ -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, ...)')
|
||||
|
||||
@@ -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)
|
||||
@@ -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)
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
@@ -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') > 3"><t t-set="style" t-value="'font-weight: normal;'"/></t>
|
||||
<t t-if="not a.get('level') > 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') > 3"><t t-set="style" t-value="'font-weight: normal;'"/></t>
|
||||
<t t-if="not a.get('level') > 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') > 3"><t t-set="style" t-value="'font-weight: normal;'"/></t>
|
||||
<t t-if="not a.get('level') > 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>
|
||||
@@ -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', '<br>')"/>
|
||||
<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>
|
||||
@@ -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>
|
||||
|
||||
@@ -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,
|
||||
})
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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):
|
||||
|
||||
@@ -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
@@ -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=\"\"/>\n"
|
||||
" <strong>Import a file</strong><br/>\n"
|
||||
" <span class=\"small\">Recommanded if >100 products</span>\n"
|
||||
" <span class=\"small\">Recommended if >100 products</span>\n"
|
||||
" </span>"
|
||||
msgstr ""
|
||||
|
||||
@@ -221,7 +221,7 @@ msgstr ""
|
||||
msgid "<span class=\"panel-title\">\n"
|
||||
" <span class=\"fa\" data-icon=\"\"/>\n"
|
||||
" <strong> Create manually</strong><br/>\n"
|
||||
" <span class=\"small\">Recommanded if <100 products</span>\n"
|
||||
" <span class=\"small\">Recommended if <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
|
||||
|
||||
@@ -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">
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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):
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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):
|
||||
|
||||
@@ -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" >(Report)</a>
|
||||
<t t-esc="record.seats_reserved.raw_value + record.seats_used.raw_value"/> Attendees confirmed
|
||||
<a name="action_event_registration_report" type="object" >(stats)</a>
|
||||
</t>
|
||||
</h4>
|
||||
</div>
|
||||
|
||||
@@ -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>
|
||||
@@ -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"/>
|
||||
|
||||
@@ -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', '>', 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) {
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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
|
||||
|
||||
|
@@ -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>
|
||||
@@ -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',
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
# - account types
|
||||
|
||||
{
|
||||
"name": "Croatia - RRIF 2012 COA",
|
||||
"name": "Croatia - Accounting (RRIF 2012)",
|
||||
"description": """
|
||||
Croatian localisation.
|
||||
======================
|
||||
|
||||
@@ -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"
|
||||
|
||||
|
@@ -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>
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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,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': """
|
||||
|
||||
@@ -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
@@ -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 ""
|
||||
|
||||
@@ -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([
|
||||
|
||||
@@ -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).')
|
||||
]
|
||||
|
||||
@@ -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 '
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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,
|
||||
})
|
||||
|
||||
@@ -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': [
|
||||
|
||||
@@ -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')
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -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]
|
||||
|
||||
@@ -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', '>', 1)]}"/>
|
||||
<div class="o_row" name="weight" attrs="{'invisible':[('type', 'not in', ['product', 'consu']), ('product_variant_count', '>', 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>
|
||||
|
||||
@@ -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 """
|
||||
|
||||
@@ -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 & 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>
|
||||
|
||||
@@ -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')
|
||||
|
||||
|
||||
@@ -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">
|
||||
|
||||
@@ -59,7 +59,7 @@
|
||||
<search string="Sales Analysis">
|
||||
<field name="date"/>
|
||||
<filter string="This Year" name="year" invisible="1" domain="[('date','<=', time.strftime('%%Y-12-31')),('date','>=',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
Reference in New Issue
Block a user