Compare commits
93 Commits
12_sale_pi
...
12.0-mig-m
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
650db876dd | ||
|
|
cd02a07433 | ||
|
|
b097fb2666 | ||
|
|
fc0ef1a827 | ||
|
|
97712ce234 | ||
|
|
3ac0d60d17 | ||
|
|
5ec76d12d0 | ||
|
|
f13068d356 | ||
|
|
39e257a3a5 | ||
|
|
10a3366096 | ||
|
|
e0d77b3a47 | ||
|
|
4fe833135e | ||
|
|
1632342a99 | ||
|
|
73c8044c47 | ||
|
|
8ed3ed02f9 | ||
|
|
d3cb8aeb79 | ||
|
|
a7a68e8dee | ||
|
|
ce1dac1e11 | ||
|
|
8eae0f32d8 | ||
|
|
3b32dc25af | ||
|
|
67d31f9658 | ||
|
|
1b931d066b | ||
|
|
f605b56a5e | ||
|
|
58f01d9673 | ||
|
|
8878ab5bd1 | ||
|
|
80f5341da0 | ||
|
|
a4ca584e90 | ||
|
|
4d81dee7b4 | ||
|
|
140217da6e | ||
|
|
a9a0a2a999 | ||
|
|
d7f3a70d48 | ||
|
|
1074fcba21 | ||
|
|
0ae76be885 | ||
|
|
59cdcbd173 | ||
|
|
7cf224cf23 | ||
|
|
d0d65ebbca | ||
|
|
ca10381be8 | ||
|
|
44b19dfe60 | ||
|
|
c082baa340 | ||
|
|
15ee1b2f59 | ||
|
|
b080dd11ab | ||
|
|
568e6b41ac | ||
|
|
0dee23aeba | ||
|
|
c7d1e13d0d | ||
|
|
e7fae291ee | ||
|
|
bdfe0ce20a | ||
|
|
32eafedf04 | ||
|
|
ba78791ab1 | ||
|
|
946d169665 | ||
|
|
cd51a6784f | ||
|
|
c01942b1a8 | ||
|
|
e11b29deab | ||
|
|
28be3e4e6a | ||
|
|
5c7985a15c | ||
|
|
9b6c34a860 | ||
|
|
f735f8a34d | ||
|
|
74665bb2e8 | ||
|
|
d1deeeac31 | ||
|
|
e96c3d72eb | ||
|
|
a545c8dbb6 | ||
|
|
07824a0570 | ||
|
|
12bd157ad4 | ||
|
|
53f6ab5d0f | ||
|
|
cc88dd994b | ||
|
|
b99659dcc9 | ||
|
|
581bfe78d8 | ||
|
|
9a174c257d | ||
|
|
941c610c96 | ||
|
|
34a4c573b1 | ||
|
|
f64d190ac3 | ||
|
|
c633660e73 | ||
|
|
0dfe8df8e4 | ||
|
|
0e4a562263 | ||
|
|
253a5ebebe | ||
|
|
73c622956f | ||
|
|
38db0da20a | ||
|
|
361f5d3aae | ||
|
|
499d363daf | ||
|
|
035a3dfd1e | ||
|
|
83fec9264f | ||
|
|
9762b5392b | ||
|
|
fc4ea217e0 | ||
|
|
1812c7f5af | ||
|
|
92a4b0d6ac | ||
|
|
33f67279fb | ||
|
|
66c845f3cf | ||
|
|
8a9c75790a | ||
|
|
0de8425cfa | ||
|
|
f8563c1667 | ||
|
|
60cda426a9 | ||
|
|
fe7f2c00c5 | ||
|
|
76b113ed28 | ||
|
|
5140094633 |
96
account_usability/README.rst
Normal file
96
account_usability/README.rst
Normal file
@@ -0,0 +1,96 @@
|
|||||||
|
=================
|
||||||
|
Account Usability
|
||||||
|
=================
|
||||||
|
|
||||||
|
.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||||
|
!! This file is generated by oca-gen-addon-readme !!
|
||||||
|
!! changes will be overwritten. !!
|
||||||
|
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||||
|
|
||||||
|
.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png
|
||||||
|
:target: https://odoo-community.org/page/development-status
|
||||||
|
:alt: Beta
|
||||||
|
.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png
|
||||||
|
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
|
||||||
|
:alt: License: AGPL-3
|
||||||
|
.. |badge3| image:: https://img.shields.io/badge/github-akretion%2Fodoo--usability-lightgray.png?logo=github
|
||||||
|
:target: https://github.com/akretion/odoo-usability/tree/12.0/account_usability
|
||||||
|
:alt: akretion/odoo-usability
|
||||||
|
|
||||||
|
|badge1| |badge2| |badge3|
|
||||||
|
|
||||||
|
This modules adds the following functions:
|
||||||
|
|
||||||
|
* Add an *Overdue* filter on invoice search view (this feature was previously
|
||||||
|
located in te module *account_invoice_overdue_filter*)
|
||||||
|
* Increase the default limit of 80 lines in account move and account move line view.
|
||||||
|
* disable reconciliation "guessing"
|
||||||
|
* fast search on *Reconcile Ref* for account move line.
|
||||||
|
* add sale dates to invoice report to be compliant with
|
||||||
|
https://www.service-public.fr/professionnels-entreprises/vosdroits/F31808
|
||||||
|
* Sale date on qweb invoices
|
||||||
|
* A wizard to mark several invoices as sent at once (forward from v8)
|
||||||
|
* Default date for Account Move Reversal is now D+1 instead of today
|
||||||
|
* Track more fields on invoice (see details in account.py)
|
||||||
|
* Add boolean fields `has_discount` and `has_attachment` on invoice
|
||||||
|
* Add button "Delete line qty = 0" on supplier invoice
|
||||||
|
* Cut name_get() of invoice if too long
|
||||||
|
* A script for if Odoo screws up invoice attachment filename
|
||||||
|
* help functions for py3o reports
|
||||||
|
* Show code on name_get of journal
|
||||||
|
* add direct search of journal using code
|
||||||
|
* add copy=False on some fields
|
||||||
|
* Add unicity constraint on analytic codes per company
|
||||||
|
* Better default values on account move
|
||||||
|
* Add link from account move line to invoice
|
||||||
|
* Add start_date and end_date on bank statements
|
||||||
|
* Add transfer_account_id to invoicing config page
|
||||||
|
* Improve domain reconciliation widget
|
||||||
|
* account.reconcile.model don't copy name to label via onchange
|
||||||
|
* Add method to get fiscal position without partner_id
|
||||||
|
* Restore drill-through on sale and invoice reports
|
||||||
|
* don't attach PDF upon invoice report generation on supplier invoices/refunds
|
||||||
|
* Add filter on debit and credit amount for Move Lines
|
||||||
|
* Add supplier invoice number in invoice tree view
|
||||||
|
|
||||||
|
Together with this module, I recommend the use of the following modules:
|
||||||
|
|
||||||
|
* account_invoice_supplier_ref_unique (OCA project account-invoicing)
|
||||||
|
* account_move_line_no_default_search (OCA project account-financial-tools)
|
||||||
|
* invoice_fiscal_position_update (OCA project account-invoicing)
|
||||||
|
|
||||||
|
**Table of contents**
|
||||||
|
|
||||||
|
.. contents::
|
||||||
|
:local:
|
||||||
|
|
||||||
|
Bug Tracker
|
||||||
|
===========
|
||||||
|
|
||||||
|
Bugs are tracked on `GitHub Issues <https://github.com/akretion/odoo-usability/issues>`_.
|
||||||
|
In case of trouble, please check there if your issue has already been reported.
|
||||||
|
If you spotted it first, help us smashing it by providing a detailed and welcomed
|
||||||
|
`feedback <https://github.com/akretion/odoo-usability/issues/new?body=module:%20account_usability%0Aversion:%2012.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.
|
||||||
|
|
||||||
|
Do not contact contributors directly about support or help with technical issues.
|
||||||
|
|
||||||
|
Credits
|
||||||
|
=======
|
||||||
|
|
||||||
|
Authors
|
||||||
|
~~~~~~~
|
||||||
|
|
||||||
|
* Akretion
|
||||||
|
|
||||||
|
Contributors
|
||||||
|
~~~~~~~~~~~~
|
||||||
|
|
||||||
|
* Alexis de Lattre <alexis.delattre@akretion.com>
|
||||||
|
* David Beal <david.beal@akretion.com>
|
||||||
|
|
||||||
|
Maintainers
|
||||||
|
~~~~~~~~~~~
|
||||||
|
|
||||||
|
This module is part of the `akretion/odoo-usability <https://github.com/akretion/odoo-usability/tree/12.0/account_usability>`_ project on GitHub.
|
||||||
|
|
||||||
|
You are welcome to contribute.
|
||||||
@@ -4,31 +4,10 @@
|
|||||||
|
|
||||||
{
|
{
|
||||||
'name': 'Account Usability',
|
'name': 'Account Usability',
|
||||||
'version': '10.0.1.0.0',
|
'version': '12.0.1.0.0',
|
||||||
'category': 'Accounting & Finance',
|
'category': 'Accounting & Finance',
|
||||||
'license': 'AGPL-3',
|
'license': 'AGPL-3',
|
||||||
'summary': 'Small usability enhancements in account module',
|
'summary': 'Small usability enhancements in account module',
|
||||||
'description': """
|
|
||||||
Account Usability
|
|
||||||
=================
|
|
||||||
|
|
||||||
The usability enhancements include:
|
|
||||||
* show the supplier invoice number in the tree view of supplier invoices
|
|
||||||
* add an *Overdue* filter on invoice search view (this feature was previously
|
|
||||||
located in te module *account_invoice_overdue_filter*)
|
|
||||||
* increase the default limit of 80 lines in account move and account move line view.
|
|
||||||
* fast search on *Reconcile Ref* for account move line.
|
|
||||||
* disable reconciliation "guessing"
|
|
||||||
* add sale dates to invoice report to be compliant with
|
|
||||||
https://www.service-public.fr/professionnels-entreprises/vosdroits/F31808
|
|
||||||
|
|
||||||
Together with this module, I recommend the use of the following modules:
|
|
||||||
* account_invoice_supplier_ref_unique (OCA project account-invoicing)
|
|
||||||
* account_move_line_no_default_search (OCA project account-financial-tools)
|
|
||||||
* invoice_fiscal_position_update (OCA project account-invoicing)
|
|
||||||
|
|
||||||
This module has been written by Alexis de Lattre from Akretion <alexis.delattre@akretion.com>.
|
|
||||||
""",
|
|
||||||
'author': 'Akretion',
|
'author': 'Akretion',
|
||||||
'website': 'http://www.akretion.com',
|
'website': 'http://www.akretion.com',
|
||||||
'depends': [
|
'depends': [
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ from odoo import models, fields, api, _
|
|||||||
from odoo.tools import float_compare, float_is_zero
|
from odoo.tools import float_compare, float_is_zero
|
||||||
from odoo.tools.misc import formatLang
|
from odoo.tools.misc import formatLang
|
||||||
from odoo.exceptions import UserError, ValidationError
|
from odoo.exceptions import UserError, ValidationError
|
||||||
|
from odoo.osv import expression
|
||||||
from odoo import SUPERUSER_ID
|
from odoo import SUPERUSER_ID
|
||||||
import logging
|
import logging
|
||||||
|
|
||||||
@@ -82,7 +83,7 @@ class AccountInvoice(models.Model):
|
|||||||
# top of the screen
|
# top of the screen
|
||||||
# That's why we have to cut the name_get() when it's too long
|
# That's why we have to cut the name_get() when it's too long
|
||||||
def name_get(self):
|
def name_get(self):
|
||||||
old_res = super(AccountInvoice, self).name_get()
|
old_res = super().name_get()
|
||||||
res = []
|
res = []
|
||||||
for old_re in old_res:
|
for old_re in old_res:
|
||||||
name = old_re[1]
|
name = old_re[1]
|
||||||
@@ -102,9 +103,8 @@ class AccountInvoice(models.Model):
|
|||||||
# 2) the 'name' field of the account.move.line is used in the overdue
|
# 2) the 'name' field of the account.move.line is used in the overdue
|
||||||
# letter, and '/' is not meaningful for our customer !
|
# letter, and '/' is not meaningful for our customer !
|
||||||
# TODO mig to v12
|
# TODO mig to v12
|
||||||
# @api.multi
|
|
||||||
# def action_move_create(self):
|
# def action_move_create(self):
|
||||||
# res = super(AccountInvoice, self).action_move_create()
|
# res = super().action_move_create()
|
||||||
# for inv in self:
|
# for inv in self:
|
||||||
# self._cr.execute(
|
# self._cr.execute(
|
||||||
# "UPDATE account_move_line SET name= "
|
# "UPDATE account_move_line SET name= "
|
||||||
@@ -215,7 +215,15 @@ class AccountInvoiceLine(models.Model):
|
|||||||
class AccountJournal(models.Model):
|
class AccountJournal(models.Model):
|
||||||
_inherit = 'account.journal'
|
_inherit = 'account.journal'
|
||||||
|
|
||||||
@api.multi
|
hide_bank_statement_balance = fields.Boolean(
|
||||||
|
string='Hide Bank Statement Balance',
|
||||||
|
help="You may want to enable this option when your bank "
|
||||||
|
"journal is generated from a bank statement file that "
|
||||||
|
"doesn't handle start/end balance (QIF for instance) and "
|
||||||
|
"you don't want to enter the start/end balance manually: it "
|
||||||
|
"will prevent the display of wrong information in the accounting "
|
||||||
|
"dashboard and on bank statements.")
|
||||||
|
|
||||||
@api.depends(
|
@api.depends(
|
||||||
'name', 'currency_id', 'company_id', 'company_id.currency_id', 'code')
|
'name', 'currency_id', 'company_id', 'company_id.currency_id', 'code')
|
||||||
def name_get(self):
|
def name_get(self):
|
||||||
@@ -261,7 +269,6 @@ class AccountJournal(models.Model):
|
|||||||
class AccountAccount(models.Model):
|
class AccountAccount(models.Model):
|
||||||
_inherit = 'account.account'
|
_inherit = 'account.account'
|
||||||
|
|
||||||
@api.multi
|
|
||||||
@api.depends('name', 'code')
|
@api.depends('name', 'code')
|
||||||
def name_get(self):
|
def name_get(self):
|
||||||
if self._context.get('account_account_show_code_only'):
|
if self._context.get('account_account_show_code_only'):
|
||||||
@@ -270,7 +277,7 @@ class AccountAccount(models.Model):
|
|||||||
res.append((record.id, record.code))
|
res.append((record.id, record.code))
|
||||||
return res
|
return res
|
||||||
else:
|
else:
|
||||||
return super(AccountAccount, self).name_get()
|
return super().name_get()
|
||||||
|
|
||||||
# https://github.com/odoo/odoo/issues/23040
|
# https://github.com/odoo/odoo/issues/23040
|
||||||
# TODO mig to v12
|
# TODO mig to v12
|
||||||
@@ -353,7 +360,6 @@ class AccountAccount(models.Model):
|
|||||||
class AccountAnalyticAccount(models.Model):
|
class AccountAnalyticAccount(models.Model):
|
||||||
_inherit = 'account.analytic.account'
|
_inherit = 'account.analytic.account'
|
||||||
|
|
||||||
@api.multi
|
|
||||||
def name_get(self):
|
def name_get(self):
|
||||||
if self._context.get('analytic_account_show_code_only'):
|
if self._context.get('analytic_account_show_code_only'):
|
||||||
res = []
|
res = []
|
||||||
@@ -361,7 +367,7 @@ class AccountAnalyticAccount(models.Model):
|
|||||||
res.append((record.id, record.code or record.name))
|
res.append((record.id, record.code or record.name))
|
||||||
return res
|
return res
|
||||||
else:
|
else:
|
||||||
return super(AccountAnalyticAccount, self).name_get()
|
return super().name_get()
|
||||||
|
|
||||||
_sql_constraints = [(
|
_sql_constraints = [(
|
||||||
'code_company_unique',
|
'code_company_unique',
|
||||||
@@ -508,8 +514,9 @@ class AccountBankStatement(models.Model):
|
|||||||
end_date = fields.Date(
|
end_date = fields.Date(
|
||||||
compute='_compute_dates', string='End Date', readonly=True,
|
compute='_compute_dates', string='End Date', readonly=True,
|
||||||
store=True)
|
store=True)
|
||||||
|
hide_bank_statement_balance = fields.Boolean(
|
||||||
|
related='journal_id.hide_bank_statement_balance', readonly=True)
|
||||||
|
|
||||||
@api.multi
|
|
||||||
@api.depends('line_ids.date')
|
@api.depends('line_ids.date')
|
||||||
def _compute_dates(self):
|
def _compute_dates(self):
|
||||||
for st in self:
|
for st in self:
|
||||||
@@ -517,7 +524,14 @@ class AccountBankStatement(models.Model):
|
|||||||
st.start_date = dates and min(dates) or False
|
st.start_date = dates and min(dates) or False
|
||||||
st.end_date = dates and max(dates) or False
|
st.end_date = dates and max(dates) or False
|
||||||
|
|
||||||
@api.multi
|
def _balance_check(self):
|
||||||
|
for stmt in self:
|
||||||
|
if stmt.hide_bank_statement_balance:
|
||||||
|
continue
|
||||||
|
else:
|
||||||
|
super(AccountBankStatement, stmt)._balance_check()
|
||||||
|
return True
|
||||||
|
|
||||||
@api.depends('name', 'start_date', 'end_date')
|
@api.depends('name', 'start_date', 'end_date')
|
||||||
def name_get(self):
|
def name_get(self):
|
||||||
res = []
|
res = []
|
||||||
@@ -555,15 +569,14 @@ class AccountBankStatementLine(models.Model):
|
|||||||
# search_reconciliation_proposition=False, context=None):
|
# search_reconciliation_proposition=False, context=None):
|
||||||
# # Make variable name shorted for PEP8 !
|
# # Make variable name shorted for PEP8 !
|
||||||
# search_rec_prop = search_reconciliation_proposition
|
# search_rec_prop = search_reconciliation_proposition
|
||||||
# return super(AccountBankStatementLine, self).\
|
# return super().\
|
||||||
# get_data_for_reconciliations(
|
# get_data_for_reconciliations(
|
||||||
# cr, uid, ids, excluded_ids=excluded_ids,
|
# cr, uid, ids, excluded_ids=excluded_ids,
|
||||||
# search_reconciliation_proposition=search_rec_prop,
|
# search_reconciliation_proposition=search_rec_prop,
|
||||||
# context=context)
|
# context=context)
|
||||||
|
|
||||||
def _prepare_reconciliation_move(self, move_ref):
|
def _prepare_reconciliation_move(self, move_ref):
|
||||||
vals = super(AccountBankStatementLine, self).\
|
vals = super()._prepare_reconciliation_move(move_ref)
|
||||||
_prepare_reconciliation_move(move_ref)
|
|
||||||
# By default, ref contains the name of the statement + name of the
|
# By default, ref contains the name of the statement + name of the
|
||||||
# statement line. It causes 2 problems:
|
# statement line. It causes 2 problems:
|
||||||
# 1) The 'ref' field is too big
|
# 1) The 'ref' field is too big
|
||||||
@@ -581,13 +594,13 @@ class AccountBankStatementLine(models.Model):
|
|||||||
def show_account_move(self):
|
def show_account_move(self):
|
||||||
self.ensure_one()
|
self.ensure_one()
|
||||||
action = self.env['ir.actions.act_window'].for_xml_id(
|
action = self.env['ir.actions.act_window'].for_xml_id(
|
||||||
'account', 'action_move_journal_line')
|
'account', 'action_move_line_form')
|
||||||
if self.journal_entry_ids:
|
if self.journal_entry_ids:
|
||||||
action.update({
|
action.update({
|
||||||
'views': False,
|
'views': False,
|
||||||
'view_id': False,
|
'view_id': False,
|
||||||
'view_mode': 'form,tree',
|
'view_mode': 'form,tree',
|
||||||
'res_id': self.journal_entry_ids[0].id,
|
'res_id': self.journal_entry_ids[0].move_id.id,
|
||||||
})
|
})
|
||||||
return action
|
return action
|
||||||
else:
|
else:
|
||||||
@@ -659,3 +672,35 @@ class AccountIncoterms(models.Model):
|
|||||||
for rec in self:
|
for rec in self:
|
||||||
res.append((rec.id, '[%s] %s' % (rec.code, rec.name)))
|
res.append((rec.id, '[%s] %s' % (rec.code, rec.name)))
|
||||||
return res
|
return res
|
||||||
|
|
||||||
|
|
||||||
|
class AccountReconciliation(models.AbstractModel):
|
||||||
|
_inherit = 'account.reconciliation.widget'
|
||||||
|
|
||||||
|
# Add ability to filter by account code in the work interface of the
|
||||||
|
# bank statement
|
||||||
|
@api.model
|
||||||
|
def _domain_move_lines(self, search_str):
|
||||||
|
str_domain = super()._domain_move_lines(search_str)
|
||||||
|
account_code_domain = [('account_id.code', '=ilike', search_str + '%')]
|
||||||
|
str_domain = expression.OR([str_domain, account_code_domain])
|
||||||
|
return str_domain
|
||||||
|
|
||||||
|
@api.model
|
||||||
|
def _domain_move_lines_for_reconciliation(
|
||||||
|
self, st_line, aml_accounts, partner_id,
|
||||||
|
excluded_ids=None, search_str=False):
|
||||||
|
domain = super()._domain_move_lines_for_reconciliation(
|
||||||
|
st_line, aml_accounts, partner_id,
|
||||||
|
excluded_ids=excluded_ids, search_str=search_str)
|
||||||
|
# We want to replace a domain item by another one
|
||||||
|
position = domain.index(('payment_id', '<>', False))
|
||||||
|
domain[position] = ['journal_id', '=', st_line.journal_id.id]
|
||||||
|
return domain
|
||||||
|
|
||||||
|
|
||||||
|
class ResConfigSettings(models.TransientModel):
|
||||||
|
_inherit = 'res.config.settings'
|
||||||
|
|
||||||
|
transfer_account_id = fields.Many2one(
|
||||||
|
related='company_id.transfer_account_id', readonly=False)
|
||||||
|
|||||||
@@ -1,53 +1,13 @@
|
|||||||
diff --git a/addons/account/models/account_bank_statement.py b/addons/account/models/account_bank_statement.py
|
diff --git a/addons/account/static/src/js/reconciliation/reconciliation_renderer.js b/addons/account/static/src/js/reconciliation/reconciliation_renderer.js
|
||||||
index 8ed1e48..615da43 100644
|
index 53f28e0c620..1721d01edf9 100644
|
||||||
--- a/addons/account/models/account_bank_statement.py
|
--- a/addons/account/static/src/js/reconciliation/reconciliation_renderer.js
|
||||||
+++ b/addons/account/models/account_bank_statement.py
|
+++ b/addons/account/static/src/js/reconciliation/reconciliation_renderer.js
|
||||||
@@ -563,7 +563,13 @@ class AccountBankStatementLine(models.Model):
|
@@ -514,7 +514,7 @@ var LineRenderer = Widget.extend(FieldManagerMixin, {
|
||||||
"""
|
}
|
||||||
# Blue lines = payment on bank account not assigned to a statement yet
|
return this.model.makeRecord('account.bank.statement.line', [field], {
|
||||||
reconciliation_aml_accounts = [self.journal_id.default_credit_account_id.id, self.journal_id.default_debit_account_id.id]
|
partner_id: {
|
||||||
- domain_reconciliation = ['&', '&', ('statement_id', '=', False), ('account_id', 'in', reconciliation_aml_accounts), ('payment_id','<>', False)]
|
- domain: ["|", ["is_company", "=", true], ["parent_id", "=", false], "|", ["customer", "=", true], ["supplier", "=", true]],
|
||||||
+ # AKRETION HACK 11/7/2017
|
+ domain: ["|", ["is_company", "=", true], ["parent_id", "=", false]],
|
||||||
+ # Remove ('payment_id','<>', False) in order to allow to select move lines
|
options: {
|
||||||
+ # generated from payment orders or check deposit
|
no_open: true
|
||||||
+ # but I add ('journal_id', '=', self.journal_id.id) to exclude the
|
}
|
||||||
+ # opening entry of the first fiscal year
|
|
||||||
+ #domain_reconciliation = ['&', '&', ('statement_id', '=', False), ('account_id', 'in', reconciliation_aml_accounts), ('payment_id','<>', False)]
|
|
||||||
+ domain_reconciliation = ['&', '&', ('statement_id', '=', False), ('account_id', 'in', reconciliation_aml_accounts), ('journal_id', '=', self.journal_id.id)]
|
|
||||||
|
|
||||||
# Black lines = unreconciled & (not linked to a payment or open balance created by statement
|
|
||||||
domain_matching = [('reconciled', '=', False)]
|
|
||||||
diff --git a/addons/account/models/account_move.py b/addons/account/models/account_move.py
|
|
||||||
index b60ffbe..6c27c57 100644
|
|
||||||
--- a/addons/account/models/account_move.py
|
|
||||||
+++ b/addons/account/models/account_move.py
|
|
||||||
@@ -599,6 +599,7 @@ class AccountMoveLine(models.Model):
|
|
||||||
domain = expression.AND([domain, [('id', 'not in', excluded_ids)]])
|
|
||||||
if str:
|
|
||||||
str_domain = [
|
|
||||||
+ '|', ('account_id.code', '=ilike', str + '%'),
|
|
||||||
'|', ('move_id.name', 'ilike', str),
|
|
||||||
'|', ('move_id.ref', 'ilike', str),
|
|
||||||
'|', ('date_maturity', 'like', str),
|
|
||||||
diff --git a/addons/account/static/src/js/account_reconciliation_widgets.js b/addons/account/static/src/js/account_reconciliation_widgets.js
|
|
||||||
index 453bd41..48c396e 100644
|
|
||||||
--- a/addons/account/static/src/js/account_reconciliation_widgets.js
|
|
||||||
+++ b/addons/account/static/src/js/account_reconciliation_widgets.js
|
|
||||||
@@ -76,7 +76,7 @@ var abstractReconciliation = Widget.extend(ControlPanelMixin, {
|
|
||||||
this.model_res_users = new Model("res.users");
|
|
||||||
this.model_tax = new Model("account.tax");
|
|
||||||
this.model_presets = new Model("account.reconcile.model");
|
|
||||||
- this.max_move_lines_displayed = 5;
|
|
||||||
+ this.max_move_lines_displayed = 15;
|
|
||||||
// Number of reconciliations loaded initially and by clicking 'show more'
|
|
||||||
this.num_reconciliations_fetched_in_batch = 10;
|
|
||||||
this.animation_speed = 100; // "Blocking" animations
|
|
||||||
@@ -1755,7 +1755,7 @@ var bankStatementReconciliationLine = abstractReconciliationLine.extend({
|
|
||||||
relation: "res.partner",
|
|
||||||
string: _t("Partner"),
|
|
||||||
type: "many2one",
|
|
||||||
- domain: [['parent_id','=',false], '|', ['customer','=',true], ['supplier','=',true]],
|
|
||||||
+ domain: [['parent_id','=',false]], // AKRETION HACK 26/6/2017 allow all parent partners
|
|
||||||
help: "",
|
|
||||||
readonly: false,
|
|
||||||
required: true,
|
|
||||||
|
|||||||
@@ -1,14 +0,0 @@
|
|||||||
diff --git a/addons/account/models/account_bank_statement.py b/addons/account/models/account_bank_statement.py
|
|
||||||
index 4374528..aea1361 100644
|
|
||||||
--- a/addons/account/models/account_bank_statement.py
|
|
||||||
+++ b/addons/account/models/account_bank_statement.py
|
|
||||||
@@ -1008,7 +1008,7 @@ class AccountBankStatementLine(models.Model):
|
|
||||||
#record the move name on the statement line to be able to retrieve it in case of unreconciliation
|
|
||||||
self.write({'move_name': move.name})
|
|
||||||
payment.write({'payment_reference': move.name})
|
|
||||||
- elif self.move_name:
|
|
||||||
- raise UserError(_('Operation not allowed. Since your statement line already received a number, you cannot reconcile it entirely with existing journal entries otherwise it would make a gap in the numbering. You should book an entry and make a regular revert of it in case you want to cancel it.'))
|
|
||||||
+ #elif self.move_name:
|
|
||||||
+ # raise UserError(_('Operation not allowed. Since your statement line already received a number, you cannot reconcile it entirely with existing journal entries otherwise it would make a gap in the numbering. You should book an entry and make a regular revert of it in case you want to cancel it.'))
|
|
||||||
counterpart_moves.assert_balanced()
|
|
||||||
return counterpart_moves
|
|
||||||
@@ -360,8 +360,9 @@ module -->
|
|||||||
<field name="model">account.move.line</field>
|
<field name="model">account.move.line</field>
|
||||||
<field name="inherit_id" ref="account.view_move_line_tree"/>
|
<field name="inherit_id" ref="account.view_move_line_tree"/>
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<!-- Move reconcile_id to a better position -->
|
<field name="full_reconcile_id" position="attributes">
|
||||||
<field name="full_reconcile_id" position="replace"/>
|
<attribute name="invisible">1</attribute>
|
||||||
|
</field>
|
||||||
<field name="credit" position="after">
|
<field name="credit" position="after">
|
||||||
<field name="balance" sum="Total Balance"/>
|
<field name="balance" sum="Total Balance"/>
|
||||||
<field name="reconcile_string"/>
|
<field name="reconcile_string"/>
|
||||||
@@ -408,6 +409,31 @@ module -->
|
|||||||
</field>
|
</field>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
|
<record id="view_account_journal_form" model="ir.ui.view">
|
||||||
|
<field name="name">usability.account.journal.form</field>
|
||||||
|
<field name="model">account.journal</field>
|
||||||
|
<field name="inherit_id" ref="account.view_account_journal_form"/>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<field name="bank_statements_source" position="after">
|
||||||
|
<field name="hide_bank_statement_balance" groups="account.group_account_user"/>
|
||||||
|
</field>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="account_journal_dashboard_kanban_view" model="ir.ui.view">
|
||||||
|
<field name="name">usability.account.journal.dashboard</field>
|
||||||
|
<field name="model">account.journal</field>
|
||||||
|
<field name="inherit_id" ref="account.account_journal_dashboard_kanban_view"/>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<field name="kanban_dashboard" position="after">
|
||||||
|
<field name="hide_bank_statement_balance"/>
|
||||||
|
</field>
|
||||||
|
<xpath expr="//div[@name='latest_statement']/.." position="attributes">
|
||||||
|
<attribute name="t-if">dashboard.last_balance != dashboard.account_balance && !record.hide_bank_statement_balance.raw_value</attribute>
|
||||||
|
</xpath>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
<record id="view_account_journal_tree" model="ir.ui.view">
|
<record id="view_account_journal_tree" model="ir.ui.view">
|
||||||
<field name="name">usability.account.journal.tree</field>
|
<field name="name">usability.account.journal.tree</field>
|
||||||
<field name="model">account.journal</field>
|
<field name="model">account.journal</field>
|
||||||
@@ -440,16 +466,32 @@ module -->
|
|||||||
<xpath expr="//field[@name='line_ids']/tree/field[@name='bank_account_id']" position="after">
|
<xpath expr="//field[@name='line_ids']/tree/field[@name='bank_account_id']" position="after">
|
||||||
<!-- The cancel button is provided by the account_cancel module, but we don't want to depend on it -->
|
<!-- The cancel button is provided by the account_cancel module, but we don't want to depend on it -->
|
||||||
<button name="show_account_move" type="object"
|
<button name="show_account_move" type="object"
|
||||||
string="View Account Move" icon="fa fa-arrow-right"
|
string="View Account Move" icon="fa-arrow-right"
|
||||||
attrs="{'invisible': [('journal_entry_ids', '=', [])]}"/>
|
attrs="{'invisible': [('journal_entry_ids', '=', [])]}"/>
|
||||||
</xpath>
|
</xpath>
|
||||||
<field name="date" position="after">
|
<field name="date" position="after">
|
||||||
<field name="start_date"/>
|
<field name="start_date"/>
|
||||||
<field name="end_date"/>
|
<field name="end_date"/>
|
||||||
|
<field name="hide_bank_statement_balance" invisible="1"/>
|
||||||
</field>
|
</field>
|
||||||
<field name="date" position="attributes">
|
<field name="date" position="attributes">
|
||||||
<attribute name="invisible">1</attribute>
|
<attribute name="invisible">1</attribute>
|
||||||
</field>
|
</field>
|
||||||
|
<label for="balance_start" position="attributes">
|
||||||
|
<attribute name="attrs">{'invisible': [('hide_bank_statement_balance', '=', True)]}</attribute>
|
||||||
|
</label>
|
||||||
|
<label for="balance_end_real" position="attributes">
|
||||||
|
<attribute name="attrs">{'invisible': [('hide_bank_statement_balance', '=', True)]}</attribute>
|
||||||
|
</label>
|
||||||
|
<xpath expr="//field[@name='balance_start']/.." position="attributes">
|
||||||
|
<attribute name="attrs">{'invisible': [('hide_bank_statement_balance', '=', True)]}</attribute>
|
||||||
|
</xpath>
|
||||||
|
<xpath expr="//field[@name='balance_end_real']/.." position="attributes">
|
||||||
|
<attribute name="attrs">{'invisible': [('hide_bank_statement_balance', '=', True)]}</attribute>
|
||||||
|
</xpath>
|
||||||
|
<group name="sale_total" position="attributes">
|
||||||
|
<attribute name="attrs">{'invisible': [('hide_bank_statement_balance', '=', True)]}</attribute>
|
||||||
|
</group>
|
||||||
</field>
|
</field>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
@@ -537,6 +579,28 @@ module -->
|
|||||||
|
|
||||||
<menuitem id="account_tax_group_menu" action="account_tax_group_action" parent="account.account_account_menu" sequence="2"/>
|
<menuitem id="account_tax_group_menu" action="account_tax_group_action" parent="account.account_account_menu" sequence="2"/>
|
||||||
|
|
||||||
|
<!-- Account config page -->
|
||||||
|
<record id="res_config_settings_view_form" model="ir.ui.view">
|
||||||
|
<field name="name">account_usability account config page</field>
|
||||||
|
<field name="model">res.config.settings</field>
|
||||||
|
<field name="inherit_id" ref="account.res_config_settings_view_form"/>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<xpath expr="//field[@name='account_bank_reconciliation_start']/../.." position="after">
|
||||||
|
<div class="col-xs-12 col-md-6 o_setting_box">
|
||||||
|
<div class="o_setting_left_pane"/>
|
||||||
|
<div class="o_setting_right_pane">
|
||||||
|
<label for="transfer_account_id"/>
|
||||||
|
<div class="text-muted">
|
||||||
|
Transit account when you transfer money from a bank account of your company to another bank account of your company.
|
||||||
|
</div>
|
||||||
|
<field name="transfer_account_id"/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</xpath>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
|
||||||
<!-- Remove menu entry "Accounting > Configuration > Accounting > Bank Accounts"
|
<!-- Remove menu entry "Accounting > Configuration > Accounting > Bank Accounts"
|
||||||
(account.journal filtered on type = 'bank' with special tree and form view)
|
(account.journal filtered on type = 'bank' with special tree and form view)
|
||||||
because it is useless and confusing -->
|
because it is useless and confusing -->
|
||||||
|
|||||||
@@ -1,33 +1,33 @@
|
|||||||
diff --git a/addons/account/models/account_payment.py b/addons/account/models/account_payment.py
|
diff --git a/addons/account/models/account_payment.py b/addons/account/models/account_payment.py
|
||||||
index b1d8012329d..b8a8e2a673d 100644
|
index f38f459c533..a475d6a82c7 100644
|
||||||
--- a/addons/account/models/account_payment.py
|
--- a/addons/account/models/account_payment.py
|
||||||
+++ b/addons/account/models/account_payment.py
|
+++ b/addons/account/models/account_payment.py
|
||||||
@@ -210,6 +210,7 @@ class account_payment(models.Model):
|
@@ -62,6 +62,7 @@ class account_abstract_payment(models.AbstractModel):
|
||||||
payment_difference = fields.Monetary(compute='_compute_payment_difference', readonly=True)
|
payment_difference = fields.Monetary(compute='_compute_payment_difference', readonly=True)
|
||||||
payment_difference_handling = fields.Selection([('open', 'Keep open'), ('reconcile', 'Mark invoice as fully paid')], default='open', string="Payment Difference", copy=False)
|
payment_difference_handling = fields.Selection([('open', 'Keep open'), ('reconcile', 'Mark invoice as fully paid')], default='open', string="Payment Difference Handling", copy=False)
|
||||||
writeoff_account_id = fields.Many2one('account.account', string="Difference Account", domain=[('deprecated', '=', False)], copy=False)
|
writeoff_account_id = fields.Many2one('account.account', string="Difference Account", domain=[('deprecated', '=', False)], copy=False)
|
||||||
+ writeoff_analytic_account_id = fields.Many2one('account.analytic.account', string="Difference Analytic Account", copy=False)
|
+ writeoff_analytic_account_id = fields.Many2one('account.analytic.account', string="Difference Analytic Account", copy=False)
|
||||||
|
writeoff_label = fields.Char(
|
||||||
# FIXME: ondelete='restrict' not working (eg. cancel a bank statement reconciliation with a payment)
|
string='Journal Item Label',
|
||||||
move_line_ids = fields.One2many('account.move.line', 'payment_id', readonly=True, copy=False, ondelete='restrict')
|
help='Change label of the counterpart that will hold the payment difference',
|
||||||
@@ -431,6 +432,7 @@ class account_payment(models.Model):
|
@@ -717,6 +718,7 @@ class account_payment(models.Model):
|
||||||
amount_currency_wo = -abs(amount_currency_wo)
|
debit_wo, credit_wo, amount_currency_wo, currency_id = aml_obj.with_context(date=self.payment_date)._compute_amount_fields(self.payment_difference, self.currency_id, self.company_id.currency_id)
|
||||||
writeoff_line['name'] = _('Counterpart')
|
writeoff_line['name'] = self.writeoff_label
|
||||||
writeoff_line['account_id'] = self.writeoff_account_id.id
|
writeoff_line['account_id'] = self.writeoff_account_id.id
|
||||||
+ writeoff_line['analytic_account_id'] = self.writeoff_analytic_account_id.id or False
|
+ writeoff_line['analytic_account_id'] = self.writeoff_analytic_account_id.id or False
|
||||||
writeoff_line['debit'] = debit_wo
|
writeoff_line['debit'] = debit_wo
|
||||||
writeoff_line['credit'] = credit_wo
|
writeoff_line['credit'] = credit_wo
|
||||||
writeoff_line['amount_currency'] = amount_currency_wo
|
writeoff_line['amount_currency'] = amount_currency_wo
|
||||||
diff --git a/addons/account/views/account_payment_view.xml b/addons/account/views/account_payment_view.xml
|
diff --git a/addons/account/views/account_payment_view.xml b/addons/account/views/account_payment_view.xml
|
||||||
index 2460458fbaa..4065d8f9952 100644
|
index 07230902ee8..1359009bf23 100644
|
||||||
--- a/addons/account/views/account_payment_view.xml
|
--- a/addons/account/views/account_payment_view.xml
|
||||||
+++ b/addons/account/views/account_payment_view.xml
|
+++ b/addons/account/views/account_payment_view.xml
|
||||||
@@ -206,6 +206,8 @@
|
@@ -277,6 +277,8 @@
|
||||||
</div>
|
<div attrs="{'invisible': [('payment_difference_handling','=','open')]}">
|
||||||
<field name="writeoff_account_id" string="Post Difference In"
|
<label for="writeoff_account_id" class="oe_edit_only" string="Post Difference In"/>
|
||||||
attrs="{'invisible': [('payment_difference_handling','=','open')], 'required': [('payment_difference_handling', '=', 'reconcile')]}"/>
|
<field name="writeoff_account_id" string="Post Difference In" attrs="{'required': [('payment_difference_handling', '=', 'reconcile')]}"/>
|
||||||
+ <field name="writeoff_analytic_account_id" string="Post Difference In Analytic Account"
|
+ <label for="writeoff_analytic_account_id" class="oe_edit_only" string="Analytic Account" groups="analytic.group_analytic_accounting"/>
|
||||||
+ attrs="{'invisible': [('payment_difference_handling','=','open')]}"/>
|
+ <field name="writeoff_analytic_account_id" groups="analytic.group_analytic_accounting"/>
|
||||||
</group>
|
<label for="journal_id" string="Journal" attrs="{'invisible': [('amount', '!=', 0)]}"/>
|
||||||
</group>
|
<field name="journal_id" string="Journal" widget="selection" attrs="{'invisible': [('amount', '!=', 0)]}"/>
|
||||||
</sheet>
|
<label for="writeoff_label" class="oe_edit_only" string="Label"/>
|
||||||
|
|||||||
2
account_usability/readme/CONTRIBUTORS.rst
Normal file
2
account_usability/readme/CONTRIBUTORS.rst
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
* Alexis de Lattre <alexis.delattre@akretion.com>
|
||||||
|
* David Beal <david.beal@akretion.com>
|
||||||
39
account_usability/readme/DESCRIPTION.rst
Normal file
39
account_usability/readme/DESCRIPTION.rst
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
This modules adds the following functions:
|
||||||
|
|
||||||
|
* Add an *Overdue* filter on invoice search view (this feature was previously
|
||||||
|
located in te module *account_invoice_overdue_filter*)
|
||||||
|
* Increase the default limit of 80 lines in account move and account move line view.
|
||||||
|
* disable reconciliation "guessing"
|
||||||
|
* fast search on *Reconcile Ref* for account move line.
|
||||||
|
* add sale dates to invoice report to be compliant with
|
||||||
|
https://www.service-public.fr/professionnels-entreprises/vosdroits/F31808
|
||||||
|
* Sale date on qweb invoices
|
||||||
|
* A wizard to mark several invoices as sent at once (forward from v8)
|
||||||
|
* Default date for Account Move Reversal is now D+1 instead of today
|
||||||
|
* Track more fields on invoice (see details in account.py)
|
||||||
|
* Add boolean fields `has_discount` and `has_attachment` on invoice
|
||||||
|
* Add button "Delete line qty = 0" on supplier invoice
|
||||||
|
* Cut name_get() of invoice if too long
|
||||||
|
* A script for if Odoo screws up invoice attachment filename
|
||||||
|
* help functions for py3o reports
|
||||||
|
* Show code on name_get of journal
|
||||||
|
* add direct search of journal using code
|
||||||
|
* add copy=False on some fields
|
||||||
|
* Add unicity constraint on analytic codes per company
|
||||||
|
* Better default values on account move
|
||||||
|
* Add link from account move line to invoice
|
||||||
|
* Add start_date and end_date on bank statements
|
||||||
|
* Add transfer_account_id to invoicing config page
|
||||||
|
* Improve domain reconciliation widget
|
||||||
|
* account.reconcile.model don't copy name to label via onchange
|
||||||
|
* Add method to get fiscal position without partner_id
|
||||||
|
* Restore drill-through on sale and invoice reports
|
||||||
|
* don't attach PDF upon invoice report generation on supplier invoices/refunds
|
||||||
|
* Add filter on debit and credit amount for Move Lines
|
||||||
|
* Add supplier invoice number in invoice tree view
|
||||||
|
|
||||||
|
Together with this module, I recommend the use of the following modules:
|
||||||
|
|
||||||
|
* account_invoice_supplier_ref_unique (OCA project account-invoicing)
|
||||||
|
* account_move_line_no_default_search (OCA project account-financial-tools)
|
||||||
|
* invoice_fiscal_position_update (OCA project account-invoicing)
|
||||||
454
account_usability/static/description/index.html
Normal file
454
account_usability/static/description/index.html
Normal file
@@ -0,0 +1,454 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8" ?>
|
||||||
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||||
|
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||||
|
<meta name="generator" content="Docutils 0.15.1: http://docutils.sourceforge.net/" />
|
||||||
|
<title>Account Usability</title>
|
||||||
|
<style type="text/css">
|
||||||
|
|
||||||
|
/*
|
||||||
|
:Author: David Goodger (goodger@python.org)
|
||||||
|
:Id: $Id: html4css1.css 7952 2016-07-26 18:15:59Z milde $
|
||||||
|
:Copyright: This stylesheet has been placed in the public domain.
|
||||||
|
|
||||||
|
Default cascading style sheet for the HTML output of Docutils.
|
||||||
|
|
||||||
|
See http://docutils.sf.net/docs/howto/html-stylesheets.html for how to
|
||||||
|
customize this style sheet.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* used to remove borders from tables and images */
|
||||||
|
.borderless, table.borderless td, table.borderless th {
|
||||||
|
border: 0 }
|
||||||
|
|
||||||
|
table.borderless td, table.borderless th {
|
||||||
|
/* Override padding for "table.docutils td" with "! important".
|
||||||
|
The right padding separates the table cells. */
|
||||||
|
padding: 0 0.5em 0 0 ! important }
|
||||||
|
|
||||||
|
.first {
|
||||||
|
/* Override more specific margin styles with "! important". */
|
||||||
|
margin-top: 0 ! important }
|
||||||
|
|
||||||
|
.last, .with-subtitle {
|
||||||
|
margin-bottom: 0 ! important }
|
||||||
|
|
||||||
|
.hidden {
|
||||||
|
display: none }
|
||||||
|
|
||||||
|
.subscript {
|
||||||
|
vertical-align: sub;
|
||||||
|
font-size: smaller }
|
||||||
|
|
||||||
|
.superscript {
|
||||||
|
vertical-align: super;
|
||||||
|
font-size: smaller }
|
||||||
|
|
||||||
|
a.toc-backref {
|
||||||
|
text-decoration: none ;
|
||||||
|
color: black }
|
||||||
|
|
||||||
|
blockquote.epigraph {
|
||||||
|
margin: 2em 5em ; }
|
||||||
|
|
||||||
|
dl.docutils dd {
|
||||||
|
margin-bottom: 0.5em }
|
||||||
|
|
||||||
|
object[type="image/svg+xml"], object[type="application/x-shockwave-flash"] {
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Uncomment (and remove this text!) to get bold-faced definition list terms
|
||||||
|
dl.docutils dt {
|
||||||
|
font-weight: bold }
|
||||||
|
*/
|
||||||
|
|
||||||
|
div.abstract {
|
||||||
|
margin: 2em 5em }
|
||||||
|
|
||||||
|
div.abstract p.topic-title {
|
||||||
|
font-weight: bold ;
|
||||||
|
text-align: center }
|
||||||
|
|
||||||
|
div.admonition, div.attention, div.caution, div.danger, div.error,
|
||||||
|
div.hint, div.important, div.note, div.tip, div.warning {
|
||||||
|
margin: 2em ;
|
||||||
|
border: medium outset ;
|
||||||
|
padding: 1em }
|
||||||
|
|
||||||
|
div.admonition p.admonition-title, div.hint p.admonition-title,
|
||||||
|
div.important p.admonition-title, div.note p.admonition-title,
|
||||||
|
div.tip p.admonition-title {
|
||||||
|
font-weight: bold ;
|
||||||
|
font-family: sans-serif }
|
||||||
|
|
||||||
|
div.attention p.admonition-title, div.caution p.admonition-title,
|
||||||
|
div.danger p.admonition-title, div.error p.admonition-title,
|
||||||
|
div.warning p.admonition-title, .code .error {
|
||||||
|
color: red ;
|
||||||
|
font-weight: bold ;
|
||||||
|
font-family: sans-serif }
|
||||||
|
|
||||||
|
/* Uncomment (and remove this text!) to get reduced vertical space in
|
||||||
|
compound paragraphs.
|
||||||
|
div.compound .compound-first, div.compound .compound-middle {
|
||||||
|
margin-bottom: 0.5em }
|
||||||
|
|
||||||
|
div.compound .compound-last, div.compound .compound-middle {
|
||||||
|
margin-top: 0.5em }
|
||||||
|
*/
|
||||||
|
|
||||||
|
div.dedication {
|
||||||
|
margin: 2em 5em ;
|
||||||
|
text-align: center ;
|
||||||
|
font-style: italic }
|
||||||
|
|
||||||
|
div.dedication p.topic-title {
|
||||||
|
font-weight: bold ;
|
||||||
|
font-style: normal }
|
||||||
|
|
||||||
|
div.figure {
|
||||||
|
margin-left: 2em ;
|
||||||
|
margin-right: 2em }
|
||||||
|
|
||||||
|
div.footer, div.header {
|
||||||
|
clear: both;
|
||||||
|
font-size: smaller }
|
||||||
|
|
||||||
|
div.line-block {
|
||||||
|
display: block ;
|
||||||
|
margin-top: 1em ;
|
||||||
|
margin-bottom: 1em }
|
||||||
|
|
||||||
|
div.line-block div.line-block {
|
||||||
|
margin-top: 0 ;
|
||||||
|
margin-bottom: 0 ;
|
||||||
|
margin-left: 1.5em }
|
||||||
|
|
||||||
|
div.sidebar {
|
||||||
|
margin: 0 0 0.5em 1em ;
|
||||||
|
border: medium outset ;
|
||||||
|
padding: 1em ;
|
||||||
|
background-color: #ffffee ;
|
||||||
|
width: 40% ;
|
||||||
|
float: right ;
|
||||||
|
clear: right }
|
||||||
|
|
||||||
|
div.sidebar p.rubric {
|
||||||
|
font-family: sans-serif ;
|
||||||
|
font-size: medium }
|
||||||
|
|
||||||
|
div.system-messages {
|
||||||
|
margin: 5em }
|
||||||
|
|
||||||
|
div.system-messages h1 {
|
||||||
|
color: red }
|
||||||
|
|
||||||
|
div.system-message {
|
||||||
|
border: medium outset ;
|
||||||
|
padding: 1em }
|
||||||
|
|
||||||
|
div.system-message p.system-message-title {
|
||||||
|
color: red ;
|
||||||
|
font-weight: bold }
|
||||||
|
|
||||||
|
div.topic {
|
||||||
|
margin: 2em }
|
||||||
|
|
||||||
|
h1.section-subtitle, h2.section-subtitle, h3.section-subtitle,
|
||||||
|
h4.section-subtitle, h5.section-subtitle, h6.section-subtitle {
|
||||||
|
margin-top: 0.4em }
|
||||||
|
|
||||||
|
h1.title {
|
||||||
|
text-align: center }
|
||||||
|
|
||||||
|
h2.subtitle {
|
||||||
|
text-align: center }
|
||||||
|
|
||||||
|
hr.docutils {
|
||||||
|
width: 75% }
|
||||||
|
|
||||||
|
img.align-left, .figure.align-left, object.align-left, table.align-left {
|
||||||
|
clear: left ;
|
||||||
|
float: left ;
|
||||||
|
margin-right: 1em }
|
||||||
|
|
||||||
|
img.align-right, .figure.align-right, object.align-right, table.align-right {
|
||||||
|
clear: right ;
|
||||||
|
float: right ;
|
||||||
|
margin-left: 1em }
|
||||||
|
|
||||||
|
img.align-center, .figure.align-center, object.align-center {
|
||||||
|
display: block;
|
||||||
|
margin-left: auto;
|
||||||
|
margin-right: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.align-center {
|
||||||
|
margin-left: auto;
|
||||||
|
margin-right: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.align-left {
|
||||||
|
text-align: left }
|
||||||
|
|
||||||
|
.align-center {
|
||||||
|
clear: both ;
|
||||||
|
text-align: center }
|
||||||
|
|
||||||
|
.align-right {
|
||||||
|
text-align: right }
|
||||||
|
|
||||||
|
/* reset inner alignment in figures */
|
||||||
|
div.align-right {
|
||||||
|
text-align: inherit }
|
||||||
|
|
||||||
|
/* div.align-center * { */
|
||||||
|
/* text-align: left } */
|
||||||
|
|
||||||
|
.align-top {
|
||||||
|
vertical-align: top }
|
||||||
|
|
||||||
|
.align-middle {
|
||||||
|
vertical-align: middle }
|
||||||
|
|
||||||
|
.align-bottom {
|
||||||
|
vertical-align: bottom }
|
||||||
|
|
||||||
|
ol.simple, ul.simple {
|
||||||
|
margin-bottom: 1em }
|
||||||
|
|
||||||
|
ol.arabic {
|
||||||
|
list-style: decimal }
|
||||||
|
|
||||||
|
ol.loweralpha {
|
||||||
|
list-style: lower-alpha }
|
||||||
|
|
||||||
|
ol.upperalpha {
|
||||||
|
list-style: upper-alpha }
|
||||||
|
|
||||||
|
ol.lowerroman {
|
||||||
|
list-style: lower-roman }
|
||||||
|
|
||||||
|
ol.upperroman {
|
||||||
|
list-style: upper-roman }
|
||||||
|
|
||||||
|
p.attribution {
|
||||||
|
text-align: right ;
|
||||||
|
margin-left: 50% }
|
||||||
|
|
||||||
|
p.caption {
|
||||||
|
font-style: italic }
|
||||||
|
|
||||||
|
p.credits {
|
||||||
|
font-style: italic ;
|
||||||
|
font-size: smaller }
|
||||||
|
|
||||||
|
p.label {
|
||||||
|
white-space: nowrap }
|
||||||
|
|
||||||
|
p.rubric {
|
||||||
|
font-weight: bold ;
|
||||||
|
font-size: larger ;
|
||||||
|
color: maroon ;
|
||||||
|
text-align: center }
|
||||||
|
|
||||||
|
p.sidebar-title {
|
||||||
|
font-family: sans-serif ;
|
||||||
|
font-weight: bold ;
|
||||||
|
font-size: larger }
|
||||||
|
|
||||||
|
p.sidebar-subtitle {
|
||||||
|
font-family: sans-serif ;
|
||||||
|
font-weight: bold }
|
||||||
|
|
||||||
|
p.topic-title {
|
||||||
|
font-weight: bold }
|
||||||
|
|
||||||
|
pre.address {
|
||||||
|
margin-bottom: 0 ;
|
||||||
|
margin-top: 0 ;
|
||||||
|
font: inherit }
|
||||||
|
|
||||||
|
pre.literal-block, pre.doctest-block, pre.math, pre.code {
|
||||||
|
margin-left: 2em ;
|
||||||
|
margin-right: 2em }
|
||||||
|
|
||||||
|
pre.code .ln { color: grey; } /* line numbers */
|
||||||
|
pre.code, code { background-color: #eeeeee }
|
||||||
|
pre.code .comment, code .comment { color: #5C6576 }
|
||||||
|
pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold }
|
||||||
|
pre.code .literal.string, code .literal.string { color: #0C5404 }
|
||||||
|
pre.code .name.builtin, code .name.builtin { color: #352B84 }
|
||||||
|
pre.code .deleted, code .deleted { background-color: #DEB0A1}
|
||||||
|
pre.code .inserted, code .inserted { background-color: #A3D289}
|
||||||
|
|
||||||
|
span.classifier {
|
||||||
|
font-family: sans-serif ;
|
||||||
|
font-style: oblique }
|
||||||
|
|
||||||
|
span.classifier-delimiter {
|
||||||
|
font-family: sans-serif ;
|
||||||
|
font-weight: bold }
|
||||||
|
|
||||||
|
span.interpreted {
|
||||||
|
font-family: sans-serif }
|
||||||
|
|
||||||
|
span.option {
|
||||||
|
white-space: nowrap }
|
||||||
|
|
||||||
|
span.pre {
|
||||||
|
white-space: pre }
|
||||||
|
|
||||||
|
span.problematic {
|
||||||
|
color: red }
|
||||||
|
|
||||||
|
span.section-subtitle {
|
||||||
|
/* font-size relative to parent (h1..h6 element) */
|
||||||
|
font-size: 80% }
|
||||||
|
|
||||||
|
table.citation {
|
||||||
|
border-left: solid 1px gray;
|
||||||
|
margin-left: 1px }
|
||||||
|
|
||||||
|
table.docinfo {
|
||||||
|
margin: 2em 4em }
|
||||||
|
|
||||||
|
table.docutils {
|
||||||
|
margin-top: 0.5em ;
|
||||||
|
margin-bottom: 0.5em }
|
||||||
|
|
||||||
|
table.footnote {
|
||||||
|
border-left: solid 1px black;
|
||||||
|
margin-left: 1px }
|
||||||
|
|
||||||
|
table.docutils td, table.docutils th,
|
||||||
|
table.docinfo td, table.docinfo th {
|
||||||
|
padding-left: 0.5em ;
|
||||||
|
padding-right: 0.5em ;
|
||||||
|
vertical-align: top }
|
||||||
|
|
||||||
|
table.docutils th.field-name, table.docinfo th.docinfo-name {
|
||||||
|
font-weight: bold ;
|
||||||
|
text-align: left ;
|
||||||
|
white-space: nowrap ;
|
||||||
|
padding-left: 0 }
|
||||||
|
|
||||||
|
/* "booktabs" style (no vertical lines) */
|
||||||
|
table.docutils.booktabs {
|
||||||
|
border: 0px;
|
||||||
|
border-top: 2px solid;
|
||||||
|
border-bottom: 2px solid;
|
||||||
|
border-collapse: collapse;
|
||||||
|
}
|
||||||
|
table.docutils.booktabs * {
|
||||||
|
border: 0px;
|
||||||
|
}
|
||||||
|
table.docutils.booktabs th {
|
||||||
|
border-bottom: thin solid;
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
h1 tt.docutils, h2 tt.docutils, h3 tt.docutils,
|
||||||
|
h4 tt.docutils, h5 tt.docutils, h6 tt.docutils {
|
||||||
|
font-size: 100% }
|
||||||
|
|
||||||
|
ul.auto-toc {
|
||||||
|
list-style-type: none }
|
||||||
|
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="document" id="account-usability">
|
||||||
|
<h1 class="title">Account Usability</h1>
|
||||||
|
|
||||||
|
<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||||
|
!! This file is generated by oca-gen-addon-readme !!
|
||||||
|
!! changes will be overwritten. !!
|
||||||
|
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
|
||||||
|
<p><a class="reference external" href="https://odoo-community.org/page/development-status"><img alt="Beta" src="https://img.shields.io/badge/maturity-Beta-yellow.png" /></a> <a class="reference external" href="http://www.gnu.org/licenses/agpl-3.0-standalone.html"><img alt="License: AGPL-3" src="https://img.shields.io/badge/licence-AGPL--3-blue.png" /></a> <a class="reference external" href="https://github.com/akretion/odoo-usability/tree/12.0/account_usability"><img alt="akretion/odoo-usability" src="https://img.shields.io/badge/github-akretion%2Fodoo--usability-lightgray.png?logo=github" /></a></p>
|
||||||
|
<p>This modules adds the following functions:</p>
|
||||||
|
<ul class="simple">
|
||||||
|
<li>Add an <em>Overdue</em> filter on invoice search view (this feature was previously
|
||||||
|
located in te module <em>account_invoice_overdue_filter</em>)</li>
|
||||||
|
<li>Increase the default limit of 80 lines in account move and account move line view.</li>
|
||||||
|
<li>disable reconciliation “guessing”</li>
|
||||||
|
<li>fast search on <em>Reconcile Ref</em> for account move line.</li>
|
||||||
|
<li>add sale dates to invoice report to be compliant with
|
||||||
|
<a class="reference external" href="https://www.service-public.fr/professionnels-entreprises/vosdroits/F31808">https://www.service-public.fr/professionnels-entreprises/vosdroits/F31808</a></li>
|
||||||
|
<li>Sale date on qweb invoices</li>
|
||||||
|
<li>A wizard to mark several invoices as sent at once (forward from v8)</li>
|
||||||
|
<li>Default date for Account Move Reversal is now D+1 instead of today</li>
|
||||||
|
<li>Track more fields on invoice (see details in account.py)</li>
|
||||||
|
<li>Add boolean fields <cite>has_discount</cite> and <cite>has_attachment</cite> on invoice</li>
|
||||||
|
<li>Add button “Delete line qty = 0” on supplier invoice</li>
|
||||||
|
<li>Cut name_get() of invoice if too long</li>
|
||||||
|
<li>A script for if Odoo screws up invoice attachment filename</li>
|
||||||
|
<li>help functions for py3o reports</li>
|
||||||
|
<li>Show code on name_get of journal</li>
|
||||||
|
<li>add direct search of journal using code</li>
|
||||||
|
<li>add copy=False on some fields</li>
|
||||||
|
<li>Add unicity constraint on analytic codes per company</li>
|
||||||
|
<li>Better default values on account move</li>
|
||||||
|
<li>Add link from account move line to invoice</li>
|
||||||
|
<li>Add start_date and end_date on bank statements</li>
|
||||||
|
<li>Add transfer_account_id to invoicing config page</li>
|
||||||
|
<li>Improve domain reconciliation widget</li>
|
||||||
|
<li>account.reconcile.model don’t copy name to label via onchange</li>
|
||||||
|
<li>Add method to get fiscal position without partner_id</li>
|
||||||
|
<li>Restore drill-through on sale and invoice reports</li>
|
||||||
|
<li>don’t attach PDF upon invoice report generation on supplier invoices/refunds</li>
|
||||||
|
<li>Add filter on debit and credit amount for Move Lines</li>
|
||||||
|
<li>Add supplier invoice number in invoice tree view</li>
|
||||||
|
</ul>
|
||||||
|
<p>Together with this module, I recommend the use of the following modules:</p>
|
||||||
|
<ul class="simple">
|
||||||
|
<li>account_invoice_supplier_ref_unique (OCA project account-invoicing)</li>
|
||||||
|
<li>account_move_line_no_default_search (OCA project account-financial-tools)</li>
|
||||||
|
<li>invoice_fiscal_position_update (OCA project account-invoicing)</li>
|
||||||
|
</ul>
|
||||||
|
<p><strong>Table of contents</strong></p>
|
||||||
|
<div class="contents local topic" id="contents">
|
||||||
|
<ul class="simple">
|
||||||
|
<li><a class="reference internal" href="#bug-tracker" id="id1">Bug Tracker</a></li>
|
||||||
|
<li><a class="reference internal" href="#credits" id="id2">Credits</a><ul>
|
||||||
|
<li><a class="reference internal" href="#authors" id="id3">Authors</a></li>
|
||||||
|
<li><a class="reference internal" href="#contributors" id="id4">Contributors</a></li>
|
||||||
|
<li><a class="reference internal" href="#maintainers" id="id5">Maintainers</a></li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div class="section" id="bug-tracker">
|
||||||
|
<h1><a class="toc-backref" href="#id1">Bug Tracker</a></h1>
|
||||||
|
<p>Bugs are tracked on <a class="reference external" href="https://github.com/akretion/odoo-usability/issues">GitHub Issues</a>.
|
||||||
|
In case of trouble, please check there if your issue has already been reported.
|
||||||
|
If you spotted it first, help us smashing it by providing a detailed and welcomed
|
||||||
|
<a class="reference external" href="https://github.com/akretion/odoo-usability/issues/new?body=module:%20account_usability%0Aversion:%2012.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**">feedback</a>.</p>
|
||||||
|
<p>Do not contact contributors directly about support or help with technical issues.</p>
|
||||||
|
</div>
|
||||||
|
<div class="section" id="credits">
|
||||||
|
<h1><a class="toc-backref" href="#id2">Credits</a></h1>
|
||||||
|
<div class="section" id="authors">
|
||||||
|
<h2><a class="toc-backref" href="#id3">Authors</a></h2>
|
||||||
|
<ul class="simple">
|
||||||
|
<li>Akretion</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div class="section" id="contributors">
|
||||||
|
<h2><a class="toc-backref" href="#id4">Contributors</a></h2>
|
||||||
|
<ul class="simple">
|
||||||
|
<li>Alexis de Lattre <<a class="reference external" href="mailto:alexis.delattre@akretion.com">alexis.delattre@akretion.com</a>></li>
|
||||||
|
<li>David Beal <<a class="reference external" href="mailto:david.beal@akretion.com">david.beal@akretion.com</a>></li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div class="section" id="maintainers">
|
||||||
|
<h2><a class="toc-backref" href="#id5">Maintainers</a></h2>
|
||||||
|
<p>This module is part of the <a class="reference external" href="https://github.com/akretion/odoo-usability/tree/12.0/account_usability">akretion/odoo-usability</a> project on GitHub.</p>
|
||||||
|
<p>You are welcome to contribute.</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
61
base_company_extension/README.rst
Normal file
61
base_company_extension/README.rst
Normal file
@@ -0,0 +1,61 @@
|
|||||||
|
======================
|
||||||
|
Base Company Extension
|
||||||
|
======================
|
||||||
|
|
||||||
|
.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||||
|
!! This file is generated by oca-gen-addon-readme !!
|
||||||
|
!! changes will be overwritten. !!
|
||||||
|
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||||
|
|
||||||
|
.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png
|
||||||
|
:target: https://odoo-community.org/page/development-status
|
||||||
|
:alt: Beta
|
||||||
|
.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png
|
||||||
|
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
|
||||||
|
:alt: License: AGPL-3
|
||||||
|
.. |badge3| image:: https://img.shields.io/badge/github-akretion%2Fodoo--usability-lightgray.png?logo=github
|
||||||
|
:target: https://github.com/akretion/odoo-usability/tree/12.0/base_company_extension
|
||||||
|
:alt: akretion/odoo-usability
|
||||||
|
|
||||||
|
|badge1| |badge2| |badge3|
|
||||||
|
|
||||||
|
This module adds the following fields to the ResCompany model:
|
||||||
|
* Capital Amount
|
||||||
|
* Legal Type
|
||||||
|
|
||||||
|
This is useful to display the legal name of the company in reports
|
||||||
|
|
||||||
|
**Table of contents**
|
||||||
|
|
||||||
|
.. contents::
|
||||||
|
:local:
|
||||||
|
|
||||||
|
Bug Tracker
|
||||||
|
===========
|
||||||
|
|
||||||
|
Bugs are tracked on `GitHub Issues <https://github.com/akretion/odoo-usability/issues>`_.
|
||||||
|
In case of trouble, please check there if your issue has already been reported.
|
||||||
|
If you spotted it first, help us smashing it by providing a detailed and welcomed
|
||||||
|
`feedback <https://github.com/akretion/odoo-usability/issues/new?body=module:%20base_company_extension%0Aversion:%2012.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.
|
||||||
|
|
||||||
|
Do not contact contributors directly about support or help with technical issues.
|
||||||
|
|
||||||
|
Credits
|
||||||
|
=======
|
||||||
|
|
||||||
|
Authors
|
||||||
|
~~~~~~~
|
||||||
|
|
||||||
|
* Akretion
|
||||||
|
|
||||||
|
Contributors
|
||||||
|
~~~~~~~~~~~~
|
||||||
|
|
||||||
|
* Alexis de Lattre <alexis.delattre@akretion.com>
|
||||||
|
|
||||||
|
Maintainers
|
||||||
|
~~~~~~~~~~~
|
||||||
|
|
||||||
|
This module is part of the `akretion/odoo-usability <https://github.com/akretion/odoo-usability/tree/12.0/base_company_extension>`_ project on GitHub.
|
||||||
|
|
||||||
|
You are welcome to contribute.
|
||||||
@@ -9,16 +9,6 @@
|
|||||||
'category': 'Partner',
|
'category': 'Partner',
|
||||||
'license': 'AGPL-3',
|
'license': 'AGPL-3',
|
||||||
'summary': 'Adds capital and title on company',
|
'summary': 'Adds capital and title on company',
|
||||||
'description': """
|
|
||||||
Base Company Extension
|
|
||||||
======================
|
|
||||||
|
|
||||||
This module adds 2 fields on the Company :
|
|
||||||
|
|
||||||
* *Capital Amount*
|
|
||||||
|
|
||||||
* *Legal Form*
|
|
||||||
""",
|
|
||||||
'author': 'Akretion',
|
'author': 'Akretion',
|
||||||
'website': 'http://www.akretion.com',
|
'website': 'http://www.akretion.com',
|
||||||
# I depend on base_usability only for _report_company_legal_name()
|
# I depend on base_usability only for _report_company_legal_name()
|
||||||
|
|||||||
1
base_company_extension/readme/CONTRIBUTORS.rst
Normal file
1
base_company_extension/readme/CONTRIBUTORS.rst
Normal file
@@ -0,0 +1 @@
|
|||||||
|
* Alexis de Lattre <alexis.delattre@akretion.com>
|
||||||
5
base_company_extension/readme/DESCRIPTION.rst
Normal file
5
base_company_extension/readme/DESCRIPTION.rst
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
This module adds the following fields to the ResCompany model:
|
||||||
|
* Capital Amount
|
||||||
|
* Legal Type
|
||||||
|
|
||||||
|
This is useful to display the legal name of the company in reports
|
||||||
417
base_company_extension/static/description/index.html
Normal file
417
base_company_extension/static/description/index.html
Normal file
@@ -0,0 +1,417 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8" ?>
|
||||||
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||||
|
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||||
|
<meta name="generator" content="Docutils 0.15.1: http://docutils.sourceforge.net/" />
|
||||||
|
<title>Base Company Extension</title>
|
||||||
|
<style type="text/css">
|
||||||
|
|
||||||
|
/*
|
||||||
|
:Author: David Goodger (goodger@python.org)
|
||||||
|
:Id: $Id: html4css1.css 7952 2016-07-26 18:15:59Z milde $
|
||||||
|
:Copyright: This stylesheet has been placed in the public domain.
|
||||||
|
|
||||||
|
Default cascading style sheet for the HTML output of Docutils.
|
||||||
|
|
||||||
|
See http://docutils.sf.net/docs/howto/html-stylesheets.html for how to
|
||||||
|
customize this style sheet.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* used to remove borders from tables and images */
|
||||||
|
.borderless, table.borderless td, table.borderless th {
|
||||||
|
border: 0 }
|
||||||
|
|
||||||
|
table.borderless td, table.borderless th {
|
||||||
|
/* Override padding for "table.docutils td" with "! important".
|
||||||
|
The right padding separates the table cells. */
|
||||||
|
padding: 0 0.5em 0 0 ! important }
|
||||||
|
|
||||||
|
.first {
|
||||||
|
/* Override more specific margin styles with "! important". */
|
||||||
|
margin-top: 0 ! important }
|
||||||
|
|
||||||
|
.last, .with-subtitle {
|
||||||
|
margin-bottom: 0 ! important }
|
||||||
|
|
||||||
|
.hidden {
|
||||||
|
display: none }
|
||||||
|
|
||||||
|
.subscript {
|
||||||
|
vertical-align: sub;
|
||||||
|
font-size: smaller }
|
||||||
|
|
||||||
|
.superscript {
|
||||||
|
vertical-align: super;
|
||||||
|
font-size: smaller }
|
||||||
|
|
||||||
|
a.toc-backref {
|
||||||
|
text-decoration: none ;
|
||||||
|
color: black }
|
||||||
|
|
||||||
|
blockquote.epigraph {
|
||||||
|
margin: 2em 5em ; }
|
||||||
|
|
||||||
|
dl.docutils dd {
|
||||||
|
margin-bottom: 0.5em }
|
||||||
|
|
||||||
|
object[type="image/svg+xml"], object[type="application/x-shockwave-flash"] {
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Uncomment (and remove this text!) to get bold-faced definition list terms
|
||||||
|
dl.docutils dt {
|
||||||
|
font-weight: bold }
|
||||||
|
*/
|
||||||
|
|
||||||
|
div.abstract {
|
||||||
|
margin: 2em 5em }
|
||||||
|
|
||||||
|
div.abstract p.topic-title {
|
||||||
|
font-weight: bold ;
|
||||||
|
text-align: center }
|
||||||
|
|
||||||
|
div.admonition, div.attention, div.caution, div.danger, div.error,
|
||||||
|
div.hint, div.important, div.note, div.tip, div.warning {
|
||||||
|
margin: 2em ;
|
||||||
|
border: medium outset ;
|
||||||
|
padding: 1em }
|
||||||
|
|
||||||
|
div.admonition p.admonition-title, div.hint p.admonition-title,
|
||||||
|
div.important p.admonition-title, div.note p.admonition-title,
|
||||||
|
div.tip p.admonition-title {
|
||||||
|
font-weight: bold ;
|
||||||
|
font-family: sans-serif }
|
||||||
|
|
||||||
|
div.attention p.admonition-title, div.caution p.admonition-title,
|
||||||
|
div.danger p.admonition-title, div.error p.admonition-title,
|
||||||
|
div.warning p.admonition-title, .code .error {
|
||||||
|
color: red ;
|
||||||
|
font-weight: bold ;
|
||||||
|
font-family: sans-serif }
|
||||||
|
|
||||||
|
/* Uncomment (and remove this text!) to get reduced vertical space in
|
||||||
|
compound paragraphs.
|
||||||
|
div.compound .compound-first, div.compound .compound-middle {
|
||||||
|
margin-bottom: 0.5em }
|
||||||
|
|
||||||
|
div.compound .compound-last, div.compound .compound-middle {
|
||||||
|
margin-top: 0.5em }
|
||||||
|
*/
|
||||||
|
|
||||||
|
div.dedication {
|
||||||
|
margin: 2em 5em ;
|
||||||
|
text-align: center ;
|
||||||
|
font-style: italic }
|
||||||
|
|
||||||
|
div.dedication p.topic-title {
|
||||||
|
font-weight: bold ;
|
||||||
|
font-style: normal }
|
||||||
|
|
||||||
|
div.figure {
|
||||||
|
margin-left: 2em ;
|
||||||
|
margin-right: 2em }
|
||||||
|
|
||||||
|
div.footer, div.header {
|
||||||
|
clear: both;
|
||||||
|
font-size: smaller }
|
||||||
|
|
||||||
|
div.line-block {
|
||||||
|
display: block ;
|
||||||
|
margin-top: 1em ;
|
||||||
|
margin-bottom: 1em }
|
||||||
|
|
||||||
|
div.line-block div.line-block {
|
||||||
|
margin-top: 0 ;
|
||||||
|
margin-bottom: 0 ;
|
||||||
|
margin-left: 1.5em }
|
||||||
|
|
||||||
|
div.sidebar {
|
||||||
|
margin: 0 0 0.5em 1em ;
|
||||||
|
border: medium outset ;
|
||||||
|
padding: 1em ;
|
||||||
|
background-color: #ffffee ;
|
||||||
|
width: 40% ;
|
||||||
|
float: right ;
|
||||||
|
clear: right }
|
||||||
|
|
||||||
|
div.sidebar p.rubric {
|
||||||
|
font-family: sans-serif ;
|
||||||
|
font-size: medium }
|
||||||
|
|
||||||
|
div.system-messages {
|
||||||
|
margin: 5em }
|
||||||
|
|
||||||
|
div.system-messages h1 {
|
||||||
|
color: red }
|
||||||
|
|
||||||
|
div.system-message {
|
||||||
|
border: medium outset ;
|
||||||
|
padding: 1em }
|
||||||
|
|
||||||
|
div.system-message p.system-message-title {
|
||||||
|
color: red ;
|
||||||
|
font-weight: bold }
|
||||||
|
|
||||||
|
div.topic {
|
||||||
|
margin: 2em }
|
||||||
|
|
||||||
|
h1.section-subtitle, h2.section-subtitle, h3.section-subtitle,
|
||||||
|
h4.section-subtitle, h5.section-subtitle, h6.section-subtitle {
|
||||||
|
margin-top: 0.4em }
|
||||||
|
|
||||||
|
h1.title {
|
||||||
|
text-align: center }
|
||||||
|
|
||||||
|
h2.subtitle {
|
||||||
|
text-align: center }
|
||||||
|
|
||||||
|
hr.docutils {
|
||||||
|
width: 75% }
|
||||||
|
|
||||||
|
img.align-left, .figure.align-left, object.align-left, table.align-left {
|
||||||
|
clear: left ;
|
||||||
|
float: left ;
|
||||||
|
margin-right: 1em }
|
||||||
|
|
||||||
|
img.align-right, .figure.align-right, object.align-right, table.align-right {
|
||||||
|
clear: right ;
|
||||||
|
float: right ;
|
||||||
|
margin-left: 1em }
|
||||||
|
|
||||||
|
img.align-center, .figure.align-center, object.align-center {
|
||||||
|
display: block;
|
||||||
|
margin-left: auto;
|
||||||
|
margin-right: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.align-center {
|
||||||
|
margin-left: auto;
|
||||||
|
margin-right: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.align-left {
|
||||||
|
text-align: left }
|
||||||
|
|
||||||
|
.align-center {
|
||||||
|
clear: both ;
|
||||||
|
text-align: center }
|
||||||
|
|
||||||
|
.align-right {
|
||||||
|
text-align: right }
|
||||||
|
|
||||||
|
/* reset inner alignment in figures */
|
||||||
|
div.align-right {
|
||||||
|
text-align: inherit }
|
||||||
|
|
||||||
|
/* div.align-center * { */
|
||||||
|
/* text-align: left } */
|
||||||
|
|
||||||
|
.align-top {
|
||||||
|
vertical-align: top }
|
||||||
|
|
||||||
|
.align-middle {
|
||||||
|
vertical-align: middle }
|
||||||
|
|
||||||
|
.align-bottom {
|
||||||
|
vertical-align: bottom }
|
||||||
|
|
||||||
|
ol.simple, ul.simple {
|
||||||
|
margin-bottom: 1em }
|
||||||
|
|
||||||
|
ol.arabic {
|
||||||
|
list-style: decimal }
|
||||||
|
|
||||||
|
ol.loweralpha {
|
||||||
|
list-style: lower-alpha }
|
||||||
|
|
||||||
|
ol.upperalpha {
|
||||||
|
list-style: upper-alpha }
|
||||||
|
|
||||||
|
ol.lowerroman {
|
||||||
|
list-style: lower-roman }
|
||||||
|
|
||||||
|
ol.upperroman {
|
||||||
|
list-style: upper-roman }
|
||||||
|
|
||||||
|
p.attribution {
|
||||||
|
text-align: right ;
|
||||||
|
margin-left: 50% }
|
||||||
|
|
||||||
|
p.caption {
|
||||||
|
font-style: italic }
|
||||||
|
|
||||||
|
p.credits {
|
||||||
|
font-style: italic ;
|
||||||
|
font-size: smaller }
|
||||||
|
|
||||||
|
p.label {
|
||||||
|
white-space: nowrap }
|
||||||
|
|
||||||
|
p.rubric {
|
||||||
|
font-weight: bold ;
|
||||||
|
font-size: larger ;
|
||||||
|
color: maroon ;
|
||||||
|
text-align: center }
|
||||||
|
|
||||||
|
p.sidebar-title {
|
||||||
|
font-family: sans-serif ;
|
||||||
|
font-weight: bold ;
|
||||||
|
font-size: larger }
|
||||||
|
|
||||||
|
p.sidebar-subtitle {
|
||||||
|
font-family: sans-serif ;
|
||||||
|
font-weight: bold }
|
||||||
|
|
||||||
|
p.topic-title {
|
||||||
|
font-weight: bold }
|
||||||
|
|
||||||
|
pre.address {
|
||||||
|
margin-bottom: 0 ;
|
||||||
|
margin-top: 0 ;
|
||||||
|
font: inherit }
|
||||||
|
|
||||||
|
pre.literal-block, pre.doctest-block, pre.math, pre.code {
|
||||||
|
margin-left: 2em ;
|
||||||
|
margin-right: 2em }
|
||||||
|
|
||||||
|
pre.code .ln { color: grey; } /* line numbers */
|
||||||
|
pre.code, code { background-color: #eeeeee }
|
||||||
|
pre.code .comment, code .comment { color: #5C6576 }
|
||||||
|
pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold }
|
||||||
|
pre.code .literal.string, code .literal.string { color: #0C5404 }
|
||||||
|
pre.code .name.builtin, code .name.builtin { color: #352B84 }
|
||||||
|
pre.code .deleted, code .deleted { background-color: #DEB0A1}
|
||||||
|
pre.code .inserted, code .inserted { background-color: #A3D289}
|
||||||
|
|
||||||
|
span.classifier {
|
||||||
|
font-family: sans-serif ;
|
||||||
|
font-style: oblique }
|
||||||
|
|
||||||
|
span.classifier-delimiter {
|
||||||
|
font-family: sans-serif ;
|
||||||
|
font-weight: bold }
|
||||||
|
|
||||||
|
span.interpreted {
|
||||||
|
font-family: sans-serif }
|
||||||
|
|
||||||
|
span.option {
|
||||||
|
white-space: nowrap }
|
||||||
|
|
||||||
|
span.pre {
|
||||||
|
white-space: pre }
|
||||||
|
|
||||||
|
span.problematic {
|
||||||
|
color: red }
|
||||||
|
|
||||||
|
span.section-subtitle {
|
||||||
|
/* font-size relative to parent (h1..h6 element) */
|
||||||
|
font-size: 80% }
|
||||||
|
|
||||||
|
table.citation {
|
||||||
|
border-left: solid 1px gray;
|
||||||
|
margin-left: 1px }
|
||||||
|
|
||||||
|
table.docinfo {
|
||||||
|
margin: 2em 4em }
|
||||||
|
|
||||||
|
table.docutils {
|
||||||
|
margin-top: 0.5em ;
|
||||||
|
margin-bottom: 0.5em }
|
||||||
|
|
||||||
|
table.footnote {
|
||||||
|
border-left: solid 1px black;
|
||||||
|
margin-left: 1px }
|
||||||
|
|
||||||
|
table.docutils td, table.docutils th,
|
||||||
|
table.docinfo td, table.docinfo th {
|
||||||
|
padding-left: 0.5em ;
|
||||||
|
padding-right: 0.5em ;
|
||||||
|
vertical-align: top }
|
||||||
|
|
||||||
|
table.docutils th.field-name, table.docinfo th.docinfo-name {
|
||||||
|
font-weight: bold ;
|
||||||
|
text-align: left ;
|
||||||
|
white-space: nowrap ;
|
||||||
|
padding-left: 0 }
|
||||||
|
|
||||||
|
/* "booktabs" style (no vertical lines) */
|
||||||
|
table.docutils.booktabs {
|
||||||
|
border: 0px;
|
||||||
|
border-top: 2px solid;
|
||||||
|
border-bottom: 2px solid;
|
||||||
|
border-collapse: collapse;
|
||||||
|
}
|
||||||
|
table.docutils.booktabs * {
|
||||||
|
border: 0px;
|
||||||
|
}
|
||||||
|
table.docutils.booktabs th {
|
||||||
|
border-bottom: thin solid;
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
h1 tt.docutils, h2 tt.docutils, h3 tt.docutils,
|
||||||
|
h4 tt.docutils, h5 tt.docutils, h6 tt.docutils {
|
||||||
|
font-size: 100% }
|
||||||
|
|
||||||
|
ul.auto-toc {
|
||||||
|
list-style-type: none }
|
||||||
|
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="document" id="base-company-extension">
|
||||||
|
<h1 class="title">Base Company Extension</h1>
|
||||||
|
|
||||||
|
<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||||
|
!! This file is generated by oca-gen-addon-readme !!
|
||||||
|
!! changes will be overwritten. !!
|
||||||
|
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
|
||||||
|
<p><a class="reference external" href="https://odoo-community.org/page/development-status"><img alt="Beta" src="https://img.shields.io/badge/maturity-Beta-yellow.png" /></a> <a class="reference external" href="http://www.gnu.org/licenses/agpl-3.0-standalone.html"><img alt="License: AGPL-3" src="https://img.shields.io/badge/licence-AGPL--3-blue.png" /></a> <a class="reference external" href="https://github.com/akretion/odoo-usability/tree/12.0/base_company_extension"><img alt="akretion/odoo-usability" src="https://img.shields.io/badge/github-akretion%2Fodoo--usability-lightgray.png?logo=github" /></a></p>
|
||||||
|
<p>This module adds the following fields to the ResCompany model:
|
||||||
|
* Capital Amount
|
||||||
|
* Legal Type</p>
|
||||||
|
<p>This is useful to display the legal name of the company in reports</p>
|
||||||
|
<p><strong>Table of contents</strong></p>
|
||||||
|
<div class="contents local topic" id="contents">
|
||||||
|
<ul class="simple">
|
||||||
|
<li><a class="reference internal" href="#bug-tracker" id="id1">Bug Tracker</a></li>
|
||||||
|
<li><a class="reference internal" href="#credits" id="id2">Credits</a><ul>
|
||||||
|
<li><a class="reference internal" href="#authors" id="id3">Authors</a></li>
|
||||||
|
<li><a class="reference internal" href="#contributors" id="id4">Contributors</a></li>
|
||||||
|
<li><a class="reference internal" href="#maintainers" id="id5">Maintainers</a></li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div class="section" id="bug-tracker">
|
||||||
|
<h1><a class="toc-backref" href="#id1">Bug Tracker</a></h1>
|
||||||
|
<p>Bugs are tracked on <a class="reference external" href="https://github.com/akretion/odoo-usability/issues">GitHub Issues</a>.
|
||||||
|
In case of trouble, please check there if your issue has already been reported.
|
||||||
|
If you spotted it first, help us smashing it by providing a detailed and welcomed
|
||||||
|
<a class="reference external" href="https://github.com/akretion/odoo-usability/issues/new?body=module:%20base_company_extension%0Aversion:%2012.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**">feedback</a>.</p>
|
||||||
|
<p>Do not contact contributors directly about support or help with technical issues.</p>
|
||||||
|
</div>
|
||||||
|
<div class="section" id="credits">
|
||||||
|
<h1><a class="toc-backref" href="#id2">Credits</a></h1>
|
||||||
|
<div class="section" id="authors">
|
||||||
|
<h2><a class="toc-backref" href="#id3">Authors</a></h2>
|
||||||
|
<ul class="simple">
|
||||||
|
<li>Akretion</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div class="section" id="contributors">
|
||||||
|
<h2><a class="toc-backref" href="#id4">Contributors</a></h2>
|
||||||
|
<ul class="simple">
|
||||||
|
<li>Alexis de Lattre <<a class="reference external" href="mailto:alexis.delattre@akretion.com">alexis.delattre@akretion.com</a>></li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div class="section" id="maintainers">
|
||||||
|
<h2><a class="toc-backref" href="#id5">Maintainers</a></h2>
|
||||||
|
<p>This module is part of the <a class="reference external" href="https://github.com/akretion/odoo-usability/tree/12.0/base_company_extension">akretion/odoo-usability</a> project on GitHub.</p>
|
||||||
|
<p>You are welcome to contribute.</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
@@ -2,13 +2,14 @@
|
|||||||
# @author: Alexis de Lattre <alexis.delattre@akretion.com>
|
# @author: Alexis de Lattre <alexis.delattre@akretion.com>
|
||||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||||
|
|
||||||
from odoo import models, fields
|
from odoo import api, fields, models
|
||||||
|
|
||||||
|
|
||||||
class ResPartner(models.Model):
|
class ResPartner(models.Model):
|
||||||
_inherit = 'res.partner'
|
_inherit = 'res.partner'
|
||||||
|
|
||||||
ref = fields.Char(copy=False) # To avoid blocking duplicate
|
ref = fields.Char(copy=False) # To avoid blocking duplicate
|
||||||
|
invalidate_display_name = fields.Boolean()
|
||||||
|
|
||||||
_sql_constraints = [(
|
_sql_constraints = [(
|
||||||
'ref_unique',
|
'ref_unique',
|
||||||
@@ -16,6 +17,11 @@ class ResPartner(models.Model):
|
|||||||
'A partner already exists with this internal reference!'
|
'A partner already exists with this internal reference!'
|
||||||
)]
|
)]
|
||||||
|
|
||||||
|
# add 'ref' in depends
|
||||||
|
@api.depends('is_company', 'name', 'parent_id.name', 'type', 'company_name', 'ref', 'invalidate_display_name')
|
||||||
|
def _compute_display_name(self):
|
||||||
|
super(ResPartner, self)._compute_display_name()
|
||||||
|
|
||||||
def _get_name(self):
|
def _get_name(self):
|
||||||
partner = self
|
partner = self
|
||||||
name = partner.name or ''
|
name = partner.name or ''
|
||||||
|
|||||||
82
base_usability/README.rst
Normal file
82
base_usability/README.rst
Normal file
@@ -0,0 +1,82 @@
|
|||||||
|
==============
|
||||||
|
Base Usability
|
||||||
|
==============
|
||||||
|
|
||||||
|
.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||||
|
!! This file is generated by oca-gen-addon-readme !!
|
||||||
|
!! changes will be overwritten. !!
|
||||||
|
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||||
|
|
||||||
|
.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png
|
||||||
|
:target: https://odoo-community.org/page/development-status
|
||||||
|
:alt: Beta
|
||||||
|
.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png
|
||||||
|
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
|
||||||
|
:alt: License: AGPL-3
|
||||||
|
.. |badge3| image:: https://img.shields.io/badge/github-akretion%2Fodoo--usability-lightgray.png?logo=github
|
||||||
|
:target: https://github.com/akretion/odoo-usability/tree/12.0/base_usability
|
||||||
|
:alt: akretion/odoo-usability
|
||||||
|
|
||||||
|
|badge1| |badge2| |badge3|
|
||||||
|
|
||||||
|
This module adds the following functions:
|
||||||
|
|
||||||
|
* Adds *track_visibility='onchange'* on all the important fields of the Partner object
|
||||||
|
* By default, Odoo doesn't display the title field on all the partner form views. This module fixes it (it replaces the module base_title_on_partner)
|
||||||
|
* Adds a log message at INFO level when sending an email via SMTP
|
||||||
|
* Displays the local modules with installable filter
|
||||||
|
* A group by "State" is added to module search view
|
||||||
|
* Provides a _display_report_header method on the res.company object and _display_full_address on res.partner which are useful for reporting.
|
||||||
|
* Add model in cron tree view
|
||||||
|
* Add prefix field in sequence search view
|
||||||
|
* Better search and form view for country and state
|
||||||
|
* Display technical name of modules in kanban view
|
||||||
|
* Change module filter to `installable`
|
||||||
|
* Add widget=handle on sequence of res.partner.bank
|
||||||
|
* Add city and country in partner tree view
|
||||||
|
* Add widget="email" on email of contacts
|
||||||
|
* Add script to fix partners related to users in multi-company setup
|
||||||
|
* Add methods for py3o reports
|
||||||
|
* Add name_get() on ir.model
|
||||||
|
* Language wizard defaults to ".po"
|
||||||
|
* Add tracking on partner fields
|
||||||
|
* Handle lang in name_title field
|
||||||
|
* Remove empty lines in address
|
||||||
|
* Add bank Name field on res.partner.bank
|
||||||
|
* Partners auto-created for users are Suppliers and not Customers
|
||||||
|
|
||||||
|
**Table of contents**
|
||||||
|
|
||||||
|
.. contents::
|
||||||
|
:local:
|
||||||
|
|
||||||
|
Bug Tracker
|
||||||
|
===========
|
||||||
|
|
||||||
|
Bugs are tracked on `GitHub Issues <https://github.com/akretion/odoo-usability/issues>`_.
|
||||||
|
In case of trouble, please check there if your issue has already been reported.
|
||||||
|
If you spotted it first, help us smashing it by providing a detailed and welcomed
|
||||||
|
`feedback <https://github.com/akretion/odoo-usability/issues/new?body=module:%20base_usability%0Aversion:%2012.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.
|
||||||
|
|
||||||
|
Do not contact contributors directly about support or help with technical issues.
|
||||||
|
|
||||||
|
Credits
|
||||||
|
=======
|
||||||
|
|
||||||
|
Authors
|
||||||
|
~~~~~~~
|
||||||
|
|
||||||
|
* Akretion
|
||||||
|
|
||||||
|
Contributors
|
||||||
|
~~~~~~~~~~~~
|
||||||
|
|
||||||
|
* Alexis de Lattre <alexis.delattre@akretion.com>
|
||||||
|
* David Beal <david.beal@akretion.com>
|
||||||
|
|
||||||
|
Maintainers
|
||||||
|
~~~~~~~~~~~
|
||||||
|
|
||||||
|
This module is part of the `akretion/odoo-usability <https://github.com/akretion/odoo-usability/tree/12.0/base_usability>`_ project on GitHub.
|
||||||
|
|
||||||
|
You are welcome to contribute.
|
||||||
@@ -8,22 +8,6 @@
|
|||||||
'category': 'Partner',
|
'category': 'Partner',
|
||||||
'license': 'AGPL-3',
|
'license': 'AGPL-3',
|
||||||
'summary': 'Better usability in base module',
|
'summary': 'Better usability in base module',
|
||||||
'description': """
|
|
||||||
Base Usability
|
|
||||||
==============
|
|
||||||
|
|
||||||
This module adds *track_visibility='onchange'* on all the important fields of the Partner object.
|
|
||||||
|
|
||||||
By default, Odoo doesn't display the title field on all the partner form views. This module fixes it (it replaces the module base_title_on_partner).
|
|
||||||
|
|
||||||
It also adds a log message at INFO level when sending an email via SMTP.
|
|
||||||
|
|
||||||
It displays the local modules with installable filter.
|
|
||||||
A group by 'State' is added to module search view.
|
|
||||||
|
|
||||||
It provides a _display_report_header method on the res.company object and
|
|
||||||
_display_full_address on res.partner which are useful for reporting.
|
|
||||||
""",
|
|
||||||
'author': 'Akretion',
|
'author': 'Akretion',
|
||||||
'website': 'http://www.akretion.com',
|
'website': 'http://www.akretion.com',
|
||||||
'depends': ['base'],
|
'depends': ['base'],
|
||||||
|
|||||||
3
base_usability/readme/CONTRIBUTORS.rst
Normal file
3
base_usability/readme/CONTRIBUTORS.rst
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
* Alexis de Lattre <alexis.delattre@akretion.com>
|
||||||
|
* Raphaël Valyi <rvalyi@akretion.com>
|
||||||
|
* David Beal <david.beal@akretion.com>
|
||||||
25
base_usability/readme/DESCRIPTION.rst
Normal file
25
base_usability/readme/DESCRIPTION.rst
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
This module adds the following functions:
|
||||||
|
|
||||||
|
* Adds *track_visibility='onchange'* on all the important fields of the Partner object
|
||||||
|
* By default, Odoo doesn't display the title field on all the partner form views. This module fixes it (it replaces the module base_title_on_partner)
|
||||||
|
* Adds a log message at INFO level when sending an email via SMTP
|
||||||
|
* Displays the local modules with installable filter
|
||||||
|
* A group by "State" is added to module search view
|
||||||
|
* Provides a _display_report_header method on the res.company object and _display_full_address on res.partner which are useful for reporting.
|
||||||
|
* Add model in cron tree view
|
||||||
|
* Add prefix field in sequence search view
|
||||||
|
* Better search and form view for country and state
|
||||||
|
* Display technical name of modules in kanban view
|
||||||
|
* Change module filter to `installable`
|
||||||
|
* Add widget=handle on sequence of res.partner.bank
|
||||||
|
* Add city and country in partner tree view
|
||||||
|
* Add widget="email" on email of contacts
|
||||||
|
* Add script to fix partners related to users in multi-company setup
|
||||||
|
* Add methods for py3o reports
|
||||||
|
* Add name_get() on ir.model
|
||||||
|
* Language wizard defaults to ".po"
|
||||||
|
* Add tracking on partner fields
|
||||||
|
* Handle lang in name_title field
|
||||||
|
* Remove empty lines in address
|
||||||
|
* Add bank Name field on res.partner.bank
|
||||||
|
* Partners auto-created for users are Suppliers and not Customers
|
||||||
440
base_usability/static/description/index.html
Normal file
440
base_usability/static/description/index.html
Normal file
@@ -0,0 +1,440 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8" ?>
|
||||||
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||||
|
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||||
|
<meta name="generator" content="Docutils 0.15.1: http://docutils.sourceforge.net/" />
|
||||||
|
<title>Base Usability</title>
|
||||||
|
<style type="text/css">
|
||||||
|
|
||||||
|
/*
|
||||||
|
:Author: David Goodger (goodger@python.org)
|
||||||
|
:Id: $Id: html4css1.css 7952 2016-07-26 18:15:59Z milde $
|
||||||
|
:Copyright: This stylesheet has been placed in the public domain.
|
||||||
|
|
||||||
|
Default cascading style sheet for the HTML output of Docutils.
|
||||||
|
|
||||||
|
See http://docutils.sf.net/docs/howto/html-stylesheets.html for how to
|
||||||
|
customize this style sheet.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* used to remove borders from tables and images */
|
||||||
|
.borderless, table.borderless td, table.borderless th {
|
||||||
|
border: 0 }
|
||||||
|
|
||||||
|
table.borderless td, table.borderless th {
|
||||||
|
/* Override padding for "table.docutils td" with "! important".
|
||||||
|
The right padding separates the table cells. */
|
||||||
|
padding: 0 0.5em 0 0 ! important }
|
||||||
|
|
||||||
|
.first {
|
||||||
|
/* Override more specific margin styles with "! important". */
|
||||||
|
margin-top: 0 ! important }
|
||||||
|
|
||||||
|
.last, .with-subtitle {
|
||||||
|
margin-bottom: 0 ! important }
|
||||||
|
|
||||||
|
.hidden {
|
||||||
|
display: none }
|
||||||
|
|
||||||
|
.subscript {
|
||||||
|
vertical-align: sub;
|
||||||
|
font-size: smaller }
|
||||||
|
|
||||||
|
.superscript {
|
||||||
|
vertical-align: super;
|
||||||
|
font-size: smaller }
|
||||||
|
|
||||||
|
a.toc-backref {
|
||||||
|
text-decoration: none ;
|
||||||
|
color: black }
|
||||||
|
|
||||||
|
blockquote.epigraph {
|
||||||
|
margin: 2em 5em ; }
|
||||||
|
|
||||||
|
dl.docutils dd {
|
||||||
|
margin-bottom: 0.5em }
|
||||||
|
|
||||||
|
object[type="image/svg+xml"], object[type="application/x-shockwave-flash"] {
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Uncomment (and remove this text!) to get bold-faced definition list terms
|
||||||
|
dl.docutils dt {
|
||||||
|
font-weight: bold }
|
||||||
|
*/
|
||||||
|
|
||||||
|
div.abstract {
|
||||||
|
margin: 2em 5em }
|
||||||
|
|
||||||
|
div.abstract p.topic-title {
|
||||||
|
font-weight: bold ;
|
||||||
|
text-align: center }
|
||||||
|
|
||||||
|
div.admonition, div.attention, div.caution, div.danger, div.error,
|
||||||
|
div.hint, div.important, div.note, div.tip, div.warning {
|
||||||
|
margin: 2em ;
|
||||||
|
border: medium outset ;
|
||||||
|
padding: 1em }
|
||||||
|
|
||||||
|
div.admonition p.admonition-title, div.hint p.admonition-title,
|
||||||
|
div.important p.admonition-title, div.note p.admonition-title,
|
||||||
|
div.tip p.admonition-title {
|
||||||
|
font-weight: bold ;
|
||||||
|
font-family: sans-serif }
|
||||||
|
|
||||||
|
div.attention p.admonition-title, div.caution p.admonition-title,
|
||||||
|
div.danger p.admonition-title, div.error p.admonition-title,
|
||||||
|
div.warning p.admonition-title, .code .error {
|
||||||
|
color: red ;
|
||||||
|
font-weight: bold ;
|
||||||
|
font-family: sans-serif }
|
||||||
|
|
||||||
|
/* Uncomment (and remove this text!) to get reduced vertical space in
|
||||||
|
compound paragraphs.
|
||||||
|
div.compound .compound-first, div.compound .compound-middle {
|
||||||
|
margin-bottom: 0.5em }
|
||||||
|
|
||||||
|
div.compound .compound-last, div.compound .compound-middle {
|
||||||
|
margin-top: 0.5em }
|
||||||
|
*/
|
||||||
|
|
||||||
|
div.dedication {
|
||||||
|
margin: 2em 5em ;
|
||||||
|
text-align: center ;
|
||||||
|
font-style: italic }
|
||||||
|
|
||||||
|
div.dedication p.topic-title {
|
||||||
|
font-weight: bold ;
|
||||||
|
font-style: normal }
|
||||||
|
|
||||||
|
div.figure {
|
||||||
|
margin-left: 2em ;
|
||||||
|
margin-right: 2em }
|
||||||
|
|
||||||
|
div.footer, div.header {
|
||||||
|
clear: both;
|
||||||
|
font-size: smaller }
|
||||||
|
|
||||||
|
div.line-block {
|
||||||
|
display: block ;
|
||||||
|
margin-top: 1em ;
|
||||||
|
margin-bottom: 1em }
|
||||||
|
|
||||||
|
div.line-block div.line-block {
|
||||||
|
margin-top: 0 ;
|
||||||
|
margin-bottom: 0 ;
|
||||||
|
margin-left: 1.5em }
|
||||||
|
|
||||||
|
div.sidebar {
|
||||||
|
margin: 0 0 0.5em 1em ;
|
||||||
|
border: medium outset ;
|
||||||
|
padding: 1em ;
|
||||||
|
background-color: #ffffee ;
|
||||||
|
width: 40% ;
|
||||||
|
float: right ;
|
||||||
|
clear: right }
|
||||||
|
|
||||||
|
div.sidebar p.rubric {
|
||||||
|
font-family: sans-serif ;
|
||||||
|
font-size: medium }
|
||||||
|
|
||||||
|
div.system-messages {
|
||||||
|
margin: 5em }
|
||||||
|
|
||||||
|
div.system-messages h1 {
|
||||||
|
color: red }
|
||||||
|
|
||||||
|
div.system-message {
|
||||||
|
border: medium outset ;
|
||||||
|
padding: 1em }
|
||||||
|
|
||||||
|
div.system-message p.system-message-title {
|
||||||
|
color: red ;
|
||||||
|
font-weight: bold }
|
||||||
|
|
||||||
|
div.topic {
|
||||||
|
margin: 2em }
|
||||||
|
|
||||||
|
h1.section-subtitle, h2.section-subtitle, h3.section-subtitle,
|
||||||
|
h4.section-subtitle, h5.section-subtitle, h6.section-subtitle {
|
||||||
|
margin-top: 0.4em }
|
||||||
|
|
||||||
|
h1.title {
|
||||||
|
text-align: center }
|
||||||
|
|
||||||
|
h2.subtitle {
|
||||||
|
text-align: center }
|
||||||
|
|
||||||
|
hr.docutils {
|
||||||
|
width: 75% }
|
||||||
|
|
||||||
|
img.align-left, .figure.align-left, object.align-left, table.align-left {
|
||||||
|
clear: left ;
|
||||||
|
float: left ;
|
||||||
|
margin-right: 1em }
|
||||||
|
|
||||||
|
img.align-right, .figure.align-right, object.align-right, table.align-right {
|
||||||
|
clear: right ;
|
||||||
|
float: right ;
|
||||||
|
margin-left: 1em }
|
||||||
|
|
||||||
|
img.align-center, .figure.align-center, object.align-center {
|
||||||
|
display: block;
|
||||||
|
margin-left: auto;
|
||||||
|
margin-right: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.align-center {
|
||||||
|
margin-left: auto;
|
||||||
|
margin-right: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.align-left {
|
||||||
|
text-align: left }
|
||||||
|
|
||||||
|
.align-center {
|
||||||
|
clear: both ;
|
||||||
|
text-align: center }
|
||||||
|
|
||||||
|
.align-right {
|
||||||
|
text-align: right }
|
||||||
|
|
||||||
|
/* reset inner alignment in figures */
|
||||||
|
div.align-right {
|
||||||
|
text-align: inherit }
|
||||||
|
|
||||||
|
/* div.align-center * { */
|
||||||
|
/* text-align: left } */
|
||||||
|
|
||||||
|
.align-top {
|
||||||
|
vertical-align: top }
|
||||||
|
|
||||||
|
.align-middle {
|
||||||
|
vertical-align: middle }
|
||||||
|
|
||||||
|
.align-bottom {
|
||||||
|
vertical-align: bottom }
|
||||||
|
|
||||||
|
ol.simple, ul.simple {
|
||||||
|
margin-bottom: 1em }
|
||||||
|
|
||||||
|
ol.arabic {
|
||||||
|
list-style: decimal }
|
||||||
|
|
||||||
|
ol.loweralpha {
|
||||||
|
list-style: lower-alpha }
|
||||||
|
|
||||||
|
ol.upperalpha {
|
||||||
|
list-style: upper-alpha }
|
||||||
|
|
||||||
|
ol.lowerroman {
|
||||||
|
list-style: lower-roman }
|
||||||
|
|
||||||
|
ol.upperroman {
|
||||||
|
list-style: upper-roman }
|
||||||
|
|
||||||
|
p.attribution {
|
||||||
|
text-align: right ;
|
||||||
|
margin-left: 50% }
|
||||||
|
|
||||||
|
p.caption {
|
||||||
|
font-style: italic }
|
||||||
|
|
||||||
|
p.credits {
|
||||||
|
font-style: italic ;
|
||||||
|
font-size: smaller }
|
||||||
|
|
||||||
|
p.label {
|
||||||
|
white-space: nowrap }
|
||||||
|
|
||||||
|
p.rubric {
|
||||||
|
font-weight: bold ;
|
||||||
|
font-size: larger ;
|
||||||
|
color: maroon ;
|
||||||
|
text-align: center }
|
||||||
|
|
||||||
|
p.sidebar-title {
|
||||||
|
font-family: sans-serif ;
|
||||||
|
font-weight: bold ;
|
||||||
|
font-size: larger }
|
||||||
|
|
||||||
|
p.sidebar-subtitle {
|
||||||
|
font-family: sans-serif ;
|
||||||
|
font-weight: bold }
|
||||||
|
|
||||||
|
p.topic-title {
|
||||||
|
font-weight: bold }
|
||||||
|
|
||||||
|
pre.address {
|
||||||
|
margin-bottom: 0 ;
|
||||||
|
margin-top: 0 ;
|
||||||
|
font: inherit }
|
||||||
|
|
||||||
|
pre.literal-block, pre.doctest-block, pre.math, pre.code {
|
||||||
|
margin-left: 2em ;
|
||||||
|
margin-right: 2em }
|
||||||
|
|
||||||
|
pre.code .ln { color: grey; } /* line numbers */
|
||||||
|
pre.code, code { background-color: #eeeeee }
|
||||||
|
pre.code .comment, code .comment { color: #5C6576 }
|
||||||
|
pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold }
|
||||||
|
pre.code .literal.string, code .literal.string { color: #0C5404 }
|
||||||
|
pre.code .name.builtin, code .name.builtin { color: #352B84 }
|
||||||
|
pre.code .deleted, code .deleted { background-color: #DEB0A1}
|
||||||
|
pre.code .inserted, code .inserted { background-color: #A3D289}
|
||||||
|
|
||||||
|
span.classifier {
|
||||||
|
font-family: sans-serif ;
|
||||||
|
font-style: oblique }
|
||||||
|
|
||||||
|
span.classifier-delimiter {
|
||||||
|
font-family: sans-serif ;
|
||||||
|
font-weight: bold }
|
||||||
|
|
||||||
|
span.interpreted {
|
||||||
|
font-family: sans-serif }
|
||||||
|
|
||||||
|
span.option {
|
||||||
|
white-space: nowrap }
|
||||||
|
|
||||||
|
span.pre {
|
||||||
|
white-space: pre }
|
||||||
|
|
||||||
|
span.problematic {
|
||||||
|
color: red }
|
||||||
|
|
||||||
|
span.section-subtitle {
|
||||||
|
/* font-size relative to parent (h1..h6 element) */
|
||||||
|
font-size: 80% }
|
||||||
|
|
||||||
|
table.citation {
|
||||||
|
border-left: solid 1px gray;
|
||||||
|
margin-left: 1px }
|
||||||
|
|
||||||
|
table.docinfo {
|
||||||
|
margin: 2em 4em }
|
||||||
|
|
||||||
|
table.docutils {
|
||||||
|
margin-top: 0.5em ;
|
||||||
|
margin-bottom: 0.5em }
|
||||||
|
|
||||||
|
table.footnote {
|
||||||
|
border-left: solid 1px black;
|
||||||
|
margin-left: 1px }
|
||||||
|
|
||||||
|
table.docutils td, table.docutils th,
|
||||||
|
table.docinfo td, table.docinfo th {
|
||||||
|
padding-left: 0.5em ;
|
||||||
|
padding-right: 0.5em ;
|
||||||
|
vertical-align: top }
|
||||||
|
|
||||||
|
table.docutils th.field-name, table.docinfo th.docinfo-name {
|
||||||
|
font-weight: bold ;
|
||||||
|
text-align: left ;
|
||||||
|
white-space: nowrap ;
|
||||||
|
padding-left: 0 }
|
||||||
|
|
||||||
|
/* "booktabs" style (no vertical lines) */
|
||||||
|
table.docutils.booktabs {
|
||||||
|
border: 0px;
|
||||||
|
border-top: 2px solid;
|
||||||
|
border-bottom: 2px solid;
|
||||||
|
border-collapse: collapse;
|
||||||
|
}
|
||||||
|
table.docutils.booktabs * {
|
||||||
|
border: 0px;
|
||||||
|
}
|
||||||
|
table.docutils.booktabs th {
|
||||||
|
border-bottom: thin solid;
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
h1 tt.docutils, h2 tt.docutils, h3 tt.docutils,
|
||||||
|
h4 tt.docutils, h5 tt.docutils, h6 tt.docutils {
|
||||||
|
font-size: 100% }
|
||||||
|
|
||||||
|
ul.auto-toc {
|
||||||
|
list-style-type: none }
|
||||||
|
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="document" id="base-usability">
|
||||||
|
<h1 class="title">Base Usability</h1>
|
||||||
|
|
||||||
|
<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||||
|
!! This file is generated by oca-gen-addon-readme !!
|
||||||
|
!! changes will be overwritten. !!
|
||||||
|
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
|
||||||
|
<p><a class="reference external" href="https://odoo-community.org/page/development-status"><img alt="Beta" src="https://img.shields.io/badge/maturity-Beta-yellow.png" /></a> <a class="reference external" href="http://www.gnu.org/licenses/agpl-3.0-standalone.html"><img alt="License: AGPL-3" src="https://img.shields.io/badge/licence-AGPL--3-blue.png" /></a> <a class="reference external" href="https://github.com/akretion/odoo-usability/tree/12.0/base_usability"><img alt="akretion/odoo-usability" src="https://img.shields.io/badge/github-akretion%2Fodoo--usability-lightgray.png?logo=github" /></a></p>
|
||||||
|
<p>This module adds the following functions:</p>
|
||||||
|
<ul class="simple">
|
||||||
|
<li>Adds <em>track_visibility=’onchange’</em> on all the important fields of the Partner object</li>
|
||||||
|
<li>By default, Odoo doesn’t display the title field on all the partner form views. This module fixes it (it replaces the module base_title_on_partner)</li>
|
||||||
|
<li>Adds a log message at INFO level when sending an email via SMTP</li>
|
||||||
|
<li>Displays the local modules with installable filter</li>
|
||||||
|
<li>A group by “State” is added to module search view</li>
|
||||||
|
<li>Provides a _display_report_header method on the res.company object and _display_full_address on res.partner which are useful for reporting.</li>
|
||||||
|
<li>Add model in cron tree view</li>
|
||||||
|
<li>Add prefix field in sequence search view</li>
|
||||||
|
<li>Better search and form view for country and state</li>
|
||||||
|
<li>Display technical name of modules in kanban view</li>
|
||||||
|
<li>Change module filter to <cite>installable</cite></li>
|
||||||
|
<li>Add widget=handle on sequence of res.partner.bank</li>
|
||||||
|
<li>Add city and country in partner tree view</li>
|
||||||
|
<li>Add widget=”email” on email of contacts</li>
|
||||||
|
<li>Add script to fix partners related to users in multi-company setup</li>
|
||||||
|
<li>Add methods for py3o reports</li>
|
||||||
|
<li>Add name_get() on ir.model</li>
|
||||||
|
<li>Language wizard defaults to “.po”</li>
|
||||||
|
<li>Add tracking on partner fields</li>
|
||||||
|
<li>Handle lang in name_title field</li>
|
||||||
|
<li>Remove empty lines in address</li>
|
||||||
|
<li>Add bank Name field on res.partner.bank</li>
|
||||||
|
<li>Partners auto-created for users are Suppliers and not Customers</li>
|
||||||
|
</ul>
|
||||||
|
<p><strong>Table of contents</strong></p>
|
||||||
|
<div class="contents local topic" id="contents">
|
||||||
|
<ul class="simple">
|
||||||
|
<li><a class="reference internal" href="#bug-tracker" id="id1">Bug Tracker</a></li>
|
||||||
|
<li><a class="reference internal" href="#credits" id="id2">Credits</a><ul>
|
||||||
|
<li><a class="reference internal" href="#authors" id="id3">Authors</a></li>
|
||||||
|
<li><a class="reference internal" href="#contributors" id="id4">Contributors</a></li>
|
||||||
|
<li><a class="reference internal" href="#maintainers" id="id5">Maintainers</a></li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div class="section" id="bug-tracker">
|
||||||
|
<h1><a class="toc-backref" href="#id1">Bug Tracker</a></h1>
|
||||||
|
<p>Bugs are tracked on <a class="reference external" href="https://github.com/akretion/odoo-usability/issues">GitHub Issues</a>.
|
||||||
|
In case of trouble, please check there if your issue has already been reported.
|
||||||
|
If you spotted it first, help us smashing it by providing a detailed and welcomed
|
||||||
|
<a class="reference external" href="https://github.com/akretion/odoo-usability/issues/new?body=module:%20base_usability%0Aversion:%2012.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**">feedback</a>.</p>
|
||||||
|
<p>Do not contact contributors directly about support or help with technical issues.</p>
|
||||||
|
</div>
|
||||||
|
<div class="section" id="credits">
|
||||||
|
<h1><a class="toc-backref" href="#id2">Credits</a></h1>
|
||||||
|
<div class="section" id="authors">
|
||||||
|
<h2><a class="toc-backref" href="#id3">Authors</a></h2>
|
||||||
|
<ul class="simple">
|
||||||
|
<li>Akretion</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div class="section" id="contributors">
|
||||||
|
<h2><a class="toc-backref" href="#id4">Contributors</a></h2>
|
||||||
|
<ul class="simple">
|
||||||
|
<li>Alexis de Lattre <<a class="reference external" href="mailto:alexis.delattre@akretion.com">alexis.delattre@akretion.com</a>></li>
|
||||||
|
<li>David Beal <<a class="reference external" href="mailto:david.beal@akretion.com">david.beal@akretion.com</a>></li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div class="section" id="maintainers">
|
||||||
|
<h2><a class="toc-backref" href="#id5">Maintainers</a></h2>
|
||||||
|
<p>This module is part of the <a class="reference external" href="https://github.com/akretion/odoo-usability/tree/12.0/base_usability">akretion/odoo-usability</a> project on GitHub.</p>
|
||||||
|
<p>You are welcome to contribute.</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
@@ -12,4 +12,14 @@
|
|||||||
</field>
|
</field>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
|
<record id="view_sequence_search" model="ir.ui.view">
|
||||||
|
<field name="model">ir.sequence</field>
|
||||||
|
<field name="inherit_id" ref="base.view_sequence_search"/>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<field name="name" position="after">
|
||||||
|
<field name="prefix"/>
|
||||||
|
</field>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
</odoo>
|
</odoo>
|
||||||
|
|||||||
@@ -12,7 +12,7 @@
|
|||||||
<field name="model">ir.module.module</field>
|
<field name="model">ir.module.module</field>
|
||||||
<field name="inherit_id" ref="base.module_view_kanban"/>
|
<field name="inherit_id" ref="base.module_view_kanban"/>
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<xpath expr="//h4[@class='o_kanban_record_title']/code[@groups='base.group_no_one']" position="before">
|
<xpath expr="//h4[hasclass('o_kanban_record_title')]/code[@groups='base.group_no_one']" position="before">
|
||||||
<br/>
|
<br/>
|
||||||
</xpath>
|
</xpath>
|
||||||
</field>
|
</field>
|
||||||
|
|||||||
@@ -12,10 +12,6 @@
|
|||||||
<field name="model">res.partner</field>
|
<field name="model">res.partner</field>
|
||||||
<field name="inherit_id" ref="base.view_partner_form"/>
|
<field name="inherit_id" ref="base.view_partner_form"/>
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<!-- Wider 'name' field -->
|
|
||||||
<xpath expr="//sheet/div[hasclass('oe_title')]" position="attributes">
|
|
||||||
<attribute name="style">width: 650px;</attribute>
|
|
||||||
</xpath>
|
|
||||||
<xpath expr="//field[@name='child_ids']/form//field[@name='email']" position="attributes">
|
<xpath expr="//field[@name='child_ids']/form//field[@name='email']" position="attributes">
|
||||||
<attribute name="widget">email</attribute>
|
<attribute name="widget">email</attribute>
|
||||||
</xpath>
|
</xpath>
|
||||||
@@ -61,6 +57,9 @@
|
|||||||
<!-- for 'ref', change '=' to 'start with' -->
|
<!-- for 'ref', change '=' to 'start with' -->
|
||||||
<attribute name="filter_domain">['|','|',('display_name','ilike',self),('ref','=ilike',self + '%'),('email','ilike',self)]</attribute>
|
<attribute name="filter_domain">['|','|',('display_name','ilike',self),('ref','=ilike',self + '%'),('email','ilike',self)]</attribute>
|
||||||
</field>
|
</field>
|
||||||
|
<filter name="inactive" position="before">
|
||||||
|
<separator/>
|
||||||
|
</filter>
|
||||||
</field>
|
</field>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
|
|||||||
@@ -20,8 +20,7 @@ This module has been written by Alexis de Lattre from Akretion <alexis.delattre@
|
|||||||
""",
|
""",
|
||||||
'author': 'Akretion',
|
'author': 'Akretion',
|
||||||
'website': 'http://www.akretion.com',
|
'website': 'http://www.akretion.com',
|
||||||
# 'depends': ['intrastat_product', 'l10n_fr_intrastat_service'],
|
'depends': ['intrastat_product', 'l10n_fr_intrastat_service'],
|
||||||
'depends': ['intrastat_product'],
|
|
||||||
'data': ['product_view.xml'],
|
'data': ['product_view.xml'],
|
||||||
'post_init_hook': 'set_intrastat_type_on_products',
|
'post_init_hook': 'set_intrastat_type_on_products',
|
||||||
'installable': True,
|
'installable': True,
|
||||||
|
|||||||
@@ -60,14 +60,14 @@ class ProductTemplate(models.Model):
|
|||||||
return super(ProductTemplate, self).create(vals)
|
return super(ProductTemplate, self).create(vals)
|
||||||
|
|
||||||
|
|
||||||
#class L10nFrIntrastatServiceDeclaration(models.Model):
|
class L10nFrIntrastatServiceDeclaration(models.Model):
|
||||||
# _inherit = "l10n.fr.intrastat.service.declaration"
|
_inherit = "l10n.fr.intrastat.service.declaration"
|
||||||
|
|
||||||
# def _is_service(self, invoice_line):
|
def _is_service(self, invoice_line):
|
||||||
# if invoice_line.product_id.intrastat_type == 'service':
|
if invoice_line.product_id.intrastat_type == 'service':
|
||||||
# return True
|
return True
|
||||||
# else:
|
else:
|
||||||
# return False
|
return False
|
||||||
|
|
||||||
|
|
||||||
class IntrastatProductDeclaration(models.Model):
|
class IntrastatProductDeclaration(models.Model):
|
||||||
|
|||||||
19
mail_usability/README.rst
Normal file
19
mail_usability/README.rst
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
# Mail Usability
|
||||||
|
|
||||||
|
Take back the control on your email
|
||||||
|
|
||||||
|
## Feature
|
||||||
|
|
||||||
|
- do not follow automatically a object when sending an email
|
||||||
|
- better email preview, allow to select between the whole database object and not only the last 10
|
||||||
|
- use a light template version for notification without link (link should be explicit)
|
||||||
|
- add some additional style in the white list when santizing html field (see tools.py)
|
||||||
|
- make the email template by default not 'auto_delete'
|
||||||
|
|
||||||
|
## TIPS
|
||||||
|
|
||||||
|
Never, never tick the 'auto_delete' on mail template because it fucking hard to debug
|
||||||
|
and understand what have been sent (we should create a module with a crontask, that drop them latter)
|
||||||
|
|
||||||
|
If the template of mail do not look like the same when saving it in odoo, maybe the sanitize style have drop some balise
|
||||||
|
please run odoo with "LOG_STYLE_SANITIZE=True odoo" to understand what have been drop, magic warning logger will tell you everthing
|
||||||
2
mail_usability/__init__.py
Normal file
2
mail_usability/__init__.py
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
from . import models
|
||||||
|
from . import wizard
|
||||||
33
mail_usability/__manifest__.py
Normal file
33
mail_usability/__manifest__.py
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
# Copyright 2020 Akretion France (http://www.akretion.com)
|
||||||
|
# @author Benoît Guillot <benoit.guillot@akretion.com>
|
||||||
|
# @author Alexis de Lattre <alexis.delattre@akretion.com>
|
||||||
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||||
|
|
||||||
|
{
|
||||||
|
'name': 'Mail Usability',
|
||||||
|
'version': '12.0.1.0.0',
|
||||||
|
'category': 'Base',
|
||||||
|
'license': 'AGPL-3',
|
||||||
|
'summary': 'Usability improvements on mails',
|
||||||
|
'description': """
|
||||||
|
Mail Usability
|
||||||
|
==============
|
||||||
|
|
||||||
|
Small usability improvements on mails:
|
||||||
|
|
||||||
|
* remove link in mail footer
|
||||||
|
|
||||||
|
* remove 'sent by' in notification footer
|
||||||
|
|
||||||
|
* add a new entry *All Messages Except Notifications* to the field *Receive Inbox Notifications by Email* of partners (becomes the default value)
|
||||||
|
""",
|
||||||
|
'author': 'Akretion',
|
||||||
|
'website': 'http://www.akretion.com',
|
||||||
|
'depends': ['mail'],
|
||||||
|
'data': [
|
||||||
|
'views/mail_view.xml',
|
||||||
|
'data/mail_data.xml',
|
||||||
|
'wizard/email_template_preview_view.xml',
|
||||||
|
],
|
||||||
|
'installable': True,
|
||||||
|
}
|
||||||
18
mail_usability/data/mail_data.xml
Normal file
18
mail_usability/data/mail_data.xml
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<odoo noupdate="1">
|
||||||
|
|
||||||
|
<!--Default Notification Email template -->
|
||||||
|
<record id="mail_template_notification" model="mail.template">
|
||||||
|
<field name="name">Notification Email</field>
|
||||||
|
<field name="subject">${object.subject}</field>
|
||||||
|
<field name="model_id" ref="mail.model_mail_message"/>
|
||||||
|
<field name="auto_delete" eval="True"/>
|
||||||
|
<field name="body_html">${object.body | safe}</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<template id="message_notification_email_usability">
|
||||||
|
<div t-raw="message.body"/>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
|
||||||
|
</odoo>
|
||||||
5
mail_usability/models/__init__.py
Normal file
5
mail_usability/models/__init__.py
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
from . import mail
|
||||||
|
from . import tools
|
||||||
|
from . import mail_template
|
||||||
|
from . import mail_message
|
||||||
|
from . import res_partner
|
||||||
36
mail_usability/models/mail.py
Normal file
36
mail_usability/models/mail.py
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
# Copyright 2016-2017 Akretion France (http://www.akretion.com)
|
||||||
|
# @author: Alexis de Lattre <alexis.delattre@akretion.com>
|
||||||
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||||
|
|
||||||
|
|
||||||
|
from odoo import models, api
|
||||||
|
import logging
|
||||||
|
_logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
|
class MailThread(models.AbstractModel):
|
||||||
|
_inherit = 'mail.thread'
|
||||||
|
|
||||||
|
def _active_message_auto_subscribe_notify(self):
|
||||||
|
_logger.debug('Skip automatic subscribe notification')
|
||||||
|
return False
|
||||||
|
|
||||||
|
def _message_auto_subscribe_notify(self, partner_ids, template):
|
||||||
|
if self._active_message_auto_subscribe_notify():
|
||||||
|
return super(MailThread, self)._message_auto_subscribe_notify(
|
||||||
|
partner_ids, template)
|
||||||
|
else:
|
||||||
|
return True
|
||||||
|
|
||||||
|
@api.multi
|
||||||
|
@api.returns('self', lambda value: value.id)
|
||||||
|
def message_post(self, body='', subject=None, message_type='notification',
|
||||||
|
subtype=None, parent_id=False, attachments=None,
|
||||||
|
content_subtype='html', **kwargs):
|
||||||
|
if not 'mail_create_nosubscribe' in self._context:
|
||||||
|
# Do not implicitly follow an object by just sending a message
|
||||||
|
self = self.with_context(mail_create_nosubscribe=True)
|
||||||
|
return super(MailThread, self).message_post(
|
||||||
|
body=body, subject=subject, message_type=message_type,
|
||||||
|
subtype=subtype, parent_id=parent_id, attachments=attachments,
|
||||||
|
content_subtype=content_subtype, **kwargs)
|
||||||
19
mail_usability/models/mail_message.py
Normal file
19
mail_usability/models/mail_message.py
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
# Copyright 2019 Akretion France (http://www.akretion.com)
|
||||||
|
# @author Sébastien BEAU <sebastien.beau@akretion.com>
|
||||||
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||||
|
|
||||||
|
from odoo import models
|
||||||
|
|
||||||
|
|
||||||
|
class MailMessage(models.Model):
|
||||||
|
_inherit = 'mail.message'
|
||||||
|
|
||||||
|
@property
|
||||||
|
def record_id(self):
|
||||||
|
# we do not use a reference field here as mail message
|
||||||
|
# are used everywhere and many model are not yet loaded
|
||||||
|
# so odoo raise exception
|
||||||
|
if self:
|
||||||
|
self.ensure_one()
|
||||||
|
return self.env[self.model].browse(self.res_id)
|
||||||
|
return None
|
||||||
11
mail_usability/models/mail_template.py
Normal file
11
mail_usability/models/mail_template.py
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
# Copyright 2018 Akretion France (http://www.akretion.com)
|
||||||
|
# @author Sébastien BEAU <sebastien.beau@akretion.com>
|
||||||
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||||
|
|
||||||
|
from openerp import fields, models
|
||||||
|
|
||||||
|
|
||||||
|
class MailTemplate(models.Model):
|
||||||
|
_inherit = 'mail.template'
|
||||||
|
|
||||||
|
auto_delete = fields.Boolean(default=False)
|
||||||
27
mail_usability/models/res_partner.py
Normal file
27
mail_usability/models/res_partner.py
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
# Copyright 2016-2019 Akretion France (http://www.akretion.com)
|
||||||
|
# @author Sébastien BEAU <sebastien.beau@akretion.com>
|
||||||
|
# @author: Alexis de Lattre <alexis.delattre@akretion.com>
|
||||||
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||||
|
|
||||||
|
from odoo import models, fields, api
|
||||||
|
|
||||||
|
|
||||||
|
class ResPartner(models.Model):
|
||||||
|
_inherit = 'res.partner'
|
||||||
|
|
||||||
|
opt_out = fields.Boolean(track_visibility='onchange')
|
||||||
|
|
||||||
|
@api.model
|
||||||
|
def _notify(self, message, rdata, record, force_send=False,
|
||||||
|
send_after_commit=True, model_description=False,
|
||||||
|
mail_auto_delete=True):
|
||||||
|
# use an empty layout for notification by default
|
||||||
|
if not message.layout:
|
||||||
|
message.layout = 'mail_usability.message_notification_email_usability'
|
||||||
|
# Never auto delete notification email
|
||||||
|
# fucking to hard to debug when message have been delete
|
||||||
|
mail_auto_delete = False
|
||||||
|
return super(ResPartner, self)._notify(
|
||||||
|
message=message, rdata=rdata, record=record,
|
||||||
|
force_send=force_send, send_after_commit=send_after_commit,
|
||||||
|
model_description=model_description, mail_auto_delete=mail_auto_delete)
|
||||||
43
mail_usability/models/tools.py
Normal file
43
mail_usability/models/tools.py
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
# Copyright 2018 Akretion France (http://www.akretion.com)
|
||||||
|
# @author Sébastien BEAU <sebastien.beau@akretion.com>
|
||||||
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||||
|
|
||||||
|
from odoo.tools.mail import _Cleaner
|
||||||
|
import os
|
||||||
|
import logging
|
||||||
|
_logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
_Cleaner._style_whitelist += [
|
||||||
|
'word-wrap',
|
||||||
|
'display'
|
||||||
|
'border-top',
|
||||||
|
'border-bottom',
|
||||||
|
'border-left',
|
||||||
|
'border-right',
|
||||||
|
'text-transform',
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
if os.getenv('LOG_STYLE_SANITIZE'):
|
||||||
|
# Monkey patch the parse style method to debug
|
||||||
|
# the missing style
|
||||||
|
def parse_style(self, el):
|
||||||
|
attributes = el.attrib
|
||||||
|
styling = attributes.get('style')
|
||||||
|
if styling:
|
||||||
|
valid_styles = {}
|
||||||
|
styles = self._style_re.findall(styling)
|
||||||
|
for style in styles:
|
||||||
|
if style[0].lower() in self._style_whitelist:
|
||||||
|
valid_styles[style[0].lower()] = style[1]
|
||||||
|
# START HACK
|
||||||
|
else:
|
||||||
|
_logger.warning('Remove style %s %s', *style)
|
||||||
|
# END HACK
|
||||||
|
if valid_styles:
|
||||||
|
el.attrib['style'] = '; '.join(
|
||||||
|
'%s:%s' % (key, val)
|
||||||
|
for (key, val) in valid_styles.iteritems())
|
||||||
|
else:
|
||||||
|
del el.attrib['style']
|
||||||
|
_Cleaner.parse_style = parse_style
|
||||||
BIN
mail_usability/static/description/icon.png
Normal file
BIN
mail_usability/static/description/icon.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 9.5 KiB |
16
mail_usability/views/mail_view.xml
Normal file
16
mail_usability/views/mail_view.xml
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<odoo>
|
||||||
|
|
||||||
|
<record id="view_mail_tree" model="ir.ui.view">
|
||||||
|
<field name="model">mail.mail</field>
|
||||||
|
<field name="inherit_id" ref="mail.view_mail_tree"/>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<field name="email_from" position="replace"/>
|
||||||
|
<field name="date" position="after">
|
||||||
|
<field name="email_from"/>
|
||||||
|
<field name="email_to"/>
|
||||||
|
</field>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
</odoo>
|
||||||
1
mail_usability/wizard/__init__.py
Normal file
1
mail_usability/wizard/__init__.py
Normal file
@@ -0,0 +1 @@
|
|||||||
|
from . import email_template_preview
|
||||||
43
mail_usability/wizard/email_template_preview.py
Normal file
43
mail_usability/wizard/email_template_preview.py
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
# Copyright 2019 Akretion France (http://www.akretion.com)
|
||||||
|
# @author Sébastien BEAU <sebastien.beau@akretion.com>
|
||||||
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||||
|
|
||||||
|
from openerp import api, fields, models
|
||||||
|
|
||||||
|
|
||||||
|
class TemplatePreview(models.TransientModel):
|
||||||
|
_inherit = "email_template.preview"
|
||||||
|
|
||||||
|
res_id = fields.Integer(compute='_compute_res_id')
|
||||||
|
object_id = fields.Reference(selection='_reference_models')
|
||||||
|
|
||||||
|
@api.model
|
||||||
|
def default_get(self, fields):
|
||||||
|
result = super(TemplatePreview, self).default_get(fields)
|
||||||
|
if result.get('model_id'):
|
||||||
|
model = self.env['ir.model'].browse(result['model_id'])
|
||||||
|
result['object_id'] = model.model
|
||||||
|
return result
|
||||||
|
|
||||||
|
def _reference_models(self):
|
||||||
|
result = self.default_get(['model_id'])
|
||||||
|
if result.get('model_id'):
|
||||||
|
model = self.env['ir.model'].browse(result['model_id'])
|
||||||
|
return [(model.model, model.name)]
|
||||||
|
else:
|
||||||
|
ir_models = self.env['ir.model'].search([('state', '!=', 'manual')])
|
||||||
|
return [(ir_model.model, ir_model.name)
|
||||||
|
for ir_model in ir_models
|
||||||
|
if not ir_model.model.startswith('ir.')]
|
||||||
|
|
||||||
|
@api.depends('object_id')
|
||||||
|
def _compute_res_id(self):
|
||||||
|
for record in self:
|
||||||
|
if self.object_id:
|
||||||
|
record.res_id = self.object_id.id
|
||||||
|
|
||||||
|
def send(self):
|
||||||
|
template = self.env['mail.template'].browse(
|
||||||
|
self._context['template_id'])
|
||||||
|
template.send_mail(
|
||||||
|
self.res_id, force_send=True, raise_exception=True)
|
||||||
24
mail_usability/wizard/email_template_preview_view.xml
Normal file
24
mail_usability/wizard/email_template_preview_view.xml
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<odoo>
|
||||||
|
|
||||||
|
<record id="email_template_preview_form" model="ir.ui.view">
|
||||||
|
<field name="model">email_template.preview</field>
|
||||||
|
<field name="inherit_id" ref="mail.email_template_preview_form"/>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<field name="res_id" position="attributes">
|
||||||
|
<attribute name="invisible">True</attribute>
|
||||||
|
</field>
|
||||||
|
<field name="res_id" position="after">
|
||||||
|
<field name="object_id"/>
|
||||||
|
</field>
|
||||||
|
<footer position="inside">
|
||||||
|
<button
|
||||||
|
string="Send"
|
||||||
|
name="send"
|
||||||
|
class="btn-primary"
|
||||||
|
type='object'/>
|
||||||
|
</footer>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
</odoo>
|
||||||
@@ -252,9 +252,9 @@ class MrpProduction(models.Model):
|
|||||||
for order in self:
|
for order in self:
|
||||||
if order.product_id.cost_method == 'average':
|
if order.product_id.cost_method == 'average':
|
||||||
unit_cost = order.compute_order_unit_cost()
|
unit_cost = order.compute_order_unit_cost()
|
||||||
order.unit_cost = unit_cost
|
order.write({'unit_cost': unit_cost})
|
||||||
logger.info('MO %s: unit_cost=%s', order.name, unit_cost)
|
logger.info('MO %s: unit_cost=%s', order.name, unit_cost)
|
||||||
for finished_move in order.move_finished_ids.filtered(
|
order.move_finished_ids.filtered(
|
||||||
lambda x: x.product_id == order.product_id):
|
lambda x: x.product_id == order.product_id).write({
|
||||||
finished_move.price_unit = unit_cost
|
'price_unit': unit_cost})
|
||||||
return super(MrpProduction, self).post_inventory()
|
return super(MrpProduction, self).post_inventory()
|
||||||
|
|||||||
@@ -37,7 +37,7 @@
|
|||||||
</group>
|
</group>
|
||||||
</page>
|
</page>
|
||||||
</notebook>
|
</notebook>
|
||||||
<xpath expr="//field[@name='bom_line_ids']/tree/field[@name='product_uom_id']" position="after">
|
<xpath expr="//field[@name='bom_line_ids']/tree/field[@name='operation_id']" position="after">
|
||||||
<field name="standard_price"/>
|
<field name="standard_price"/>
|
||||||
</xpath>
|
</xpath>
|
||||||
</field>
|
</field>
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ MRP Usability
|
|||||||
:target: https://github.com/akretion/odoo-usability/tree/12.0/mrp_usability
|
:target: https://github.com/akretion/odoo-usability/tree/12.0/mrp_usability
|
||||||
:alt: akretion/odoo-usability
|
:alt: akretion/odoo-usability
|
||||||
|
|
||||||
|badge1| |badge2| |badge3|
|
|badge1| |badge2| |badge3|
|
||||||
|
|
||||||
Small usability improvements on MRP:
|
Small usability improvements on MRP:
|
||||||
|
|
||||||
@@ -31,6 +31,8 @@ Small usability improvements on MRP:
|
|||||||
|
|
||||||
* complete Manufacturing Order report with unvailable products
|
* complete Manufacturing Order report with unvailable products
|
||||||
|
|
||||||
|
* improve smart button from products to BoMs (display BoM form if only one instead of displaying a list of one)
|
||||||
|
|
||||||
**Table of contents**
|
**Table of contents**
|
||||||
|
|
||||||
.. contents::
|
.. contents::
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
from . import mrp
|
from . import models
|
||||||
|
|||||||
@@ -13,7 +13,8 @@
|
|||||||
'website': 'http://www.akretion.com',
|
'website': 'http://www.akretion.com',
|
||||||
'depends': ['mrp'],
|
'depends': ['mrp'],
|
||||||
'data': [
|
'data': [
|
||||||
'mrp_view.xml',
|
'views/mrp_views.xml',
|
||||||
|
'views/product_views.xml',
|
||||||
'report/mrp_report.xml'
|
'report/mrp_report.xml'
|
||||||
],
|
],
|
||||||
'installable': True,
|
'installable': True,
|
||||||
|
|||||||
@@ -6,8 +6,8 @@ msgid ""
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: Odoo Server 12.0\n"
|
"Project-Id-Version: Odoo Server 12.0\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2019-07-16 13:56+0000\n"
|
"POT-Creation-Date: 2020-10-06 13:37+0000\n"
|
||||||
"PO-Revision-Date: 2019-07-16 16:01+0200\n"
|
"PO-Revision-Date: 2020-10-06 15:38+0200\n"
|
||||||
"Last-Translator: <>\n"
|
"Last-Translator: <>\n"
|
||||||
"Language-Team: \n"
|
"Language-Team: \n"
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
@@ -15,41 +15,52 @@ msgstr ""
|
|||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"Plural-Forms: \n"
|
"Plural-Forms: \n"
|
||||||
"Language: fr\n"
|
"Language: fr\n"
|
||||||
"X-Generator: Poedit 2.0.6\n"
|
"X-Generator: Poedit 2.3\n"
|
||||||
|
|
||||||
#. module: mrp_usability
|
#. module: mrp_usability
|
||||||
#: model_terms:ir.ui.view,arch_db:mrp_usability.mrp_production_form_view
|
#: model_terms:ir.ui.view,arch_db:mrp_usability.mrp_production_form_view
|
||||||
msgid "Are you sure you want to cancel this manufacturing order?"
|
msgid "Are you sure you want to cancel this manufacturing order?"
|
||||||
msgstr "Etes vous sur de vouloir annuler cet ordre de production"
|
msgstr "Etes vous sur de vouloir annuler cet ordre de production"
|
||||||
|
|
||||||
|
#. module: mrp_usability
|
||||||
|
#: model_terms:ir.ui.view,arch_db:mrp_usability.product_template_form_view_bom_button
|
||||||
|
msgid "Bill of Materials"
|
||||||
|
msgstr "Nomenclature"
|
||||||
|
|
||||||
#. module: mrp_usability
|
#. module: mrp_usability
|
||||||
#: model_terms:ir.ui.view,arch_db:mrp_usability.report_mrporder
|
#: model_terms:ir.ui.view,arch_db:mrp_usability.report_mrporder
|
||||||
msgid "Lot"
|
msgid "Lot"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#. module: mrp_usability
|
#. module: mrp_usability
|
||||||
|
#: model:ir.model,name:mrp_usability.model_product_product
|
||||||
#: model_terms:ir.ui.view,arch_db:mrp_usability.report_mrporder
|
#: model_terms:ir.ui.view,arch_db:mrp_usability.report_mrporder
|
||||||
msgid "Product"
|
msgid "Product"
|
||||||
msgstr "Article"
|
msgstr "Article"
|
||||||
|
|
||||||
|
#. module: mrp_usability
|
||||||
|
#: model:ir.model,name:mrp_usability.model_product_template
|
||||||
|
msgid "Product Template"
|
||||||
|
msgstr "Modèle d'article"
|
||||||
|
|
||||||
#. module: mrp_usability
|
#. module: mrp_usability
|
||||||
#: model:ir.model,name:mrp_usability.model_mrp_production
|
#: model:ir.model,name:mrp_usability.model_mrp_production
|
||||||
msgid "Production Order"
|
msgid "Production Order"
|
||||||
msgstr "Ordre de production"
|
msgstr ""
|
||||||
|
|
||||||
#. module: mrp_usability
|
#. module: mrp_usability
|
||||||
#: model_terms:ir.ui.view,arch_db:mrp_usability.report_mrporder
|
#: model_terms:ir.ui.view,arch_db:mrp_usability.report_mrporder
|
||||||
msgid "Quantity"
|
msgid "Sold Out Quantity"
|
||||||
msgstr "Quantité"
|
msgstr "Quantité en Rupture"
|
||||||
|
|
||||||
#. module: mrp_usability
|
#. module: mrp_usability
|
||||||
#: model_terms:ir.ui.view,arch_db:mrp_usability.report_mrporder
|
#: model_terms:ir.ui.view,arch_db:mrp_usability.report_mrporder
|
||||||
msgid ""
|
msgid ""
|
||||||
"These products were unavailable (or partially) while edition of this Manufacturing Order.\n"
|
"These products were unavailable (or partially) while edition of this Manufacturing Order.\n"
|
||||||
" Here is complete quantities for these."
|
" Here is missing quantities."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Les produits ci-dessous étaient indisponibles (complètement ou partiellement) lors de l'édition de l'OF.<br/>\n"
|
"Les produits ci-dessous étaient indisponibles (complètement ou partiellement) lors de l'édition de l'OF.<br/>\n"
|
||||||
"Voici les quantités totales de ceux-ci."
|
"Voici les quantités manquantes."
|
||||||
|
|
||||||
#. module: mrp_usability
|
#. module: mrp_usability
|
||||||
#: model_terms:ir.ui.view,arch_db:mrp_usability.view_mrp_bom_filter
|
#: model_terms:ir.ui.view,arch_db:mrp_usability.view_mrp_bom_filter
|
||||||
|
|||||||
2
mrp_usability/models/__init__.py
Normal file
2
mrp_usability/models/__init__.py
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||||
|
from . import mrp, product
|
||||||
20
mrp_usability/models/mrp.py
Normal file
20
mrp_usability/models/mrp.py
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
# © 2015-2016 Akretion (http://www.akretion.com)
|
||||||
|
# @author Alexis de Lattre <alexis.delattre@akretion.com>
|
||||||
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||||
|
|
||||||
|
|
||||||
|
from odoo import api, models
|
||||||
|
|
||||||
|
|
||||||
|
class MrpProduction(models.Model):
|
||||||
|
_inherit = 'mrp.production'
|
||||||
|
_order = 'id desc'
|
||||||
|
|
||||||
|
@api.model
|
||||||
|
def get_stock_move_sold_out_report(self, move):
|
||||||
|
lines = move.active_move_line_ids
|
||||||
|
qty_in_lots = sum([x.product_uom_qty for x in lines])
|
||||||
|
diff = round(move.product_qty - qty_in_lots, 3)
|
||||||
|
if diff == 0.0:
|
||||||
|
return ""
|
||||||
|
return diff
|
||||||
44
mrp_usability/models/product.py
Normal file
44
mrp_usability/models/product.py
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
# Copyright (C) 2020 - Akretion
|
||||||
|
# License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0.html
|
||||||
|
|
||||||
|
from odoo import models
|
||||||
|
|
||||||
|
|
||||||
|
class ProductTemplate(models.Model):
|
||||||
|
_inherit = "product.template"
|
||||||
|
|
||||||
|
def action_view_bom(self):
|
||||||
|
"""Replace native action `template_open_bom` to distinguish if we will display
|
||||||
|
only one BoM form or a list of BoMs."""
|
||||||
|
self.ensure_one()
|
||||||
|
|
||||||
|
act_window_xml_id = "mrp.mrp_bom_form_action"
|
||||||
|
act_window = self.env.ref(act_window_xml_id).read()[0]
|
||||||
|
if self.bom_count > 1:
|
||||||
|
act_window["context"] = {
|
||||||
|
"default_product_tmpl_id": self.id,
|
||||||
|
"search_default_product_tmpl_id": self.id,
|
||||||
|
}
|
||||||
|
else:
|
||||||
|
act_window["context"] = {"default_product_tmpl_id": self.id}
|
||||||
|
act_window["views"] = [(self.env.ref("mrp.mrp_bom_form_view").id, "form")]
|
||||||
|
act_window["res_id"] = (
|
||||||
|
self.env["mrp.bom"].search([("product_tmpl_id", "=", self.id)]).id
|
||||||
|
)
|
||||||
|
|
||||||
|
return act_window
|
||||||
|
|
||||||
|
|
||||||
|
class ProductProduct(models.Model):
|
||||||
|
_inherit = "product.product"
|
||||||
|
|
||||||
|
def action_view_bom(self):
|
||||||
|
res = super().action_view_bom()
|
||||||
|
|
||||||
|
bom_target_ids = self.env["mrp.bom"].search(res["domain"])
|
||||||
|
|
||||||
|
if len(bom_target_ids) == 1:
|
||||||
|
res["views"] = [(self.env.ref("mrp.mrp_bom_form_view").id, "form")]
|
||||||
|
res["res_id"] = bom_target_ids[0].id
|
||||||
|
|
||||||
|
return res
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
# © 2015-2016 Akretion (http://www.akretion.com)
|
|
||||||
# @author Alexis de Lattre <alexis.delattre@akretion.com>
|
|
||||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
|
||||||
|
|
||||||
|
|
||||||
from odoo import models
|
|
||||||
|
|
||||||
|
|
||||||
class MrpProduction(models.Model):
|
|
||||||
_inherit = 'mrp.production'
|
|
||||||
_order = 'id desc'
|
|
||||||
@@ -9,3 +9,5 @@ Small usability improvements on MRP:
|
|||||||
* show bom type in tree view + add group by
|
* show bom type in tree view + add group by
|
||||||
|
|
||||||
* complete Manufacturing Order report with unvailable products
|
* complete Manufacturing Order report with unvailable products
|
||||||
|
|
||||||
|
* improve smart button from products to BoMs (display BoM form if only one instead of displaying a list of one)
|
||||||
|
|||||||
@@ -16,27 +16,26 @@
|
|||||||
t-value="any(o.move_raw_ids.filtered(lambda x: x.product_uom_qty > x.reserved_availability))"/>
|
t-value="any(o.move_raw_ids.filtered(lambda x: x.product_uom_qty > x.reserved_availability))"/>
|
||||||
<h4 if="has_product_unavailable">
|
<h4 if="has_product_unavailable">
|
||||||
These products were unavailable (or partially) while edition of this Manufacturing Order.
|
These products were unavailable (or partially) while edition of this Manufacturing Order.
|
||||||
Here is complete quantities for these.
|
Here is missing quantities.
|
||||||
</h4>
|
</h4>
|
||||||
<table class="table table-sm" t-if="o.move_raw_ids and has_product_unavailable">
|
<table class="table table-sm" t-if="o.move_raw_ids and has_product_unavailable">
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
<th>Product</th>
|
<th>Product</th>
|
||||||
<th>Quantity</th>
|
<th>Sold Out Quantity</th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
<t t-set="lines"
|
<t t-set="moves"
|
||||||
t-value="o.move_raw_ids.filtered(lambda x: x.product_uom_qty > x.reserved_availability)"/>
|
t-value="o.move_raw_ids.filtered(lambda x: x.product_uom_qty > x.reserved_availability)"/>
|
||||||
<t t-foreach="lines" t-as="ml">
|
<t t-foreach="moves" t-as="m">
|
||||||
<tr>
|
<tr>
|
||||||
<td>
|
<td>
|
||||||
<span t-field="ml.product_id"/>
|
<span t-field="m.product_id"/>
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
<span t-esc="ml.product_uom_qty" t-if="ml.state !='done'"/>
|
<span t-esc="o.get_stock_move_sold_out_report(m)" t-if="m.state !='done'"/>
|
||||||
<span t-esc="ml.qty_done" t-if="ml.state =='done'"/>
|
<span t-field="m.product_uom" groups="uom.group_uom"/>
|
||||||
<span t-field="ml.product_uom" groups="uom.group_uom"/>
|
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
</t>
|
</t>
|
||||||
|
|||||||
25
mrp_usability/views/product_views.xml
Normal file
25
mrp_usability/views/product_views.xml
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
<?xml version="1.0"?>
|
||||||
|
<odoo>
|
||||||
|
|
||||||
|
<record id="product_template_form_view_bom_button" model="ir.ui.view">
|
||||||
|
<field name="name">product.template.procurement</field>
|
||||||
|
<field name="model">product.template</field>
|
||||||
|
<field name="inherit_id" ref="mrp.product_template_form_view_bom_button" />
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
|
||||||
|
<xpath expr="//field[@name='bom_count']/.." position="attributes">
|
||||||
|
<attribute name="invisible">1</attribute>
|
||||||
|
</xpath>
|
||||||
|
<xpath expr="//field[@name='bom_count']/.." position="after">
|
||||||
|
<button class="oe_stat_button" name="action_view_bom" type="object"
|
||||||
|
attrs="{'invisible':[('type', 'not in', ['product', 'consu'])]}"
|
||||||
|
icon="fa-flask">
|
||||||
|
<field string="Bill of Materials" name="bom_count"
|
||||||
|
widget="statinfo" />
|
||||||
|
</button>
|
||||||
|
</xpath>
|
||||||
|
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
</odoo>
|
||||||
0
pos_usability/__init__.py
Normal file
0
pos_usability/__init__.py
Normal file
29
pos_usability/__manifest__.py
Normal file
29
pos_usability/__manifest__.py
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||||
|
|
||||||
|
{
|
||||||
|
"name": "POS Usability",
|
||||||
|
"version": "12.0.1.0.0",
|
||||||
|
"category": "Point of sale",
|
||||||
|
"license": "AGPL-3",
|
||||||
|
"summary": "Misc usability improvement for point of sale",
|
||||||
|
"description": """
|
||||||
|
POS Usability
|
||||||
|
=============
|
||||||
|
|
||||||
|
- Sales Details report : add sub total amount by tax
|
||||||
|
|
||||||
|
|
||||||
|
authors
|
||||||
|
-------
|
||||||
|
|
||||||
|
Akretion:
|
||||||
|
|
||||||
|
* David Béal <david.beal@akretion.com>
|
||||||
|
|
||||||
|
""",
|
||||||
|
"author": "Akretion",
|
||||||
|
"website": "http://www.akretion.com",
|
||||||
|
"depends": ["point_of_sale"],
|
||||||
|
"data": ["report/pos.xml"],
|
||||||
|
"installable": True,
|
||||||
|
}
|
||||||
23
pos_usability/i18n/fr.po
Normal file
23
pos_usability/i18n/fr.po
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
# Translation of Odoo Server.
|
||||||
|
# This file contains the translation of the following modules:
|
||||||
|
# * pos_usability
|
||||||
|
#
|
||||||
|
msgid ""
|
||||||
|
msgstr ""
|
||||||
|
"Project-Id-Version: Odoo Server 12.0\n"
|
||||||
|
"Report-Msgid-Bugs-To: \n"
|
||||||
|
"POT-Creation-Date: 2019-10-11 13:11+0000\n"
|
||||||
|
"PO-Revision-Date: 2019-10-11 15:11+0200\n"
|
||||||
|
"Last-Translator: <>\n"
|
||||||
|
"Language-Team: \n"
|
||||||
|
"MIME-Version: 1.0\n"
|
||||||
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
"Plural-Forms: \n"
|
||||||
|
"Language: fr\n"
|
||||||
|
"X-Generator: Poedit 2.0.6\n"
|
||||||
|
|
||||||
|
#. module: pos_usability
|
||||||
|
#: model_terms:ir.ui.view,arch_db:pos_usability.report_saledetails
|
||||||
|
msgid "Amount"
|
||||||
|
msgstr "Montant"
|
||||||
17
pos_usability/report/pos.xml
Normal file
17
pos_usability/report/pos.xml
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
|
||||||
|
<odoo>
|
||||||
|
|
||||||
|
<template id="report_saledetails" inherit_id="point_of_sale.report_saledetails">
|
||||||
|
|
||||||
|
<xpath expr="//table[3]/thead/tr/th[3]" position="after">
|
||||||
|
<th>Amount</th>
|
||||||
|
</xpath>
|
||||||
|
<xpath expr="//table[3]/tbody/tr" position="inside">
|
||||||
|
<td><t t-esc="tax['tax_amount'] + tax['base_amount']"
|
||||||
|
t-options="{'widget': 'float', 'precision': currency_precision}" /></td>
|
||||||
|
</xpath>
|
||||||
|
|
||||||
|
</template>
|
||||||
|
|
||||||
|
</odoo>
|
||||||
BIN
pos_usability/static/description/icon.png
Normal file
BIN
pos_usability/static/description/icon.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 9.5 KiB |
23
product_no_translation/__init__.py
Normal file
23
product_no_translation/__init__.py
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
# -*- encoding: utf-8 -*-
|
||||||
|
##############################################################################
|
||||||
|
#
|
||||||
|
# Product No Translation module for Odoo
|
||||||
|
# Copyright (C) 2014 Akretion (http://www.akretion.com)
|
||||||
|
# @author Alexis de Lattre <alexis.delattre@akretion.com>
|
||||||
|
#
|
||||||
|
# This program is free software: you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU Affero General Public License as
|
||||||
|
# published by the Free Software Foundation, either version 3 of the
|
||||||
|
# License, or (at your option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU Affero General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU Affero General Public License
|
||||||
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
#
|
||||||
|
##############################################################################
|
||||||
|
|
||||||
|
from . import product
|
||||||
40
product_no_translation/__manifest__.py
Normal file
40
product_no_translation/__manifest__.py
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
# -*- encoding: utf-8 -*-
|
||||||
|
##############################################################################
|
||||||
|
#
|
||||||
|
# Product No Translation module for Odoo
|
||||||
|
# Copyright (C) 2014 Akretion (http://www.akretion.com)
|
||||||
|
# @author Alexis de Lattre <alexis.delattre@akretion.com>
|
||||||
|
#
|
||||||
|
# This program is free software: you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU Affero General Public License as
|
||||||
|
# published by the Free Software Foundation, either version 3 of the
|
||||||
|
# License, or (at your option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU Affero General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU Affero General Public License
|
||||||
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
#
|
||||||
|
##############################################################################
|
||||||
|
|
||||||
|
|
||||||
|
{
|
||||||
|
'name': 'Product no Translation',
|
||||||
|
'version': '12.0.0.0.1',
|
||||||
|
'category': 'Sales Management',
|
||||||
|
'license': 'AGPL-3',
|
||||||
|
'summary': 'For companies that work with only one language',
|
||||||
|
'description': """
|
||||||
|
This module sets the translatable fields of the product object (name,
|
||||||
|
descriptions) to non-translatable fields.
|
||||||
|
|
||||||
|
This change is usefull for companies that work with only one language.
|
||||||
|
And it reduces the start time of the Point of Sale !
|
||||||
|
""",
|
||||||
|
'author': 'Akretion',
|
||||||
|
'website': 'http://www.akretion.com',
|
||||||
|
'depends': ['product'],
|
||||||
|
}
|
||||||
62
product_no_translation/product.py
Normal file
62
product_no_translation/product.py
Normal file
@@ -0,0 +1,62 @@
|
|||||||
|
# -*- encoding: utf-8 -*-
|
||||||
|
##############################################################################
|
||||||
|
#
|
||||||
|
# Product No Translation module for Odoo
|
||||||
|
# Copyright (C) 2014 Akretion (http://www.akretion.com)
|
||||||
|
# @author Alexis de Lattre <alexis.delattre@akretion.com>
|
||||||
|
#
|
||||||
|
# This program is free software: you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU Affero General Public License as
|
||||||
|
# published by the Free Software Foundation, either version 3 of the
|
||||||
|
# License, or (at your option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU Affero General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU Affero General Public License
|
||||||
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
#
|
||||||
|
##############################################################################
|
||||||
|
|
||||||
|
from odoo import models, fields
|
||||||
|
|
||||||
|
|
||||||
|
class ProductTemplate(models.Model):
|
||||||
|
_inherit = "product.template"
|
||||||
|
|
||||||
|
description_sale = fields.Text(translate=False)
|
||||||
|
description_purchase = fields.Text(translate=False)
|
||||||
|
description = fields.Text(translate=False)
|
||||||
|
name = fields.Char(translate=False)
|
||||||
|
|
||||||
|
|
||||||
|
class ProductCategory(models.Model):
|
||||||
|
_inherit = "product.category"
|
||||||
|
|
||||||
|
name = fields.Char(translate=False)
|
||||||
|
|
||||||
|
|
||||||
|
class ProductAttribute(models.Model):
|
||||||
|
_inherit = "product.attribute"
|
||||||
|
|
||||||
|
name = fields.Char(translate=False)
|
||||||
|
|
||||||
|
|
||||||
|
class ProductAttributeValue(models.Model):
|
||||||
|
_inherit = "product.attribute.value"
|
||||||
|
|
||||||
|
name = fields.Char(translate=False)
|
||||||
|
|
||||||
|
|
||||||
|
class UomCategory(models.Model):
|
||||||
|
_inherit = 'uom.category'
|
||||||
|
|
||||||
|
name = fields.Char(translate=False)
|
||||||
|
|
||||||
|
|
||||||
|
class UomUom(models.Model):
|
||||||
|
_inherit = 'uom.uom'
|
||||||
|
|
||||||
|
name = fields.Char(translate=False)
|
||||||
BIN
product_no_translation/static/description/icon.png
Normal file
BIN
product_no_translation/static/description/icon.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 9.0 KiB |
@@ -4,7 +4,6 @@
|
|||||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||||
|
|
||||||
from odoo import models, fields
|
from odoo import models, fields
|
||||||
from odoo.tools.safe_eval import safe_eval
|
|
||||||
|
|
||||||
|
|
||||||
class ProductProduct(models.Model):
|
class ProductProduct(models.Model):
|
||||||
@@ -43,6 +42,5 @@ class ProductProduct(models.Model):
|
|||||||
self.ensure_one()
|
self.ensure_one()
|
||||||
action = self.env.ref(
|
action = self.env.ref(
|
||||||
'product_usability.product_price_history_action').read()[0]
|
'product_usability.product_price_history_action').read()[0]
|
||||||
action['domain'] = safe_eval(action['domain'])
|
action['domain'] = [('product_id', '=', self.id)]
|
||||||
action['domain'].append(('product_id', '=', self.id))
|
|
||||||
return action
|
return action
|
||||||
|
|||||||
BIN
product_usability/static/description/icon.png
Normal file
BIN
product_usability/static/description/icon.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 9.5 KiB |
419
product_usability/static/description/index.html
Normal file
419
product_usability/static/description/index.html
Normal file
@@ -0,0 +1,419 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8" ?>
|
||||||
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||||
|
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||||
|
<meta name="generator" content="Docutils 0.14: http://docutils.sourceforge.net/" />
|
||||||
|
<title>MRP Usability</title>
|
||||||
|
<style type="text/css">
|
||||||
|
|
||||||
|
/*
|
||||||
|
:Author: David Goodger (goodger@python.org)
|
||||||
|
:Id: $Id: html4css1.css 7952 2016-07-26 18:15:59Z milde $
|
||||||
|
:Copyright: This stylesheet has been placed in the public domain.
|
||||||
|
|
||||||
|
Default cascading style sheet for the HTML output of Docutils.
|
||||||
|
|
||||||
|
See http://docutils.sf.net/docs/howto/html-stylesheets.html for how to
|
||||||
|
customize this style sheet.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* used to remove borders from tables and images */
|
||||||
|
.borderless, table.borderless td, table.borderless th {
|
||||||
|
border: 0 }
|
||||||
|
|
||||||
|
table.borderless td, table.borderless th {
|
||||||
|
/* Override padding for "table.docutils td" with "! important".
|
||||||
|
The right padding separates the table cells. */
|
||||||
|
padding: 0 0.5em 0 0 ! important }
|
||||||
|
|
||||||
|
.first {
|
||||||
|
/* Override more specific margin styles with "! important". */
|
||||||
|
margin-top: 0 ! important }
|
||||||
|
|
||||||
|
.last, .with-subtitle {
|
||||||
|
margin-bottom: 0 ! important }
|
||||||
|
|
||||||
|
.hidden {
|
||||||
|
display: none }
|
||||||
|
|
||||||
|
.subscript {
|
||||||
|
vertical-align: sub;
|
||||||
|
font-size: smaller }
|
||||||
|
|
||||||
|
.superscript {
|
||||||
|
vertical-align: super;
|
||||||
|
font-size: smaller }
|
||||||
|
|
||||||
|
a.toc-backref {
|
||||||
|
text-decoration: none ;
|
||||||
|
color: black }
|
||||||
|
|
||||||
|
blockquote.epigraph {
|
||||||
|
margin: 2em 5em ; }
|
||||||
|
|
||||||
|
dl.docutils dd {
|
||||||
|
margin-bottom: 0.5em }
|
||||||
|
|
||||||
|
object[type="image/svg+xml"], object[type="application/x-shockwave-flash"] {
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Uncomment (and remove this text!) to get bold-faced definition list terms
|
||||||
|
dl.docutils dt {
|
||||||
|
font-weight: bold }
|
||||||
|
*/
|
||||||
|
|
||||||
|
div.abstract {
|
||||||
|
margin: 2em 5em }
|
||||||
|
|
||||||
|
div.abstract p.topic-title {
|
||||||
|
font-weight: bold ;
|
||||||
|
text-align: center }
|
||||||
|
|
||||||
|
div.admonition, div.attention, div.caution, div.danger, div.error,
|
||||||
|
div.hint, div.important, div.note, div.tip, div.warning {
|
||||||
|
margin: 2em ;
|
||||||
|
border: medium outset ;
|
||||||
|
padding: 1em }
|
||||||
|
|
||||||
|
div.admonition p.admonition-title, div.hint p.admonition-title,
|
||||||
|
div.important p.admonition-title, div.note p.admonition-title,
|
||||||
|
div.tip p.admonition-title {
|
||||||
|
font-weight: bold ;
|
||||||
|
font-family: sans-serif }
|
||||||
|
|
||||||
|
div.attention p.admonition-title, div.caution p.admonition-title,
|
||||||
|
div.danger p.admonition-title, div.error p.admonition-title,
|
||||||
|
div.warning p.admonition-title, .code .error {
|
||||||
|
color: red ;
|
||||||
|
font-weight: bold ;
|
||||||
|
font-family: sans-serif }
|
||||||
|
|
||||||
|
/* Uncomment (and remove this text!) to get reduced vertical space in
|
||||||
|
compound paragraphs.
|
||||||
|
div.compound .compound-first, div.compound .compound-middle {
|
||||||
|
margin-bottom: 0.5em }
|
||||||
|
|
||||||
|
div.compound .compound-last, div.compound .compound-middle {
|
||||||
|
margin-top: 0.5em }
|
||||||
|
*/
|
||||||
|
|
||||||
|
div.dedication {
|
||||||
|
margin: 2em 5em ;
|
||||||
|
text-align: center ;
|
||||||
|
font-style: italic }
|
||||||
|
|
||||||
|
div.dedication p.topic-title {
|
||||||
|
font-weight: bold ;
|
||||||
|
font-style: normal }
|
||||||
|
|
||||||
|
div.figure {
|
||||||
|
margin-left: 2em ;
|
||||||
|
margin-right: 2em }
|
||||||
|
|
||||||
|
div.footer, div.header {
|
||||||
|
clear: both;
|
||||||
|
font-size: smaller }
|
||||||
|
|
||||||
|
div.line-block {
|
||||||
|
display: block ;
|
||||||
|
margin-top: 1em ;
|
||||||
|
margin-bottom: 1em }
|
||||||
|
|
||||||
|
div.line-block div.line-block {
|
||||||
|
margin-top: 0 ;
|
||||||
|
margin-bottom: 0 ;
|
||||||
|
margin-left: 1.5em }
|
||||||
|
|
||||||
|
div.sidebar {
|
||||||
|
margin: 0 0 0.5em 1em ;
|
||||||
|
border: medium outset ;
|
||||||
|
padding: 1em ;
|
||||||
|
background-color: #ffffee ;
|
||||||
|
width: 40% ;
|
||||||
|
float: right ;
|
||||||
|
clear: right }
|
||||||
|
|
||||||
|
div.sidebar p.rubric {
|
||||||
|
font-family: sans-serif ;
|
||||||
|
font-size: medium }
|
||||||
|
|
||||||
|
div.system-messages {
|
||||||
|
margin: 5em }
|
||||||
|
|
||||||
|
div.system-messages h1 {
|
||||||
|
color: red }
|
||||||
|
|
||||||
|
div.system-message {
|
||||||
|
border: medium outset ;
|
||||||
|
padding: 1em }
|
||||||
|
|
||||||
|
div.system-message p.system-message-title {
|
||||||
|
color: red ;
|
||||||
|
font-weight: bold }
|
||||||
|
|
||||||
|
div.topic {
|
||||||
|
margin: 2em }
|
||||||
|
|
||||||
|
h1.section-subtitle, h2.section-subtitle, h3.section-subtitle,
|
||||||
|
h4.section-subtitle, h5.section-subtitle, h6.section-subtitle {
|
||||||
|
margin-top: 0.4em }
|
||||||
|
|
||||||
|
h1.title {
|
||||||
|
text-align: center }
|
||||||
|
|
||||||
|
h2.subtitle {
|
||||||
|
text-align: center }
|
||||||
|
|
||||||
|
hr.docutils {
|
||||||
|
width: 75% }
|
||||||
|
|
||||||
|
img.align-left, .figure.align-left, object.align-left, table.align-left {
|
||||||
|
clear: left ;
|
||||||
|
float: left ;
|
||||||
|
margin-right: 1em }
|
||||||
|
|
||||||
|
img.align-right, .figure.align-right, object.align-right, table.align-right {
|
||||||
|
clear: right ;
|
||||||
|
float: right ;
|
||||||
|
margin-left: 1em }
|
||||||
|
|
||||||
|
img.align-center, .figure.align-center, object.align-center {
|
||||||
|
display: block;
|
||||||
|
margin-left: auto;
|
||||||
|
margin-right: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.align-center {
|
||||||
|
margin-left: auto;
|
||||||
|
margin-right: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.align-left {
|
||||||
|
text-align: left }
|
||||||
|
|
||||||
|
.align-center {
|
||||||
|
clear: both ;
|
||||||
|
text-align: center }
|
||||||
|
|
||||||
|
.align-right {
|
||||||
|
text-align: right }
|
||||||
|
|
||||||
|
/* reset inner alignment in figures */
|
||||||
|
div.align-right {
|
||||||
|
text-align: inherit }
|
||||||
|
|
||||||
|
/* div.align-center * { */
|
||||||
|
/* text-align: left } */
|
||||||
|
|
||||||
|
.align-top {
|
||||||
|
vertical-align: top }
|
||||||
|
|
||||||
|
.align-middle {
|
||||||
|
vertical-align: middle }
|
||||||
|
|
||||||
|
.align-bottom {
|
||||||
|
vertical-align: bottom }
|
||||||
|
|
||||||
|
ol.simple, ul.simple {
|
||||||
|
margin-bottom: 1em }
|
||||||
|
|
||||||
|
ol.arabic {
|
||||||
|
list-style: decimal }
|
||||||
|
|
||||||
|
ol.loweralpha {
|
||||||
|
list-style: lower-alpha }
|
||||||
|
|
||||||
|
ol.upperalpha {
|
||||||
|
list-style: upper-alpha }
|
||||||
|
|
||||||
|
ol.lowerroman {
|
||||||
|
list-style: lower-roman }
|
||||||
|
|
||||||
|
ol.upperroman {
|
||||||
|
list-style: upper-roman }
|
||||||
|
|
||||||
|
p.attribution {
|
||||||
|
text-align: right ;
|
||||||
|
margin-left: 50% }
|
||||||
|
|
||||||
|
p.caption {
|
||||||
|
font-style: italic }
|
||||||
|
|
||||||
|
p.credits {
|
||||||
|
font-style: italic ;
|
||||||
|
font-size: smaller }
|
||||||
|
|
||||||
|
p.label {
|
||||||
|
white-space: nowrap }
|
||||||
|
|
||||||
|
p.rubric {
|
||||||
|
font-weight: bold ;
|
||||||
|
font-size: larger ;
|
||||||
|
color: maroon ;
|
||||||
|
text-align: center }
|
||||||
|
|
||||||
|
p.sidebar-title {
|
||||||
|
font-family: sans-serif ;
|
||||||
|
font-weight: bold ;
|
||||||
|
font-size: larger }
|
||||||
|
|
||||||
|
p.sidebar-subtitle {
|
||||||
|
font-family: sans-serif ;
|
||||||
|
font-weight: bold }
|
||||||
|
|
||||||
|
p.topic-title {
|
||||||
|
font-weight: bold }
|
||||||
|
|
||||||
|
pre.address {
|
||||||
|
margin-bottom: 0 ;
|
||||||
|
margin-top: 0 ;
|
||||||
|
font: inherit }
|
||||||
|
|
||||||
|
pre.literal-block, pre.doctest-block, pre.math, pre.code {
|
||||||
|
margin-left: 2em ;
|
||||||
|
margin-right: 2em }
|
||||||
|
|
||||||
|
pre.code .ln { color: grey; } /* line numbers */
|
||||||
|
pre.code, code { background-color: #eeeeee }
|
||||||
|
pre.code .comment, code .comment { color: #5C6576 }
|
||||||
|
pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold }
|
||||||
|
pre.code .literal.string, code .literal.string { color: #0C5404 }
|
||||||
|
pre.code .name.builtin, code .name.builtin { color: #352B84 }
|
||||||
|
pre.code .deleted, code .deleted { background-color: #DEB0A1}
|
||||||
|
pre.code .inserted, code .inserted { background-color: #A3D289}
|
||||||
|
|
||||||
|
span.classifier {
|
||||||
|
font-family: sans-serif ;
|
||||||
|
font-style: oblique }
|
||||||
|
|
||||||
|
span.classifier-delimiter {
|
||||||
|
font-family: sans-serif ;
|
||||||
|
font-weight: bold }
|
||||||
|
|
||||||
|
span.interpreted {
|
||||||
|
font-family: sans-serif }
|
||||||
|
|
||||||
|
span.option {
|
||||||
|
white-space: nowrap }
|
||||||
|
|
||||||
|
span.pre {
|
||||||
|
white-space: pre }
|
||||||
|
|
||||||
|
span.problematic {
|
||||||
|
color: red }
|
||||||
|
|
||||||
|
span.section-subtitle {
|
||||||
|
/* font-size relative to parent (h1..h6 element) */
|
||||||
|
font-size: 80% }
|
||||||
|
|
||||||
|
table.citation {
|
||||||
|
border-left: solid 1px gray;
|
||||||
|
margin-left: 1px }
|
||||||
|
|
||||||
|
table.docinfo {
|
||||||
|
margin: 2em 4em }
|
||||||
|
|
||||||
|
table.docutils {
|
||||||
|
margin-top: 0.5em ;
|
||||||
|
margin-bottom: 0.5em }
|
||||||
|
|
||||||
|
table.footnote {
|
||||||
|
border-left: solid 1px black;
|
||||||
|
margin-left: 1px }
|
||||||
|
|
||||||
|
table.docutils td, table.docutils th,
|
||||||
|
table.docinfo td, table.docinfo th {
|
||||||
|
padding-left: 0.5em ;
|
||||||
|
padding-right: 0.5em ;
|
||||||
|
vertical-align: top }
|
||||||
|
|
||||||
|
table.docutils th.field-name, table.docinfo th.docinfo-name {
|
||||||
|
font-weight: bold ;
|
||||||
|
text-align: left ;
|
||||||
|
white-space: nowrap ;
|
||||||
|
padding-left: 0 }
|
||||||
|
|
||||||
|
/* "booktabs" style (no vertical lines) */
|
||||||
|
table.docutils.booktabs {
|
||||||
|
border: 0px;
|
||||||
|
border-top: 2px solid;
|
||||||
|
border-bottom: 2px solid;
|
||||||
|
border-collapse: collapse;
|
||||||
|
}
|
||||||
|
table.docutils.booktabs * {
|
||||||
|
border: 0px;
|
||||||
|
}
|
||||||
|
table.docutils.booktabs th {
|
||||||
|
border-bottom: thin solid;
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
h1 tt.docutils, h2 tt.docutils, h3 tt.docutils,
|
||||||
|
h4 tt.docutils, h5 tt.docutils, h6 tt.docutils {
|
||||||
|
font-size: 100% }
|
||||||
|
|
||||||
|
ul.auto-toc {
|
||||||
|
list-style-type: none }
|
||||||
|
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="document" id="mrp-usability">
|
||||||
|
<h1 class="title">MRP Usability</h1>
|
||||||
|
|
||||||
|
<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||||
|
!! This file is generated by oca-gen-addon-readme !!
|
||||||
|
!! changes will be overwritten. !!
|
||||||
|
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
|
||||||
|
<p><a class="reference external" href="https://odoo-community.org/page/development-status"><img alt="Beta" src="https://img.shields.io/badge/maturity-Beta-yellow.png" /></a> <a class="reference external" href="http://www.gnu.org/licenses/agpl-3.0-standalone.html"><img alt="License: AGPL-3" src="https://img.shields.io/badge/licence-AGPL--3-blue.png" /></a> <a class="reference external" href="https://github.com/akretion/odoo-usability/tree/12.0/mrp_usability"><img alt="akretion/odoo-usability" src="https://img.shields.io/badge/github-akretion%2Fodoo--usability-lightgray.png?logo=github" /></a></p>
|
||||||
|
<p>Small usability improvements on MRP:</p>
|
||||||
|
<ul class="simple">
|
||||||
|
<li>order by id desc</li>
|
||||||
|
<li>show field date_start and date_finished on mrp.production form view</li>
|
||||||
|
<li>show more fields on stock move form</li>
|
||||||
|
<li>show bom type in tree view + add group by</li>
|
||||||
|
<li>complete Manufacturing Order report with unvailable products</li>
|
||||||
|
</ul>
|
||||||
|
<p><strong>Table of contents</strong></p>
|
||||||
|
<div class="contents local topic" id="contents">
|
||||||
|
<ul class="simple">
|
||||||
|
<li><a class="reference internal" href="#bug-tracker" id="id1">Bug Tracker</a></li>
|
||||||
|
<li><a class="reference internal" href="#credits" id="id2">Credits</a><ul>
|
||||||
|
<li><a class="reference internal" href="#authors" id="id3">Authors</a></li>
|
||||||
|
<li><a class="reference internal" href="#contributors" id="id4">Contributors</a></li>
|
||||||
|
<li><a class="reference internal" href="#maintainers" id="id5">Maintainers</a></li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div class="section" id="bug-tracker">
|
||||||
|
<h1><a class="toc-backref" href="#id1">Bug Tracker</a></h1>
|
||||||
|
<p>Bugs are tracked on <a class="reference external" href="https://github.com/akretion/odoo-usability/issues">GitHub Issues</a>.
|
||||||
|
In case of trouble, please check there if your issue has already been reported.
|
||||||
|
If you spotted it first, help us smashing it by providing a detailed and welcomed
|
||||||
|
<a class="reference external" href="https://github.com/akretion/odoo-usability/issues/new?body=module:%20mrp_usability%0Aversion:%2012.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**">feedback</a>.</p>
|
||||||
|
<p>Do not contact contributors directly about support or help with technical issues.</p>
|
||||||
|
</div>
|
||||||
|
<div class="section" id="credits">
|
||||||
|
<h1><a class="toc-backref" href="#id2">Credits</a></h1>
|
||||||
|
<div class="section" id="authors">
|
||||||
|
<h2><a class="toc-backref" href="#id3">Authors</a></h2>
|
||||||
|
<ul class="simple">
|
||||||
|
<li>Akretion</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div class="section" id="contributors">
|
||||||
|
<h2><a class="toc-backref" href="#id4">Contributors</a></h2>
|
||||||
|
<p>Alexis de Lattre <<a class="reference external" href="mailto:alexis.delattre@akretion.com">alexis.delattre@akretion.com</a>></p>
|
||||||
|
</div>
|
||||||
|
<div class="section" id="maintainers">
|
||||||
|
<h2><a class="toc-backref" href="#id5">Maintainers</a></h2>
|
||||||
|
<p>This module is part of the <a class="reference external" href="https://github.com/akretion/odoo-usability/tree/12.0/mrp_usability">akretion/odoo-usability</a> project on GitHub.</p>
|
||||||
|
<p>You are welcome to contribute.</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
@@ -16,8 +16,8 @@
|
|||||||
<field name="product_name"/>
|
<field name="product_name"/>
|
||||||
<field name="product_code" string="Supplier Code"/>
|
<field name="product_code" string="Supplier Code"/>
|
||||||
</field>
|
</field>
|
||||||
<field name="price" position="after">
|
<field name="currency_id" position="after">
|
||||||
<field name="currency_id" groups="base.group_multi_currency"/>
|
<field name="delay"/>
|
||||||
</field>
|
</field>
|
||||||
<field name="min_qty" position="after">
|
<field name="min_qty" position="after">
|
||||||
<field name="product_uom" groups="uom.group_uom"/>
|
<field name="product_uom" groups="uom.group_uom"/>
|
||||||
|
|||||||
63
purchase_usability/README.rst
Normal file
63
purchase_usability/README.rst
Normal file
@@ -0,0 +1,63 @@
|
|||||||
|
==================
|
||||||
|
Purchase Usability
|
||||||
|
==================
|
||||||
|
|
||||||
|
.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||||
|
!! This file is generated by oca-gen-addon-readme !!
|
||||||
|
!! changes will be overwritten. !!
|
||||||
|
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||||
|
|
||||||
|
.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png
|
||||||
|
:target: https://odoo-community.org/page/development-status
|
||||||
|
:alt: Beta
|
||||||
|
.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png
|
||||||
|
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
|
||||||
|
:alt: License: AGPL-3
|
||||||
|
.. |badge3| image:: https://img.shields.io/badge/github-akretion%2Fodoo--usability-lightgray.png?logo=github
|
||||||
|
:target: https://github.com/akretion/odoo-usability/tree/12.0/purchase_usability
|
||||||
|
:alt: akretion/odoo-usability
|
||||||
|
|
||||||
|
|badge1| |badge2| |badge3|
|
||||||
|
|
||||||
|
This module adds the following functions:
|
||||||
|
- Track visibility on partner and product purchase warning
|
||||||
|
- Track visibility on Purchase Order warning
|
||||||
|
- Methods to help generate py3o purchase reports
|
||||||
|
- Use untaxed amount in name_get of purchase orders
|
||||||
|
- Protect Cancel button with a confirmation pop-up
|
||||||
|
- Misc. improvements to Purchase Order Line views
|
||||||
|
|
||||||
|
**Table of contents**
|
||||||
|
|
||||||
|
.. contents::
|
||||||
|
:local:
|
||||||
|
|
||||||
|
Bug Tracker
|
||||||
|
===========
|
||||||
|
|
||||||
|
Bugs are tracked on `GitHub Issues <https://github.com/akretion/odoo-usability/issues>`_.
|
||||||
|
In case of trouble, please check there if your issue has already been reported.
|
||||||
|
If you spotted it first, help us smashing it by providing a detailed and welcomed
|
||||||
|
`feedback <https://github.com/akretion/odoo-usability/issues/new?body=module:%20purchase_usability%0Aversion:%2012.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.
|
||||||
|
|
||||||
|
Do not contact contributors directly about support or help with technical issues.
|
||||||
|
|
||||||
|
Credits
|
||||||
|
=======
|
||||||
|
|
||||||
|
Authors
|
||||||
|
~~~~~~~
|
||||||
|
|
||||||
|
* Akretion
|
||||||
|
|
||||||
|
Contributors
|
||||||
|
~~~~~~~~~~~~
|
||||||
|
|
||||||
|
* Alexis de Lattre <alexis.delattre@akretion.com>
|
||||||
|
|
||||||
|
Maintainers
|
||||||
|
~~~~~~~~~~~
|
||||||
|
|
||||||
|
This module is part of the `akretion/odoo-usability <https://github.com/akretion/odoo-usability/tree/12.0/purchase_usability>`_ project on GitHub.
|
||||||
|
|
||||||
|
You are welcome to contribute.
|
||||||
@@ -8,14 +8,6 @@
|
|||||||
'category': 'Purchases',
|
'category': 'Purchases',
|
||||||
'license': 'AGPL-3',
|
'license': 'AGPL-3',
|
||||||
'summary': 'Usability improvements on purchase module',
|
'summary': 'Usability improvements on purchase module',
|
||||||
'description': """
|
|
||||||
Purchase Usability
|
|
||||||
==================
|
|
||||||
|
|
||||||
Several usability improvements on the official purchase module:
|
|
||||||
|
|
||||||
Please contact Alexis de Lattre from Akretion <alexis.delattre@akretion.com> for any help or question about this module.
|
|
||||||
""",
|
|
||||||
'author': 'Akretion',
|
'author': 'Akretion',
|
||||||
'website': 'http://www.akretion.com',
|
'website': 'http://www.akretion.com',
|
||||||
'depends': ['purchase'],
|
'depends': ['purchase'],
|
||||||
|
|||||||
1
purchase_usability/readme/CONTRIBUTORS.rst
Normal file
1
purchase_usability/readme/CONTRIBUTORS.rst
Normal file
@@ -0,0 +1 @@
|
|||||||
|
* Alexis de Lattre <alexis.delattre@akretion.com>
|
||||||
7
purchase_usability/readme/DESCRIPTION.rst
Normal file
7
purchase_usability/readme/DESCRIPTION.rst
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
This module adds the following functions:
|
||||||
|
- Track visibility on partner and product purchase warning
|
||||||
|
- Track visibility on Purchase Order warning
|
||||||
|
- Methods to help generate py3o purchase reports
|
||||||
|
- Use untaxed amount in name_get of purchase orders
|
||||||
|
- Protect Cancel button with a confirmation pop-up
|
||||||
|
- Misc. improvements to Purchase Order Line views
|
||||||
BIN
purchase_usability/static/description/icon.png
Normal file
BIN
purchase_usability/static/description/icon.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 9.5 KiB |
425
purchase_usability/static/description/index.html
Normal file
425
purchase_usability/static/description/index.html
Normal file
@@ -0,0 +1,425 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8" ?>
|
||||||
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||||
|
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||||
|
<meta name="generator" content="Docutils 0.15.1: http://docutils.sourceforge.net/" />
|
||||||
|
<title>Purchase Usability</title>
|
||||||
|
<style type="text/css">
|
||||||
|
|
||||||
|
/*
|
||||||
|
:Author: David Goodger (goodger@python.org)
|
||||||
|
:Id: $Id: html4css1.css 7952 2016-07-26 18:15:59Z milde $
|
||||||
|
:Copyright: This stylesheet has been placed in the public domain.
|
||||||
|
|
||||||
|
Default cascading style sheet for the HTML output of Docutils.
|
||||||
|
|
||||||
|
See http://docutils.sf.net/docs/howto/html-stylesheets.html for how to
|
||||||
|
customize this style sheet.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* used to remove borders from tables and images */
|
||||||
|
.borderless, table.borderless td, table.borderless th {
|
||||||
|
border: 0 }
|
||||||
|
|
||||||
|
table.borderless td, table.borderless th {
|
||||||
|
/* Override padding for "table.docutils td" with "! important".
|
||||||
|
The right padding separates the table cells. */
|
||||||
|
padding: 0 0.5em 0 0 ! important }
|
||||||
|
|
||||||
|
.first {
|
||||||
|
/* Override more specific margin styles with "! important". */
|
||||||
|
margin-top: 0 ! important }
|
||||||
|
|
||||||
|
.last, .with-subtitle {
|
||||||
|
margin-bottom: 0 ! important }
|
||||||
|
|
||||||
|
.hidden {
|
||||||
|
display: none }
|
||||||
|
|
||||||
|
.subscript {
|
||||||
|
vertical-align: sub;
|
||||||
|
font-size: smaller }
|
||||||
|
|
||||||
|
.superscript {
|
||||||
|
vertical-align: super;
|
||||||
|
font-size: smaller }
|
||||||
|
|
||||||
|
a.toc-backref {
|
||||||
|
text-decoration: none ;
|
||||||
|
color: black }
|
||||||
|
|
||||||
|
blockquote.epigraph {
|
||||||
|
margin: 2em 5em ; }
|
||||||
|
|
||||||
|
dl.docutils dd {
|
||||||
|
margin-bottom: 0.5em }
|
||||||
|
|
||||||
|
object[type="image/svg+xml"], object[type="application/x-shockwave-flash"] {
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Uncomment (and remove this text!) to get bold-faced definition list terms
|
||||||
|
dl.docutils dt {
|
||||||
|
font-weight: bold }
|
||||||
|
*/
|
||||||
|
|
||||||
|
div.abstract {
|
||||||
|
margin: 2em 5em }
|
||||||
|
|
||||||
|
div.abstract p.topic-title {
|
||||||
|
font-weight: bold ;
|
||||||
|
text-align: center }
|
||||||
|
|
||||||
|
div.admonition, div.attention, div.caution, div.danger, div.error,
|
||||||
|
div.hint, div.important, div.note, div.tip, div.warning {
|
||||||
|
margin: 2em ;
|
||||||
|
border: medium outset ;
|
||||||
|
padding: 1em }
|
||||||
|
|
||||||
|
div.admonition p.admonition-title, div.hint p.admonition-title,
|
||||||
|
div.important p.admonition-title, div.note p.admonition-title,
|
||||||
|
div.tip p.admonition-title {
|
||||||
|
font-weight: bold ;
|
||||||
|
font-family: sans-serif }
|
||||||
|
|
||||||
|
div.attention p.admonition-title, div.caution p.admonition-title,
|
||||||
|
div.danger p.admonition-title, div.error p.admonition-title,
|
||||||
|
div.warning p.admonition-title, .code .error {
|
||||||
|
color: red ;
|
||||||
|
font-weight: bold ;
|
||||||
|
font-family: sans-serif }
|
||||||
|
|
||||||
|
/* Uncomment (and remove this text!) to get reduced vertical space in
|
||||||
|
compound paragraphs.
|
||||||
|
div.compound .compound-first, div.compound .compound-middle {
|
||||||
|
margin-bottom: 0.5em }
|
||||||
|
|
||||||
|
div.compound .compound-last, div.compound .compound-middle {
|
||||||
|
margin-top: 0.5em }
|
||||||
|
*/
|
||||||
|
|
||||||
|
div.dedication {
|
||||||
|
margin: 2em 5em ;
|
||||||
|
text-align: center ;
|
||||||
|
font-style: italic }
|
||||||
|
|
||||||
|
div.dedication p.topic-title {
|
||||||
|
font-weight: bold ;
|
||||||
|
font-style: normal }
|
||||||
|
|
||||||
|
div.figure {
|
||||||
|
margin-left: 2em ;
|
||||||
|
margin-right: 2em }
|
||||||
|
|
||||||
|
div.footer, div.header {
|
||||||
|
clear: both;
|
||||||
|
font-size: smaller }
|
||||||
|
|
||||||
|
div.line-block {
|
||||||
|
display: block ;
|
||||||
|
margin-top: 1em ;
|
||||||
|
margin-bottom: 1em }
|
||||||
|
|
||||||
|
div.line-block div.line-block {
|
||||||
|
margin-top: 0 ;
|
||||||
|
margin-bottom: 0 ;
|
||||||
|
margin-left: 1.5em }
|
||||||
|
|
||||||
|
div.sidebar {
|
||||||
|
margin: 0 0 0.5em 1em ;
|
||||||
|
border: medium outset ;
|
||||||
|
padding: 1em ;
|
||||||
|
background-color: #ffffee ;
|
||||||
|
width: 40% ;
|
||||||
|
float: right ;
|
||||||
|
clear: right }
|
||||||
|
|
||||||
|
div.sidebar p.rubric {
|
||||||
|
font-family: sans-serif ;
|
||||||
|
font-size: medium }
|
||||||
|
|
||||||
|
div.system-messages {
|
||||||
|
margin: 5em }
|
||||||
|
|
||||||
|
div.system-messages h1 {
|
||||||
|
color: red }
|
||||||
|
|
||||||
|
div.system-message {
|
||||||
|
border: medium outset ;
|
||||||
|
padding: 1em }
|
||||||
|
|
||||||
|
div.system-message p.system-message-title {
|
||||||
|
color: red ;
|
||||||
|
font-weight: bold }
|
||||||
|
|
||||||
|
div.topic {
|
||||||
|
margin: 2em }
|
||||||
|
|
||||||
|
h1.section-subtitle, h2.section-subtitle, h3.section-subtitle,
|
||||||
|
h4.section-subtitle, h5.section-subtitle, h6.section-subtitle {
|
||||||
|
margin-top: 0.4em }
|
||||||
|
|
||||||
|
h1.title {
|
||||||
|
text-align: center }
|
||||||
|
|
||||||
|
h2.subtitle {
|
||||||
|
text-align: center }
|
||||||
|
|
||||||
|
hr.docutils {
|
||||||
|
width: 75% }
|
||||||
|
|
||||||
|
img.align-left, .figure.align-left, object.align-left, table.align-left {
|
||||||
|
clear: left ;
|
||||||
|
float: left ;
|
||||||
|
margin-right: 1em }
|
||||||
|
|
||||||
|
img.align-right, .figure.align-right, object.align-right, table.align-right {
|
||||||
|
clear: right ;
|
||||||
|
float: right ;
|
||||||
|
margin-left: 1em }
|
||||||
|
|
||||||
|
img.align-center, .figure.align-center, object.align-center {
|
||||||
|
display: block;
|
||||||
|
margin-left: auto;
|
||||||
|
margin-right: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.align-center {
|
||||||
|
margin-left: auto;
|
||||||
|
margin-right: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.align-left {
|
||||||
|
text-align: left }
|
||||||
|
|
||||||
|
.align-center {
|
||||||
|
clear: both ;
|
||||||
|
text-align: center }
|
||||||
|
|
||||||
|
.align-right {
|
||||||
|
text-align: right }
|
||||||
|
|
||||||
|
/* reset inner alignment in figures */
|
||||||
|
div.align-right {
|
||||||
|
text-align: inherit }
|
||||||
|
|
||||||
|
/* div.align-center * { */
|
||||||
|
/* text-align: left } */
|
||||||
|
|
||||||
|
.align-top {
|
||||||
|
vertical-align: top }
|
||||||
|
|
||||||
|
.align-middle {
|
||||||
|
vertical-align: middle }
|
||||||
|
|
||||||
|
.align-bottom {
|
||||||
|
vertical-align: bottom }
|
||||||
|
|
||||||
|
ol.simple, ul.simple {
|
||||||
|
margin-bottom: 1em }
|
||||||
|
|
||||||
|
ol.arabic {
|
||||||
|
list-style: decimal }
|
||||||
|
|
||||||
|
ol.loweralpha {
|
||||||
|
list-style: lower-alpha }
|
||||||
|
|
||||||
|
ol.upperalpha {
|
||||||
|
list-style: upper-alpha }
|
||||||
|
|
||||||
|
ol.lowerroman {
|
||||||
|
list-style: lower-roman }
|
||||||
|
|
||||||
|
ol.upperroman {
|
||||||
|
list-style: upper-roman }
|
||||||
|
|
||||||
|
p.attribution {
|
||||||
|
text-align: right ;
|
||||||
|
margin-left: 50% }
|
||||||
|
|
||||||
|
p.caption {
|
||||||
|
font-style: italic }
|
||||||
|
|
||||||
|
p.credits {
|
||||||
|
font-style: italic ;
|
||||||
|
font-size: smaller }
|
||||||
|
|
||||||
|
p.label {
|
||||||
|
white-space: nowrap }
|
||||||
|
|
||||||
|
p.rubric {
|
||||||
|
font-weight: bold ;
|
||||||
|
font-size: larger ;
|
||||||
|
color: maroon ;
|
||||||
|
text-align: center }
|
||||||
|
|
||||||
|
p.sidebar-title {
|
||||||
|
font-family: sans-serif ;
|
||||||
|
font-weight: bold ;
|
||||||
|
font-size: larger }
|
||||||
|
|
||||||
|
p.sidebar-subtitle {
|
||||||
|
font-family: sans-serif ;
|
||||||
|
font-weight: bold }
|
||||||
|
|
||||||
|
p.topic-title {
|
||||||
|
font-weight: bold }
|
||||||
|
|
||||||
|
pre.address {
|
||||||
|
margin-bottom: 0 ;
|
||||||
|
margin-top: 0 ;
|
||||||
|
font: inherit }
|
||||||
|
|
||||||
|
pre.literal-block, pre.doctest-block, pre.math, pre.code {
|
||||||
|
margin-left: 2em ;
|
||||||
|
margin-right: 2em }
|
||||||
|
|
||||||
|
pre.code .ln { color: grey; } /* line numbers */
|
||||||
|
pre.code, code { background-color: #eeeeee }
|
||||||
|
pre.code .comment, code .comment { color: #5C6576 }
|
||||||
|
pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold }
|
||||||
|
pre.code .literal.string, code .literal.string { color: #0C5404 }
|
||||||
|
pre.code .name.builtin, code .name.builtin { color: #352B84 }
|
||||||
|
pre.code .deleted, code .deleted { background-color: #DEB0A1}
|
||||||
|
pre.code .inserted, code .inserted { background-color: #A3D289}
|
||||||
|
|
||||||
|
span.classifier {
|
||||||
|
font-family: sans-serif ;
|
||||||
|
font-style: oblique }
|
||||||
|
|
||||||
|
span.classifier-delimiter {
|
||||||
|
font-family: sans-serif ;
|
||||||
|
font-weight: bold }
|
||||||
|
|
||||||
|
span.interpreted {
|
||||||
|
font-family: sans-serif }
|
||||||
|
|
||||||
|
span.option {
|
||||||
|
white-space: nowrap }
|
||||||
|
|
||||||
|
span.pre {
|
||||||
|
white-space: pre }
|
||||||
|
|
||||||
|
span.problematic {
|
||||||
|
color: red }
|
||||||
|
|
||||||
|
span.section-subtitle {
|
||||||
|
/* font-size relative to parent (h1..h6 element) */
|
||||||
|
font-size: 80% }
|
||||||
|
|
||||||
|
table.citation {
|
||||||
|
border-left: solid 1px gray;
|
||||||
|
margin-left: 1px }
|
||||||
|
|
||||||
|
table.docinfo {
|
||||||
|
margin: 2em 4em }
|
||||||
|
|
||||||
|
table.docutils {
|
||||||
|
margin-top: 0.5em ;
|
||||||
|
margin-bottom: 0.5em }
|
||||||
|
|
||||||
|
table.footnote {
|
||||||
|
border-left: solid 1px black;
|
||||||
|
margin-left: 1px }
|
||||||
|
|
||||||
|
table.docutils td, table.docutils th,
|
||||||
|
table.docinfo td, table.docinfo th {
|
||||||
|
padding-left: 0.5em ;
|
||||||
|
padding-right: 0.5em ;
|
||||||
|
vertical-align: top }
|
||||||
|
|
||||||
|
table.docutils th.field-name, table.docinfo th.docinfo-name {
|
||||||
|
font-weight: bold ;
|
||||||
|
text-align: left ;
|
||||||
|
white-space: nowrap ;
|
||||||
|
padding-left: 0 }
|
||||||
|
|
||||||
|
/* "booktabs" style (no vertical lines) */
|
||||||
|
table.docutils.booktabs {
|
||||||
|
border: 0px;
|
||||||
|
border-top: 2px solid;
|
||||||
|
border-bottom: 2px solid;
|
||||||
|
border-collapse: collapse;
|
||||||
|
}
|
||||||
|
table.docutils.booktabs * {
|
||||||
|
border: 0px;
|
||||||
|
}
|
||||||
|
table.docutils.booktabs th {
|
||||||
|
border-bottom: thin solid;
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
h1 tt.docutils, h2 tt.docutils, h3 tt.docutils,
|
||||||
|
h4 tt.docutils, h5 tt.docutils, h6 tt.docutils {
|
||||||
|
font-size: 100% }
|
||||||
|
|
||||||
|
ul.auto-toc {
|
||||||
|
list-style-type: none }
|
||||||
|
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="document" id="purchase-usability">
|
||||||
|
<h1 class="title">Purchase Usability</h1>
|
||||||
|
|
||||||
|
<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||||
|
!! This file is generated by oca-gen-addon-readme !!
|
||||||
|
!! changes will be overwritten. !!
|
||||||
|
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
|
||||||
|
<p><a class="reference external" href="https://odoo-community.org/page/development-status"><img alt="Beta" src="https://img.shields.io/badge/maturity-Beta-yellow.png" /></a> <a class="reference external" href="http://www.gnu.org/licenses/agpl-3.0-standalone.html"><img alt="License: AGPL-3" src="https://img.shields.io/badge/licence-AGPL--3-blue.png" /></a> <a class="reference external" href="https://github.com/akretion/odoo-usability/tree/12.0/purchase_usability"><img alt="akretion/odoo-usability" src="https://img.shields.io/badge/github-akretion%2Fodoo--usability-lightgray.png?logo=github" /></a></p>
|
||||||
|
<dl class="docutils">
|
||||||
|
<dt>This module adds the following functions:</dt>
|
||||||
|
<dd><ul class="first last simple">
|
||||||
|
<li>Track visibility on partner and product purchase warning</li>
|
||||||
|
<li>Track visibility on Purchase Order warning</li>
|
||||||
|
<li>Methods to help generate py3o purchase reports</li>
|
||||||
|
<li>Use untaxed amount in name_get of purchase orders</li>
|
||||||
|
<li>Protect Cancel button with a confirmation pop-up</li>
|
||||||
|
<li>Misc. improvements to Purchase Order Line views</li>
|
||||||
|
</ul>
|
||||||
|
</dd>
|
||||||
|
</dl>
|
||||||
|
<p><strong>Table of contents</strong></p>
|
||||||
|
<div class="contents local topic" id="contents">
|
||||||
|
<ul class="simple">
|
||||||
|
<li><a class="reference internal" href="#bug-tracker" id="id1">Bug Tracker</a></li>
|
||||||
|
<li><a class="reference internal" href="#credits" id="id2">Credits</a><ul>
|
||||||
|
<li><a class="reference internal" href="#authors" id="id3">Authors</a></li>
|
||||||
|
<li><a class="reference internal" href="#contributors" id="id4">Contributors</a></li>
|
||||||
|
<li><a class="reference internal" href="#maintainers" id="id5">Maintainers</a></li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div class="section" id="bug-tracker">
|
||||||
|
<h1><a class="toc-backref" href="#id1">Bug Tracker</a></h1>
|
||||||
|
<p>Bugs are tracked on <a class="reference external" href="https://github.com/akretion/odoo-usability/issues">GitHub Issues</a>.
|
||||||
|
In case of trouble, please check there if your issue has already been reported.
|
||||||
|
If you spotted it first, help us smashing it by providing a detailed and welcomed
|
||||||
|
<a class="reference external" href="https://github.com/akretion/odoo-usability/issues/new?body=module:%20purchase_usability%0Aversion:%2012.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**">feedback</a>.</p>
|
||||||
|
<p>Do not contact contributors directly about support or help with technical issues.</p>
|
||||||
|
</div>
|
||||||
|
<div class="section" id="credits">
|
||||||
|
<h1><a class="toc-backref" href="#id2">Credits</a></h1>
|
||||||
|
<div class="section" id="authors">
|
||||||
|
<h2><a class="toc-backref" href="#id3">Authors</a></h2>
|
||||||
|
<ul class="simple">
|
||||||
|
<li>Akretion</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div class="section" id="contributors">
|
||||||
|
<h2><a class="toc-backref" href="#id4">Contributors</a></h2>
|
||||||
|
<ul class="simple">
|
||||||
|
<li>Alexis de Lattre <<a class="reference external" href="mailto:alexis.delattre@akretion.com">alexis.delattre@akretion.com</a>></li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div class="section" id="maintainers">
|
||||||
|
<h2><a class="toc-backref" href="#id5">Maintainers</a></h2>
|
||||||
|
<p>This module is part of the <a class="reference external" href="https://github.com/akretion/odoo-usability/tree/12.0/purchase_usability">akretion/odoo-usability</a> project on GitHub.</p>
|
||||||
|
<p>You are welcome to contribute.</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
2
sale_down_payment/__init__.py
Normal file
2
sale_down_payment/__init__.py
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
from . import models
|
||||||
|
from . import wizard
|
||||||
35
sale_down_payment/__manifest__.py
Normal file
35
sale_down_payment/__manifest__.py
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
# Copyright 2019 Akretion France (http://www.akretion.com)
|
||||||
|
# @author Alexis de Lattre <alexis.delattre@akretion.com>
|
||||||
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||||
|
|
||||||
|
{
|
||||||
|
'name': 'Sale Down Payment',
|
||||||
|
'version': '12.0.1.0.0',
|
||||||
|
'category': 'Sales',
|
||||||
|
'license': 'AGPL-3',
|
||||||
|
'summary': 'Link payment to sale orders',
|
||||||
|
'description': """
|
||||||
|
Sale Down Payment
|
||||||
|
=================
|
||||||
|
|
||||||
|
This module adds a link between payments and sale orders. It allows to see down payments directly on the sale order form view.
|
||||||
|
|
||||||
|
After processing a bank statement, you can start a wizard to link unreconciled incoming payments to a sale order. There is also a button *Register Payment* on the sale order.
|
||||||
|
|
||||||
|
This module targets B2B companies that don't want to generate a down payment invoice for an advanced payment.
|
||||||
|
|
||||||
|
This module has been written by Alexis de Lattre from Akretion
|
||||||
|
<alexis.delattre@akretion.com>.
|
||||||
|
""",
|
||||||
|
'author': 'Akretion',
|
||||||
|
'website': 'http://www.akretion.com',
|
||||||
|
'depends': ['sale'],
|
||||||
|
'data': [
|
||||||
|
'wizard/account_bank_statement_sale_view.xml',
|
||||||
|
'views/account_bank_statement.xml',
|
||||||
|
'views/sale.xml',
|
||||||
|
'views/account_move_line.xml',
|
||||||
|
'views/account_payment.xml',
|
||||||
|
],
|
||||||
|
'installable': True,
|
||||||
|
}
|
||||||
3
sale_down_payment/models/__init__.py
Normal file
3
sale_down_payment/models/__init__.py
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
from . import sale
|
||||||
|
from . import account_move_line
|
||||||
|
from . import account_payment
|
||||||
32
sale_down_payment/models/account_move_line.py
Normal file
32
sale_down_payment/models/account_move_line.py
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
# Copyright 2019 Akretion France (http://www.akretion.com)
|
||||||
|
# @author Alexis de Lattre <alexis.delattre@akretion.com>
|
||||||
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||||
|
|
||||||
|
from odoo import api, fields, models, _
|
||||||
|
from odoo.exceptions import ValidationError
|
||||||
|
|
||||||
|
|
||||||
|
class AccountMoveLine(models.Model):
|
||||||
|
_inherit = 'account.move.line'
|
||||||
|
|
||||||
|
sale_id = fields.Many2one('sale.order', string='Sale Order')
|
||||||
|
account_internal_type = fields.Selection(
|
||||||
|
related='account_id.user_type_id.type', store=True,
|
||||||
|
string='Account Internal Type')
|
||||||
|
|
||||||
|
@api.constrains('sale_id', 'account_id')
|
||||||
|
def sale_id_check(self):
|
||||||
|
for line in self:
|
||||||
|
if line.sale_id and line.account_id.internal_type != 'receivable':
|
||||||
|
raise ValidationError(_(
|
||||||
|
"The account move line '%s' is linked to sale order '%s' "
|
||||||
|
"but it uses account '%s' which is not a receivable "
|
||||||
|
"account.")
|
||||||
|
% (line.name,
|
||||||
|
line.sale_id.name,
|
||||||
|
line.account_id.display_name))
|
||||||
|
|
||||||
|
@api.onchange('account_id')
|
||||||
|
def sale_advance_payement_account_id_change(self):
|
||||||
|
if self.sale_id and self.account_id.user_type_id.type != 'receivable':
|
||||||
|
self.sale_id = False
|
||||||
59
sale_down_payment/models/account_payment.py
Normal file
59
sale_down_payment/models/account_payment.py
Normal file
@@ -0,0 +1,59 @@
|
|||||||
|
# Copyright 2019 Akretion France (http://www.akretion.com)
|
||||||
|
# @author Alexis de Lattre <alexis.delattre@akretion.com>
|
||||||
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||||
|
|
||||||
|
from odoo import fields, models
|
||||||
|
from odoo.tools import float_round
|
||||||
|
|
||||||
|
|
||||||
|
class AccountPayment(models.Model):
|
||||||
|
_inherit = 'account.payment'
|
||||||
|
|
||||||
|
sale_id = fields.Many2one('sale.order', string='Sale Order')
|
||||||
|
|
||||||
|
def action_validate_invoice_payment(self):
|
||||||
|
if self.sale_id:
|
||||||
|
self.post()
|
||||||
|
else:
|
||||||
|
return super(AccountPayment, self).\
|
||||||
|
action_validate_invoice_payment()
|
||||||
|
|
||||||
|
def _get_counterpart_move_line_vals(self, invoice=False):
|
||||||
|
res = super(AccountPayment, self)._get_counterpart_move_line_vals(
|
||||||
|
invoice=invoice)
|
||||||
|
if self.sale_id:
|
||||||
|
res['sale_id'] = self.sale_id.id
|
||||||
|
return res
|
||||||
|
|
||||||
|
|
||||||
|
class AccountAbstractPayment(models.AbstractModel):
|
||||||
|
_inherit = "account.abstract.payment"
|
||||||
|
|
||||||
|
def default_get(self, fields_list):
|
||||||
|
res = super(AccountAbstractPayment, self).default_get(fields_list)
|
||||||
|
if (
|
||||||
|
self._context.get('active_model') == 'sale.order' and
|
||||||
|
self._context.get('active_id')):
|
||||||
|
so = self.env['sale.order'].browse(self._context['active_id'])
|
||||||
|
res.update({
|
||||||
|
'amount': so.amount_total,
|
||||||
|
'currency_id': so.currency_id.id,
|
||||||
|
'payment_type': 'inbound',
|
||||||
|
'partner_id': so.partner_invoice_id.commercial_partner_id.id,
|
||||||
|
'partner_type': 'customer',
|
||||||
|
'communication': so.name,
|
||||||
|
'sale_id': so.id,
|
||||||
|
})
|
||||||
|
return res
|
||||||
|
|
||||||
|
def _compute_payment_amount(self, invoices=None, currency=None):
|
||||||
|
amount = super(AccountAbstractPayment, self)._compute_payment_amount(
|
||||||
|
invoices=invoices, currency=currency)
|
||||||
|
if self.sale_id:
|
||||||
|
payment_currency = currency
|
||||||
|
if not payment_currency:
|
||||||
|
payment_currency = self.sale_id.currency_id
|
||||||
|
amount = float_round(
|
||||||
|
self.sale_id.amount_total - self.sale_id.amount_down_payment,
|
||||||
|
precision_rounding=payment_currency.rounding)
|
||||||
|
return amount
|
||||||
48
sale_down_payment/models/sale.py
Normal file
48
sale_down_payment/models/sale.py
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
# Copyright 2019 Akretion France (http://www.akretion.com)
|
||||||
|
# @author Alexis de Lattre <alexis.delattre@akretion.com>
|
||||||
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||||
|
|
||||||
|
from odoo import api, fields, models
|
||||||
|
from odoo.tools import float_round
|
||||||
|
|
||||||
|
|
||||||
|
class SaleOrder(models.Model):
|
||||||
|
_inherit = 'sale.order'
|
||||||
|
|
||||||
|
payment_line_ids = fields.One2many(
|
||||||
|
'account.move.line', 'sale_id', string='Advance Payments',
|
||||||
|
readonly=True)
|
||||||
|
amount_down_payment = fields.Monetary(
|
||||||
|
compute='_compute_amount_down_payment', string='Down Payment Amount')
|
||||||
|
# amount_residual : only used to hide 'Register Payment' button
|
||||||
|
amount_residual = fields.Monetary(
|
||||||
|
compute='_compute_amount_down_payment', string='Residual')
|
||||||
|
|
||||||
|
@api.depends(
|
||||||
|
'payment_line_ids.credit', 'payment_line_ids.debit',
|
||||||
|
'payment_line_ids.amount_currency', 'payment_line_ids.currency_id',
|
||||||
|
'payment_line_ids.date', 'currency_id')
|
||||||
|
def _compute_amount_down_payment(self):
|
||||||
|
for sale in self:
|
||||||
|
down_payment = 0.0
|
||||||
|
sale_currency = sale.pricelist_id.currency_id
|
||||||
|
if sale_currency == sale.company_id.currency_id:
|
||||||
|
for pl in sale.payment_line_ids:
|
||||||
|
down_payment -= pl.balance
|
||||||
|
else:
|
||||||
|
for pl in sale.payment_line_ids:
|
||||||
|
if (
|
||||||
|
pl.currency_id and
|
||||||
|
pl.currency_id == sale_currency and
|
||||||
|
pl.amount_currency):
|
||||||
|
down_payment -= pl.amount_currency
|
||||||
|
else:
|
||||||
|
down_payment -= sale.company_id.currency_id._convert(
|
||||||
|
pl.balance, sale_currency, sale.company_id,
|
||||||
|
pl.date)
|
||||||
|
down_payment = float_round(
|
||||||
|
down_payment, precision_rounding=sale.currency_id.rounding)
|
||||||
|
sale.amount_down_payment = down_payment
|
||||||
|
sale.amount_residual = float_round(
|
||||||
|
sale.amount_total - down_payment,
|
||||||
|
precision_rounding=sale.currency_id.rounding)
|
||||||
23
sale_down_payment/views/account_bank_statement.xml
Normal file
23
sale_down_payment/views/account_bank_statement.xml
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!--
|
||||||
|
Copyright 2019 Akretion France (http://www.akretion.com/)
|
||||||
|
@author: Alexis de Lattre <alexis.delattre@akretion.com>
|
||||||
|
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||||
|
-->
|
||||||
|
|
||||||
|
<odoo>
|
||||||
|
|
||||||
|
|
||||||
|
<record id="view_bank_statement_form" model="ir.ui.view">
|
||||||
|
<field name="name">advance_payment.account.bank.statement.form</field>
|
||||||
|
<field name="model">account.bank.statement</field>
|
||||||
|
<field name="inherit_id" ref="account.view_bank_statement_form"/>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<button name="check_confirm_bank" position="after">
|
||||||
|
<button name="%(account_bank_statement_sale_action)d" type="action" string="Link to Quotation/Sale Orders"/>
|
||||||
|
</button>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
|
||||||
|
</odoo>
|
||||||
24
sale_down_payment/views/account_move_line.xml
Normal file
24
sale_down_payment/views/account_move_line.xml
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!--
|
||||||
|
Copyright 2019 Akretion France (http://www.akretion.com/)
|
||||||
|
@author: Alexis de Lattre <alexis.delattre@akretion.com>
|
||||||
|
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||||
|
-->
|
||||||
|
|
||||||
|
<odoo>
|
||||||
|
|
||||||
|
|
||||||
|
<record id="view_move_line_form" model="ir.ui.view">
|
||||||
|
<field name="name">advance_payment.account.move.line.form</field>
|
||||||
|
<field name="model">account.move.line</field>
|
||||||
|
<field name="inherit_id" ref="account.view_move_line_form"/>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<field name="invoice_id" position="after">
|
||||||
|
<field name="sale_id" attrs="{'invisible': [('account_internal_type', '!=', 'receivable')]}" domain="['|', ('partner_id', 'child_of', partner_id), ('partner_invoice_id', 'child_of', partner_id), ('state', '!=', 'cancel'), ('invoice_status', '!=', 'invoiced')]"/>
|
||||||
|
<field name="account_internal_type" invisible="1"/>
|
||||||
|
</field>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
|
||||||
|
</odoo>
|
||||||
23
sale_down_payment/views/account_payment.xml
Normal file
23
sale_down_payment/views/account_payment.xml
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!--
|
||||||
|
Copyright 2018 Akretion France (http://www.akretion.com/)
|
||||||
|
@author: Alexis de Lattre <alexis.delattre@akretion.com>
|
||||||
|
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||||
|
-->
|
||||||
|
|
||||||
|
<odoo>
|
||||||
|
|
||||||
|
|
||||||
|
<record id="view_account_payment_sale_form" model="ir.ui.view">
|
||||||
|
<field name="name">account.payment.sale.form</field>
|
||||||
|
<field name="model">account.payment</field>
|
||||||
|
<field name="inherit_id" ref="account.view_account_payment_invoice_form"/>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<field name="invoice_ids" position="after">
|
||||||
|
<field name="sale_id" invisible="1"/>
|
||||||
|
</field>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
|
||||||
|
</odoo>
|
||||||
43
sale_down_payment/views/sale.xml
Normal file
43
sale_down_payment/views/sale.xml
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!--
|
||||||
|
Copyright 2019 Akretion France (http://www.akretion.com/)
|
||||||
|
@author: Alexis de Lattre <alexis.delattre@akretion.com>
|
||||||
|
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||||
|
-->
|
||||||
|
|
||||||
|
<odoo>
|
||||||
|
|
||||||
|
|
||||||
|
<record id="sale_account_payment_action" model="ir.actions.act_window">
|
||||||
|
<field name="name">Register Payment</field>
|
||||||
|
<field name="res_model">account.payment</field>
|
||||||
|
<field name="view_mode">form</field>
|
||||||
|
<field name="view_id" ref="account.view_account_payment_invoice_form"/>
|
||||||
|
<field name="target">new</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="view_order_form" model="ir.ui.view">
|
||||||
|
<field name="name">advance_payment.sale.order.form</field>
|
||||||
|
<field name="model">sale.order</field>
|
||||||
|
<field name="inherit_id" ref="sale.view_order_form"/>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<notebook position="inside">
|
||||||
|
<page name="advance_payment" string="Advance Payments">
|
||||||
|
<field name="payment_line_ids" nolabel="1"/>
|
||||||
|
<field name="amount_residual" invisible="1"/>
|
||||||
|
</page>
|
||||||
|
</notebook>
|
||||||
|
<field name="amount_total" position="after">
|
||||||
|
<div class="oe_subtotal_footer_separator oe_inline o_td_label">
|
||||||
|
<label for="amount_down_payment" />
|
||||||
|
</div>
|
||||||
|
<field name="amount_down_payment" nolabel="1" class="oe_subtotal_footer_separator"/>
|
||||||
|
</field>
|
||||||
|
<button name="action_cancel" position="before">
|
||||||
|
<button type="action" name="%(sale_account_payment_action)d" string="Register Payment" attrs="{'invisible': ['|', ('amount_residual', '<=', 0), ('invoice_status', '=', 'invoiced')]}"/>
|
||||||
|
</button>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
|
||||||
|
</odoo>
|
||||||
1
sale_down_payment/wizard/__init__.py
Normal file
1
sale_down_payment/wizard/__init__.py
Normal file
@@ -0,0 +1 @@
|
|||||||
|
from . import account_bank_statement_sale
|
||||||
86
sale_down_payment/wizard/account_bank_statement_sale.py
Normal file
86
sale_down_payment/wizard/account_bank_statement_sale.py
Normal file
@@ -0,0 +1,86 @@
|
|||||||
|
# Copyright 2019 Akretion France (http://www.akretion.com)
|
||||||
|
# @author Alexis de Lattre <alexis.delattre@akretion.com>
|
||||||
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||||
|
|
||||||
|
from odoo import api, fields, models, _
|
||||||
|
from odoo.exceptions import UserError
|
||||||
|
|
||||||
|
|
||||||
|
class AccountBankStatementSale(models.TransientModel):
|
||||||
|
_name = 'account.bank.statement.sale'
|
||||||
|
_description = 'Account Bank Statement Sale'
|
||||||
|
|
||||||
|
statement_id = fields.Many2one('account.bank.statement', readonly=True)
|
||||||
|
line_ids = fields.One2many(
|
||||||
|
'account.bank.statement.sale.line', 'wizard_id', string='Lines')
|
||||||
|
|
||||||
|
@api.model
|
||||||
|
def _prepare_line(self, move_line):
|
||||||
|
vals = {
|
||||||
|
'move_line_id': move_line.id,
|
||||||
|
'sale_id': move_line.sale_id.id or False,
|
||||||
|
'date': move_line.date,
|
||||||
|
'credit': move_line.credit,
|
||||||
|
'partner_id': move_line.partner_id.id,
|
||||||
|
'account_id': move_line.account_id.id,
|
||||||
|
'name': move_line.name,
|
||||||
|
'company_currency_id': move_line.company_currency_id.id,
|
||||||
|
}
|
||||||
|
return vals
|
||||||
|
|
||||||
|
@api.model
|
||||||
|
def default_get(self, fields_list):
|
||||||
|
res = super(AccountBankStatementSale, self).default_get(fields_list)
|
||||||
|
assert self._context.get('active_model') == 'account.bank.statement'
|
||||||
|
statement_id = self._context.get('active_id')
|
||||||
|
statement = self.env['account.bank.statement'].browse(statement_id)
|
||||||
|
res.update({
|
||||||
|
'line_ids': [],
|
||||||
|
'statement_id': statement_id,
|
||||||
|
})
|
||||||
|
for st_line in statement.line_ids:
|
||||||
|
if (
|
||||||
|
st_line.amount > 0 and
|
||||||
|
st_line.partner_id and
|
||||||
|
st_line.journal_entry_ids):
|
||||||
|
for line in st_line.journal_entry_ids:
|
||||||
|
if (
|
||||||
|
line.account_id.user_type_id.type == 'receivable'
|
||||||
|
and
|
||||||
|
line.partner_id and
|
||||||
|
not line.full_reconcile_id and
|
||||||
|
not line.matched_debit_ids and
|
||||||
|
not line.matched_credit_ids):
|
||||||
|
lvals = self._prepare_line(line)
|
||||||
|
res['line_ids'].append((0, 0, lvals))
|
||||||
|
if not res['line_ids']:
|
||||||
|
raise UserError(_(
|
||||||
|
"The bank statement '%s' doesn't contain any processed line "
|
||||||
|
"with a positive amount which is not reconciled.")
|
||||||
|
% statement.display_name)
|
||||||
|
return res
|
||||||
|
|
||||||
|
def validate(self):
|
||||||
|
self.ensure_one()
|
||||||
|
for line in self.line_ids:
|
||||||
|
if line.move_line_id.sale_id != line.sale_id:
|
||||||
|
line.move_line_id.sale_id = line.sale_id.id
|
||||||
|
|
||||||
|
|
||||||
|
class AccountBankStatementSaleLine(models.TransientModel):
|
||||||
|
_name = 'account.bank.statement.sale.line'
|
||||||
|
_description = 'Account Bank Statement Sale Lines'
|
||||||
|
|
||||||
|
wizard_id = fields.Many2one(
|
||||||
|
'account.bank.statement.sale', ondelete='cascade')
|
||||||
|
move_line_id = fields.Many2one(
|
||||||
|
'account.move.line', string='Move Line', required=True)
|
||||||
|
date = fields.Date(related='move_line_id.date')
|
||||||
|
credit = fields.Monetary(
|
||||||
|
related='move_line_id.credit', currency_field='company_currency_id')
|
||||||
|
partner_id = fields.Many2one(related='move_line_id.partner_id')
|
||||||
|
account_id = fields.Many2one(related='move_line_id.account_id')
|
||||||
|
name = fields.Char(related='move_line_id.name')
|
||||||
|
company_currency_id = fields.Many2one(
|
||||||
|
related='move_line_id.company_currency_id')
|
||||||
|
sale_id = fields.Many2one('sale.order', string='Sale Order')
|
||||||
@@ -0,0 +1,49 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!--
|
||||||
|
Copyright 2019 Akretion France (http://www.akretion.com/)
|
||||||
|
@author: Alexis de Lattre <alexis.delattre@akretion.com>
|
||||||
|
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||||
|
-->
|
||||||
|
|
||||||
|
<odoo>
|
||||||
|
|
||||||
|
|
||||||
|
<record id="account_bank_statement_sale_form" model="ir.ui.view">
|
||||||
|
<field name="name">account.bank.statement.sale.form</field>
|
||||||
|
<field name="model">account.bank.statement.sale</field>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<form string="Link to Quotation/Sale Orders">
|
||||||
|
<group name="main" invisible="1">
|
||||||
|
<field name="statement_id"/>
|
||||||
|
</group>
|
||||||
|
<group name="lines">
|
||||||
|
<field name="line_ids" nolabel="1">
|
||||||
|
<tree editable="bottom">
|
||||||
|
<field name="move_line_id" invisible="1"/>
|
||||||
|
<field name="date"/>
|
||||||
|
<field name="name"/>
|
||||||
|
<field name="partner_id"/>
|
||||||
|
<field name="account_id"/>
|
||||||
|
<field name="credit"/>
|
||||||
|
<field name="sale_id" domain="['|', ('partner_id', 'child_of', partner_id), ('partner_invoice_id', 'child_of', partner_id), ('state', '!=', 'cancel'), ('invoice_status', '!=', 'invoiced')]"/>
|
||||||
|
<field name="company_currency_id" invisible="1"/>
|
||||||
|
</tree>
|
||||||
|
</field>
|
||||||
|
</group>
|
||||||
|
<footer>
|
||||||
|
<button name="validate" type="object" string="Validate" class="btn-primary"/>
|
||||||
|
<button special="cancel" string="Cancel" class="btn-default"/>
|
||||||
|
</footer>
|
||||||
|
</form>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="account_bank_statement_sale_action" model="ir.actions.act_window">
|
||||||
|
<field name="name">Link to Quotation/Sale Orders</field>
|
||||||
|
<field name="res_model">account.bank.statement.sale</field>
|
||||||
|
<field name="view_mode">form</field>
|
||||||
|
<field name="target">new</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
|
||||||
|
</odoo>
|
||||||
0
sale_no_configurator_button/__init__.py
Normal file
0
sale_no_configurator_button/__init__.py
Normal file
31
sale_no_configurator_button/__manifest__.py
Normal file
31
sale_no_configurator_button/__manifest__.py
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
# Copyright 2020 Akretion (https://www.akretion.com).
|
||||||
|
# @author Sébastien BEAU <sebastien.beau@akretion.com>
|
||||||
|
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
|
||||||
|
|
||||||
|
{
|
||||||
|
"name": "Sale no configurator button",
|
||||||
|
"summary": "Hide 'configure a product' from sale line",
|
||||||
|
"version": "12.0.1.0.0",
|
||||||
|
"category": "Usabability",
|
||||||
|
"website": "www.akretion.com",
|
||||||
|
"author": " Akretion",
|
||||||
|
"license": "AGPL-3",
|
||||||
|
"application": False,
|
||||||
|
"installable": True,
|
||||||
|
"external_dependencies": {
|
||||||
|
"python": [],
|
||||||
|
"bin": [],
|
||||||
|
},
|
||||||
|
"depends": [
|
||||||
|
"sale",
|
||||||
|
],
|
||||||
|
"data": [
|
||||||
|
"views/sale_view.xml",
|
||||||
|
],
|
||||||
|
"demo": [
|
||||||
|
],
|
||||||
|
"qweb": [
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
12
sale_no_configurator_button/views/sale_view.xml
Normal file
12
sale_no_configurator_button/views/sale_view.xml
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<odoo>
|
||||||
|
|
||||||
|
<record id="sale_order_view_form" model="ir.ui.view">
|
||||||
|
<field name="model">sale.order</field>
|
||||||
|
<field name="inherit_id" ref="sale.view_order_form"/>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<xpath expr="//control/create[@groups='product.group_product_variant']" position="replace"/>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
</odoo>
|
||||||
0
sale_no_optional_product/__init__.py
Normal file
0
sale_no_optional_product/__init__.py
Normal file
30
sale_no_optional_product/__manifest__.py
Normal file
30
sale_no_optional_product/__manifest__.py
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
# Copyright 2020 Akretion (https://www.akretion.com).
|
||||||
|
# @author Sébastien BEAU <sebastien.beau@akretion.com>
|
||||||
|
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
|
||||||
|
|
||||||
|
{
|
||||||
|
"name": "Sale no optional product",
|
||||||
|
"summary": "Hide optional product",
|
||||||
|
"version": "12.0.1.0.0",
|
||||||
|
"category": "Usability",
|
||||||
|
"website": "www.akretion.com",
|
||||||
|
"author": " Akretion",
|
||||||
|
"license": "AGPL-3",
|
||||||
|
"application": False,
|
||||||
|
"installable": True,
|
||||||
|
"external_dependencies": {
|
||||||
|
"python": [],
|
||||||
|
"bin": [],
|
||||||
|
},
|
||||||
|
"depends": [
|
||||||
|
"sale_management",
|
||||||
|
],
|
||||||
|
"data": [
|
||||||
|
"views/product_template_view.xml",
|
||||||
|
"views/sale_order_view.xml",
|
||||||
|
],
|
||||||
|
"demo": [
|
||||||
|
],
|
||||||
|
"qweb": [
|
||||||
|
]
|
||||||
|
}
|
||||||
14
sale_no_optional_product/views/product_template_view.xml
Normal file
14
sale_no_optional_product/views/product_template_view.xml
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<odoo>
|
||||||
|
|
||||||
|
<record id="product_template_view_form" model="ir.ui.view">
|
||||||
|
<field name="model">product.template</field>
|
||||||
|
<field name="inherit_id" ref="sale.product_template_form_view"/>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<group name="options" position="attributes">
|
||||||
|
<attribute name="invisible"/>
|
||||||
|
</group>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
</odoo>
|
||||||
14
sale_no_optional_product/views/sale_order_view.xml
Normal file
14
sale_no_optional_product/views/sale_order_view.xml
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<odoo>
|
||||||
|
|
||||||
|
<record id="sale_order_form_quote" model="ir.ui.view">
|
||||||
|
<field name="model">sale.order</field>
|
||||||
|
<field name="inherit_id" ref="sale_management.sale_order_form_quote"/>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<xpath expr="//field[@name='sale_order_option_ids']/.." position="attributes">
|
||||||
|
<attribute name="invisible">1</attribute>
|
||||||
|
</xpath>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
</odoo>
|
||||||
0
sale_no_preview_button/__init__.py
Normal file
0
sale_no_preview_button/__init__.py
Normal file
31
sale_no_preview_button/__manifest__.py
Normal file
31
sale_no_preview_button/__manifest__.py
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
# Copyright 2020 Akretion (https://www.akretion.com).
|
||||||
|
# @author Sébastien BEAU <sebastien.beau@akretion.com>
|
||||||
|
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
|
||||||
|
|
||||||
|
{
|
||||||
|
"name": "Sale no preview button",
|
||||||
|
"summary": "Hide 'preview' from sale",
|
||||||
|
"version": "12.0.1.0.0",
|
||||||
|
"category": "Usabability",
|
||||||
|
"website": "www.akretion.com",
|
||||||
|
"author": " Akretion",
|
||||||
|
"license": "AGPL-3",
|
||||||
|
"application": False,
|
||||||
|
"installable": True,
|
||||||
|
"external_dependencies": {
|
||||||
|
"python": [],
|
||||||
|
"bin": [],
|
||||||
|
},
|
||||||
|
"depends": [
|
||||||
|
"sale",
|
||||||
|
],
|
||||||
|
"data": [
|
||||||
|
"views/sale_view.xml",
|
||||||
|
],
|
||||||
|
"demo": [
|
||||||
|
],
|
||||||
|
"qweb": [
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
14
sale_no_preview_button/views/sale_view.xml
Normal file
14
sale_no_preview_button/views/sale_view.xml
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<odoo>
|
||||||
|
|
||||||
|
<record id="view_order_form" model="ir.ui.view">
|
||||||
|
<field name="model">sale.order</field>
|
||||||
|
<field name="inherit_id" ref="sale.view_order_form"/>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<button name="preview_sale_order" position="attributes">
|
||||||
|
<attribute name="invisible">1</attribute>
|
||||||
|
</button>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
</odoo>
|
||||||
@@ -10,13 +10,17 @@ class SaleOrder(models.Model):
|
|||||||
|
|
||||||
route_id = fields.Many2one(
|
route_id = fields.Many2one(
|
||||||
'stock.location.route', string='Route',
|
'stock.location.route', string='Route',
|
||||||
ondelete='restrict', readonly=True,
|
ondelete='restrict', readonly=True, track_visibility='onchange',
|
||||||
states={'draft': [('readonly', False)], 'sent': [('readonly', False)]},
|
states={'draft': [('readonly', False)], 'sent': [('readonly', False)]},
|
||||||
domain=[('sale_selectable', '=', True)])
|
domain=[('sale_selectable', '=', True)])
|
||||||
|
|
||||||
def _action_confirm(self):
|
def _action_confirm(self):
|
||||||
for order in self.filtered(lambda o: o.route_id):
|
# Caution: take into account the scenario where
|
||||||
|
# route_id has a value, then SO is cancelled+back to draft,
|
||||||
|
# then route_id = False and SO is confirmed again
|
||||||
|
for order in self:
|
||||||
|
vals = {'route_id': order.route_id.id or False}
|
||||||
order.order_line.filtered(
|
order.order_line.filtered(
|
||||||
lambda l: l.product_id.type in ('product', 'consu')).write(
|
lambda l:
|
||||||
{'route_id': order.route_id.id})
|
l.product_id.type in ('product', 'consu')).write(vals)
|
||||||
super(SaleOrder, self)._action_confirm()
|
super(SaleOrder, self)._action_confirm()
|
||||||
|
|||||||
@@ -12,7 +12,7 @@
|
|||||||
Sale Purchase No Product Template
|
Sale Purchase No Product Template
|
||||||
=================================
|
=================================
|
||||||
|
|
||||||
This module replaces the menu entries for product.template by menu entries for product.product in the *Sales*, *Purchases* and *Warehouse* menu entry. With this module, the only menu entry for product.template is in the menu *Sales > Configuration > Product Categories and Attributes*.
|
This module replaces the menu entries for product.template by menu entries for product.product in the *Sales* and *Purchases* menu entries. With this module, the only menu entry for product.template is in the menu *Sales > Configuration > Product Categories and Attributes*.
|
||||||
|
|
||||||
This module also switches to the tree view by default for Product menu entries, instead of the kanban view.
|
This module also switches to the tree view by default for Product menu entries, instead of the kanban view.
|
||||||
|
|
||||||
|
|||||||
@@ -21,11 +21,6 @@
|
|||||||
<field name="action" ref="product_product_action_purchased"/>
|
<field name="action" ref="product_product_action_purchased"/>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
<!-- STOCK -->
|
|
||||||
<record id="stock.menu_product_variant_config_stock" model="ir.ui.menu">
|
|
||||||
<field name="action" ref="product.product_normal_action"/>
|
|
||||||
</record>
|
|
||||||
|
|
||||||
<!-- SALE -->
|
<!-- SALE -->
|
||||||
<!-- I'd prefer to inherit product.product_normal_action_sell and
|
<!-- I'd prefer to inherit product.product_normal_action_sell and
|
||||||
change the "name" field, but it doesn't work with translation,
|
change the "name" field, but it doesn't work with translation,
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user