diff --git a/addons/account/__openerp__.py b/addons/account/__openerp__.py
index fba1bd8736f..27aca6fb9fa 100644
--- a/addons/account/__openerp__.py
+++ b/addons/account/__openerp__.py
@@ -106,6 +106,7 @@ module named account_voucher.
'partner_view.xml',
'data/account_data.xml',
'data/data_account_type.xml',
+ 'data/configurable_account_chart.xml',
'account_invoice_workflow.xml',
'project/project_view.xml',
'project/project_report.xml',
diff --git a/addons/account/account_analytic_line.py b/addons/account/account_analytic_line.py
index da0bc96bda9..280b813380f 100644
--- a/addons/account/account_analytic_line.py
+++ b/addons/account/account_analytic_line.py
@@ -27,7 +27,7 @@ class account_analytic_line(osv.osv):
_inherit = 'account.analytic.line'
_description = 'Analytic Line'
_columns = {
- 'product_uom_id': fields.many2one('product.uom', 'UoM'),
+ 'product_uom_id': fields.many2one('product.uom', 'Unit of Measure'),
'product_id': fields.many2one('product.product', 'Product'),
'general_account_id': fields.many2one('account.account', 'General Account', required=True, ondelete='restrict'),
'move_id': fields.many2one('account.move.line', 'Move Line', ondelete='cascade', select=True),
diff --git a/addons/account/account_move_line.py b/addons/account/account_move_line.py
index 17120ee265e..573b8f17524 100644
--- a/addons/account/account_move_line.py
+++ b/addons/account/account_move_line.py
@@ -474,7 +474,7 @@ class account_move_line(osv.osv):
_columns = {
'name': fields.char('Name', size=64, required=True),
'quantity': fields.float('Quantity', digits=(16,2), help="The optional quantity expressed by this line, eg: number of product sold. The quantity is not a legal requirement but is very useful for some reports."),
- 'product_uom_id': fields.many2one('product.uom', 'UoM'),
+ 'product_uom_id': fields.many2one('product.uom', 'Unit of Measure'),
'product_id': fields.many2one('product.product', 'Product'),
'debit': fields.float('Debit', digits_compute=dp.get_precision('Account')),
'credit': fields.float('Credit', digits_compute=dp.get_precision('Account')),
diff --git a/addons/account/configurable_account_chart.xml b/addons/account/data/configurable_account_chart.xml
similarity index 100%
rename from addons/account/configurable_account_chart.xml
rename to addons/account/data/configurable_account_chart.xml
diff --git a/addons/account/installer.py b/addons/account/installer.py
index f0111d6645a..dc072787f96 100644
--- a/addons/account/installer.py
+++ b/addons/account/installer.py
@@ -123,11 +123,6 @@ class account_installer(osv.osv_memory):
context = {}
fy_obj = self.pool.get('account.fiscalyear')
for res in self.read(cr, uid, ids, context=context):
- if 'charts' in res and res['charts'] == 'configurable':
- #load generic chart of account
- fp = tools.file_open(opj('account', 'configurable_account_chart.xml'))
- tools.convert_xml_import(cr, 'account', fp, {}, 'init', True, None)
- fp.close()
if 'date_start' in res and 'date_stop' in res:
f_ids = fy_obj.search(cr, uid, [('date_start', '<=', res['date_start']), ('date_stop', '>=', res['date_stop']), ('company_id', '=', res['company_id'][0])], context=context)
if not f_ids:
diff --git a/addons/account/report/account_analytic_entries_report.py b/addons/account/report/account_analytic_entries_report.py
index 1b7e7f9a84b..02c1c508237 100644
--- a/addons/account/report/account_analytic_entries_report.py
+++ b/addons/account/report/account_analytic_entries_report.py
@@ -43,7 +43,7 @@ class analytic_entries_report(osv.osv):
'journal_id': fields.many2one('account.analytic.journal', 'Journal', required=True),
'move_id': fields.many2one('account.move.line', 'Move', required=True),
'product_id': fields.many2one('product.product', 'Product', required=True),
- 'product_uom_id': fields.many2one('product.uom', 'Product UOM', required=True),
+ 'product_uom_id': fields.many2one('product.uom', 'Product Unit of Measure', required=True),
'amount': fields.float('Amount', readonly=True),
'unit_amount': fields.float('Quantity', readonly=True),
'nbr': fields.integer('#Entries', readonly=True),
diff --git a/addons/account/report/account_analytic_entries_report_view.xml b/addons/account/report/account_analytic_entries_report_view.xml
index 9f580e6fc4b..408e76fdcb9 100644
--- a/addons/account/report/account_analytic_entries_report_view.xml
+++ b/addons/account/report/account_analytic_entries_report_view.xml
@@ -76,7 +76,7 @@
-
+
diff --git a/addons/account/report/account_entries_report.py b/addons/account/report/account_entries_report.py
index 29e40c7d5ad..56085b13453 100644
--- a/addons/account/report/account_entries_report.py
+++ b/addons/account/report/account_entries_report.py
@@ -50,7 +50,7 @@ class account_entries_report(osv.osv):
'journal_id': fields.many2one('account.journal', 'Journal', readonly=True),
'fiscalyear_id': fields.many2one('account.fiscalyear', 'Fiscal Year', readonly=True),
'product_id': fields.many2one('product.product', 'Product', readonly=True),
- 'product_uom_id': fields.many2one('product.uom', 'Product UOM', readonly=True),
+ 'product_uom_id': fields.many2one('product.uom', 'Product Unit of Measure', readonly=True),
'move_state': fields.selection([('draft','Unposted'), ('posted','Posted')], 'State', readonly=True),
'move_line_state': fields.selection([('draft','Unbalanced'), ('valid','Valid')], 'State of Move Line', readonly=True),
'reconcile_id': fields.many2one('account.move.reconcile', readonly=True),
diff --git a/addons/account/report/account_invoice_report.py b/addons/account/report/account_invoice_report.py
index 2fbe641dba3..f50ee46d63e 100644
--- a/addons/account/report/account_invoice_report.py
+++ b/addons/account/report/account_invoice_report.py
@@ -36,7 +36,7 @@ class account_invoice_report(osv.osv):
('10','October'), ('11','November'), ('12','December')], 'Month', readonly=True),
'product_id': fields.many2one('product.product', 'Product', readonly=True),
'product_qty':fields.float('Qty', readonly=True),
- 'uom_name': fields.char('Reference UoM', size=128, readonly=True),
+ 'uom_name': fields.char('Reference Unit of Measure', size=128, readonly=True),
'payment_term': fields.many2one('account.payment.term', 'Payment Term', readonly=True),
'period_id': fields.many2one('account.period', 'Force Period', domain=[('state','<>','done')], readonly=True),
'fiscal_position': fields.many2one('account.fiscal.position', 'Fiscal Position', readonly=True),
diff --git a/addons/account/res_config.py b/addons/account/res_config.py
index 930655eb125..583b769d315 100644
--- a/addons/account/res_config.py
+++ b/addons/account/res_config.py
@@ -36,11 +36,11 @@ class account_config_settings(osv.osv_memory):
_columns = {
'company_id': fields.many2one('res.company', 'Company', required=True),
'has_default_company': fields.boolean('Has default company', readonly=True),
-
'expects_chart_of_accounts': fields.related('company_id', 'expects_chart_of_accounts', type='boolean',
- string='Chart of Accounts for this Company'),
+ string='Chart of Accounts for this Company',
+ help="""Check this box if this company is a legal entity."""),
'currency_id': fields.related('company_id', 'currency_id', type='many2one', relation='res.currency', required=True,
- string='Main currency', help="Main currency of the company."),
+ string='Default Company Currency', help="Main currency of the company."),
'paypal_account': fields.related('company_id', 'paypal_account', type='char', size=128,
string='Paypal Account', help="Paypal account (email) for receiving online payments (credit card, etc.)"),
'company_footer': fields.related('company_id', 'rml_footer2', type='char', size=250, readonly=True,
@@ -65,31 +65,31 @@ class account_config_settings(osv.osv_memory):
'sale_sequence_prefix': fields.related('sale_journal_id', 'sequence_id', 'prefix', type='char', string='Invoice Sequence'),
'sale_sequence_next': fields.related('sale_journal_id', 'sequence_id', 'number_next', type='integer', string='Next Invoice Number'),
'sale_refund_journal_id': fields.many2one('account.journal', 'Sale Refund Journal'),
- 'sale_refund_sequence_prefix': fields.related('sale_refund_journal_id', 'sequence_id', 'prefix', type='char', string='Refund Sequence'),
- 'sale_refund_sequence_next': fields.related('sale_refund_journal_id', 'sequence_id', 'number_next', type='integer', string='Next Refund Number'),
+ 'sale_refund_sequence_prefix': fields.related('sale_refund_journal_id', 'sequence_id', 'prefix', type='char', string='Credit Note Sequence'),
+ 'sale_refund_sequence_next': fields.related('sale_refund_journal_id', 'sequence_id', 'number_next', type='integer', string='Next Credit Note Number'),
'purchase_journal_id': fields.many2one('account.journal', 'Purchase Journal'),
'purchase_sequence_prefix': fields.related('purchase_journal_id', 'sequence_id', 'prefix', type='char', string='Supplier Invoice Sequence'),
'purchase_sequence_next': fields.related('purchase_journal_id', 'sequence_id', 'number_next', type='integer', string='Next Supplier Invoice Number'),
'purchase_refund_journal_id': fields.many2one('account.journal', 'Purchase Refund Journal'),
- 'purchase_refund_sequence_prefix': fields.related('purchase_refund_journal_id', 'sequence_id', 'prefix', type='char', string='Supplier Refund Sequence'),
- 'purchase_refund_sequence_next': fields.related('purchase_refund_journal_id', 'sequence_id', 'number_next', type='integer', string='Next Supplier Refund Number'),
+ 'purchase_refund_sequence_prefix': fields.related('purchase_refund_journal_id', 'sequence_id', 'prefix', type='char', string='Supplier Credit Note Sequence'),
+ 'purchase_refund_sequence_next': fields.related('purchase_refund_journal_id', 'sequence_id', 'number_next', type='integer', string='Next Supplier Credit Note Number'),
- 'module_account_check_writing': fields.boolean('Support Check Writings',
+ 'module_account_check_writing': fields.boolean('Check Writing',
help="""This allows you to check writing and printing.
This installs the module account_check_writing."""),
'module_account_accountant': fields.boolean('Accountant Features',
- help="""This allows you to access all the accounting features, like the journal items and the chart of accounts.
- This installs the module account_accountant."""),
+ help="""If you do not check this box, you will be able to do Invoicing & Payments, but not accounting (Journal Items, Chart of Accounts, ...)."""),
'module_account_asset': fields.boolean('Assets Management',
help="""This allows you to manage the assets owned by a company or a person.
It keeps track of the depreciation occurred on those assets, and creates account move for those depreciation lines.
- This installs the module account_asset."""),
- 'module_account_budget': fields.boolean('Budgets Management',
+ This installs the module account_asset. If you do not check this box, you will be able to do invoicing & payments,
+ but not accounting (Journal Items, Chart of Accounts, ...) """),
+ 'module_account_budget': fields.boolean('Budget Management',
help="""This allows accountants to manage analytic and crossovered budgets.
Once the master budgets and the budgets are defined,
the project managers can set the planned amount on each analytic account.
This installs the module account_budget."""),
- 'module_account_payment': fields.boolean('Supplier Payment Orders',
+ 'module_account_payment': fields.boolean('Manage Payment Orders',
help="""This allows you to create and manage your payment orders, with purposes to
* serve as base for an easy plug-in of various automated payment mechanisms, and
* provide a more efficient way to manage invoice payments.
@@ -97,17 +97,10 @@ class account_config_settings(osv.osv_memory):
'module_account_voucher': fields.boolean('Manage Customer Payments',
help="""This includes all the basic requirements of voucher entries for bank, cash, sales, purchase, expense, contra, etc.
This installs the module account_voucher."""),
- 'module_account_followup': fields.boolean('Customer Follow-Ups',
+ 'module_account_followup': fields.boolean('Manage Customer Payment Follow-Ups',
help="""This allows to automate letters for unpaid invoices, with multi-level recalls.
This installs the module account_followup."""),
- 'module_account_analytic_plans': fields.boolean('Support Multiple Analytic Plans',
- help="""This allows to use several analytic plans, according to the general journal.
- This installs the module account_analytic_plans."""),
- 'module_account_analytic_default': fields.boolean('Rules for Analytic Assignation',
- help="""Set default values for your analytic accounts.
- Allows to automatically select analytic accounts based on criteria like product, partner, user, company, date.
- This installs the module account_analytic_default."""),
- 'module_account_invoice_layout': fields.boolean('Allow notes and subtotals',
+ 'module_account_invoice_layout': fields.boolean('Allow Notes and Subtotals',
help="""This provides some features to improve the layout of invoices.
It gives you the possibility to:
* order all the lines of an invoice
@@ -118,9 +111,10 @@ class account_config_settings(osv.osv_memory):
'group_proforma_invoices': fields.boolean('Allow Pro-forma Invoices',
implied_group='account.group_proforma_invoices',
help="Allows you to put invoices in pro-forma state."),
-
'default_sale_tax': fields.many2one('account.tax', 'Default Sale Tax'),
'default_purchase_tax': fields.many2one('account.tax', 'Default Purchase Tax'),
+ 'decimal_precision': fields.integer('Decimal Precision',
+ help="""Set the decimal precision for rounding results in accounting."""),
}
def _default_company(self, cr, uid, context=None):
@@ -279,4 +273,13 @@ class account_config_settings(osv.osv_memory):
elif config.period == '3months':
fiscalyear.create_period3(cr, uid, [fiscalyear_id])
+ def get_default_dp(self, cr, uid, fields, context=None):
+ dp = self.pool.get('ir.model.data').get_object(cr, uid, 'product','decimal_account')
+ return {'decimal_precision': dp.digits}
+
+ def set_default_dp(self, cr, uid, ids, context=None):
+ config = self.browse(cr, uid, ids[0], context)
+ dp = self.pool.get('ir.model.data').get_object(cr, uid, 'product','decimal_account')
+ dp.write({'digits': config.decimal_precision})
+
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/account/res_config_view.xml b/addons/account/res_config_view.xml
index e0b1b2fbd66..1cf1e40f02b 100644
--- a/addons/account/res_config_view.xml
+++ b/addons/account/res_config_view.xml
@@ -22,16 +22,17 @@
+
-
+
@@ -56,22 +57,31 @@
-
+
-
+
+
-
+
+
+
+
+
-
+
+
+
+
+
@@ -80,9 +90,17 @@
-
+
+
+
+
+
-
+
+
+
+
+
@@ -96,11 +114,8 @@
-
-
-
-
-
+
+
@@ -116,7 +131,7 @@
+ sequence="14" action="action_account_config"/>
diff --git a/addons/account/wizard/account_invoice_refund.py b/addons/account/wizard/account_invoice_refund.py
index 6cba6ffa826..fea020b5c4b 100644
--- a/addons/account/wizard/account_invoice_refund.py
+++ b/addons/account/wizard/account_invoice_refund.py
@@ -32,11 +32,11 @@ class account_invoice_refund(osv.osv_memory):
_name = "account.invoice.refund"
_description = "Invoice Refund"
_columns = {
- 'date': fields.date('Operation date', help='This date will be used as the invoice date for Refund Invoice and Period will be chosen accordingly!'),
+ 'date': fields.date('Operation Date', help='This date will be used as the invoice date for credit note and period will be chosen accordingly!'),
'period': fields.many2one('account.period', 'Force period'),
- 'journal_id': fields.many2one('account.journal', 'Refund Journal', help='You can select here the journal to use for the refund invoice that will be created. If you leave that field empty, it will use the same journal as the current invoice.'),
+ 'journal_id': fields.many2one('account.journal', 'Refund Journal', help='You can select here the journal to use for the credit note that will be created. If you leave that field empty, it will use the same journal as the current invoice.'),
'description': fields.char('Description', size=128, required=True),
- 'filter_refund': fields.selection([('refund', 'Create a draft Refund'), ('cancel', 'Cancel: refund invoice and reconcile'),('modify', 'Modify: refund invoice, reconcile and create a new draft invoice')], "Refund Method", required=True, help='Refund invoice base on this type. You can not Modify and Cancel if the invoice is already reconciled'),
+ 'filter_refund': fields.selection([('refund', 'Create a draft refund'), ('cancel', 'Cancel: create credit note and reconcile'),('modify', 'Modify: create credit note, reconcile and create a new draft invoice')], "Refund Method", required=True, help='Credit note base on this type. You can not Modify and Cancel if the invoice is already reconciled'),
}
def _get_journal(self, cr, uid, context=None):
diff --git a/addons/account/wizard/account_invoice_refund_view.xml b/addons/account/wizard/account_invoice_refund_view.xml
index c68c9162ce4..57edd62f575 100644
--- a/addons/account/wizard/account_invoice_refund_view.xml
+++ b/addons/account/wizard/account_invoice_refund_view.xml
@@ -7,8 +7,8 @@
account.invoice.refundform
-
@@ -49,7 +50,8 @@
inline
-
+
diff --git a/addons/hr_expense/hr_expense.py b/addons/hr_expense/hr_expense.py
index 6e7db83bbb7..b0706b03719 100644
--- a/addons/hr_expense/hr_expense.py
+++ b/addons/hr_expense/hr_expense.py
@@ -260,7 +260,7 @@ class hr_expense_line(osv.osv):
'unit_amount': fields.float('Unit Price', digits_compute=dp.get_precision('Account')),
'unit_quantity': fields.float('Quantities' ),
'product_id': fields.many2one('product.product', 'Product', domain=[('hr_expense_ok','=',True)]),
- 'uom_id': fields.many2one('product.uom', 'UoM'),
+ 'uom_id': fields.many2one('product.uom', 'Unit of Measure'),
'description': fields.text('Description'),
'analytic_account': fields.many2one('account.analytic.account','Analytic account'),
'ref': fields.char('Reference', size=32),
diff --git a/addons/hr_expense/hr_expense_installer_view.xml b/addons/hr_expense/hr_expense_installer_view.xml
index baabddea059..2f945c6fbcd 100644
--- a/addons/hr_expense/hr_expense_installer_view.xml
+++ b/addons/hr_expense/hr_expense_installer_view.xml
@@ -10,7 +10,7 @@
-
+
diff --git a/addons/hr_holidays/hr_holidays_data.xml b/addons/hr_holidays/hr_holidays_data.xml
index e7837bc9839..b312d79c03d 100644
--- a/addons/hr_holidays/hr_holidays_data.xml
+++ b/addons/hr_holidays/hr_holidays_data.xml
@@ -4,7 +4,7 @@
- Legal Leaves
+ black
diff --git a/addons/hr_payroll/res_config_view.xml b/addons/hr_payroll/res_config_view.xml
index f2d5886865d..c2f760d8864 100644
--- a/addons/hr_payroll/res_config_view.xml
+++ b/addons/hr_payroll/res_config_view.xml
@@ -7,10 +7,9 @@
form
-
-
+
-
+
diff --git a/addons/hr_recruitment/res_config.py b/addons/hr_recruitment/res_config.py
index 2afec802689..6fe0a7b88dd 100644
--- a/addons/hr_recruitment/res_config.py
+++ b/addons/hr_recruitment/res_config.py
@@ -26,27 +26,12 @@ class hr_applicant_settings(osv.osv_memory):
_inherit = ['hr.config.settings', 'fetchmail.config.settings']
_columns = {
- 'module_document_ftp': fields.boolean('Index & Track Documents',
+ 'module_document_ftp': fields.boolean('Automatic Indexation of Resumes',
help="""Manage your CV's and motivation letter related to all applicants.
This installs the module document_ftp."""),
- 'fetchmail_applicants': fields.boolean('Create Applicants from an Email Account',
+ 'fetchmail_applicants': fields.boolean('Create Applicants from Incoming Mails', readonly=True,
fetchmail_model='hr.applicant', fetchmail_name='Incoming HR Applications',
help ="""Allow applicants to send their job application to an email address (jobs@mycompany.com),
and create automatically application documents in the system."""),
- 'applicants_server': fields.char('Server', size=256),
- 'applicants_port': fields.integer('Port'),
- 'applicants_type': fields.selection([
- ('pop', 'POP Server'),
- ('imap', 'IMAP Server'),
- ('local', 'Local Server'),
- ], 'Type'),
- 'applicants_is_ssl': fields.boolean('SSL/TLS',
- help="Connections are encrypted with SSL/TLS through a dedicated port (default: IMAPS=993, POP=995)"),
- 'applicants_user': fields.char('Username', size=256),
- 'applicants_password': fields.char('Password', size=1024),
- }
-
- _defaults = {
- 'applicants_type': 'pop',
}
diff --git a/addons/hr_recruitment/res_config_view.xml b/addons/hr_recruitment/res_config_view.xml
index 32575a4726d..659aa586d56 100644
--- a/addons/hr_recruitment/res_config_view.xml
+++ b/addons/hr_recruitment/res_config_view.xml
@@ -12,16 +12,7 @@
-
-
-
-
-
-
-
-
+
diff --git a/addons/hr_timesheet/hr_timesheet.py b/addons/hr_timesheet/hr_timesheet.py
index 1e15e5b19b1..12fbbcdedef 100644
--- a/addons/hr_timesheet/hr_timesheet.py
+++ b/addons/hr_timesheet/hr_timesheet.py
@@ -31,7 +31,7 @@ class hr_employee(osv.osv):
_columns = {
'product_id': fields.many2one('product.product', 'Product', help="Specifies employee's designation as a product with type 'service'."),
'journal_id': fields.many2one('account.analytic.journal', 'Analytic Journal'),
- 'uom_id': fields.related('product_id', 'uom_id', type='many2one', relation='product.uom', string='UoM', store=True, readonly=True)
+ 'uom_id': fields.related('product_id', 'uom_id', type='many2one', relation='product.uom', string='Unit of Measure', store=True, readonly=True)
}
def _getAnalyticJournal(self, cr, uid, context=None):
diff --git a/addons/hr_timesheet_invoice/report/report_analytic.py b/addons/hr_timesheet_invoice/report/report_analytic.py
index d2db7fd4027..7c6651301d2 100644
--- a/addons/hr_timesheet_invoice/report/report_analytic.py
+++ b/addons/hr_timesheet_invoice/report/report_analytic.py
@@ -70,7 +70,7 @@ class report_account_analytic_line_to_invoice(osv.osv):
'name': fields.char('Year',size=64,required=False, readonly=True),
'product_id':fields.many2one('product.product', 'Product', readonly=True),
'account_id':fields.many2one('account.analytic.account', 'Analytic account', readonly=True),
- 'product_uom_id':fields.many2one('product.uom', 'UoM', readonly=True),
+ 'product_uom_id':fields.many2one('product.uom', 'Unit of Measure', readonly=True),
'unit_amount': fields.float('Units', readonly=True),
'sale_price': fields.float('Sale price', readonly=True, digits_compute=dp.get_precision('Sale Price')),
'amount': fields.float('Amount', readonly=True, digits_compute=dp.get_precision('Account')),
diff --git a/addons/hr_timesheet_sheet/res_config.py b/addons/hr_timesheet_sheet/res_config.py
index d7df5950200..24566d668da 100644
--- a/addons/hr_timesheet_sheet/res_config.py
+++ b/addons/hr_timesheet_sheet/res_config.py
@@ -26,7 +26,7 @@ class hr_timesheet_settings(osv.osv_memory):
_columns = {
'timesheet_range': fields.selection([('day','Day'),('week','Week'),('month','Month')],
- 'Timesheet Range', help="Periodicity on which you validate your timesheets."),
+ 'Validate Timesheets Every', help="Periodicity on which you validate your timesheets."),
'timesheet_max_difference': fields.float('Timesheet Allowed Difference (Hours)',
help="""Allowed difference in hours between the sign in/out and the timesheet
computation for one sheet. Set this to 0 if you do not want any control."""),
diff --git a/addons/hr_timesheet_sheet/res_config_view.xml b/addons/hr_timesheet_sheet/res_config_view.xml
index c789bd5106e..6d8c998eec7 100644
--- a/addons/hr_timesheet_sheet/res_config_view.xml
+++ b/addons/hr_timesheet_sheet/res_config_view.xml
@@ -7,11 +7,11 @@
form
-
-
-
-
-
+
+
+
+
+
diff --git a/addons/knowledge/__init__.py b/addons/knowledge/__init__.py
index 9a3d6d2fbb6..53c45089ddc 100644
--- a/addons/knowledge/__init__.py
+++ b/addons/knowledge/__init__.py
@@ -19,5 +19,6 @@
#
##############################################################################
+import res_config
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/knowledge/__openerp__.py b/addons/knowledge/__openerp__.py
index aa45834bb38..edefd6655ea 100644
--- a/addons/knowledge/__openerp__.py
+++ b/addons/knowledge/__openerp__.py
@@ -40,6 +40,7 @@ document and Wiki based Hidden.
'security/knowledge_security.xml',
'security/ir.model.access.csv',
'knowledge_view.xml',
+ 'res_config_view.xml',
],
'demo_xml': ['knowledge_demo.xml'],
'installable': True,
diff --git a/addons/knowledge/res_config.py b/addons/knowledge/res_config.py
new file mode 100644
index 00000000000..3f9c5b840f7
--- /dev/null
+++ b/addons/knowledge/res_config.py
@@ -0,0 +1,44 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+# OpenERP, Open Source Business Applications
+# Copyright (C) 2004-2012 OpenERP S.A. ().
+#
+# 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 .
+#
+##############################################################################
+
+from osv import osv, fields
+
+class knowledge_config_settings(osv.osv_memory):
+ _name = 'knowledge.config.settings'
+ _inherit = 'res.config.settings'
+ _columns = {
+ 'module_wiki_faq': fields.boolean('Internal FAQ as a Wiki',
+ help="""This installs the module wiki_faq."""),
+ 'module_wiki_quality_manual': fields.boolean('Quality Manual as a Wiki',
+ help="""This installs the module wiki_quality_manual."""),
+ 'module_document': fields.boolean('Document Management',
+ help="""This is a complete document management system, with: user authentication,
+ full document search (but pptx and docx are not supported), and a document dashboard.
+ This installs the module document."""),
+ 'module_document_ftp': fields.boolean('Share repositories (FTP)',
+ help="""Access your documents in OpenERP through an FTP interface.
+ This installs the module document_ftp."""),
+ 'module_document_webdav': fields.boolean('Share Repositories (WebDAV)',
+ help="""Access your documents in OpenERP through WebDAV.
+ This installs the module document_webdav."""),
+ }
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/knowledge/res_config_view.xml b/addons/knowledge/res_config_view.xml
new file mode 100644
index 00000000000..6816a9da3a1
--- /dev/null
+++ b/addons/knowledge/res_config_view.xml
@@ -0,0 +1,41 @@
+
+
+
+
+ Configure Knowledge
+ knowledge.config.settings
+ form
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Configure Knowledge
+ knowledge.config.settings
+ form
+ inline
+
+
+
+
+
diff --git a/addons/l10n_be_hr_payroll/static/src/img/icon.png b/addons/l10n_be_hr_payroll/static/src/img/icon.png
new file mode 100644
index 00000000000..2ee49b8c1a2
Binary files /dev/null and b/addons/l10n_be_hr_payroll/static/src/img/icon.png differ
diff --git a/addons/marketing/__init__.py b/addons/marketing/__init__.py
index e68279cad8d..ff0c032da87 100644
--- a/addons/marketing/__init__.py
+++ b/addons/marketing/__init__.py
@@ -19,6 +19,6 @@
#
##############################################################################
+import res_config
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
-
diff --git a/addons/marketing/__openerp__.py b/addons/marketing/__openerp__.py
index c097c22b84e..8088a0a1a1b 100644
--- a/addons/marketing/__openerp__.py
+++ b/addons/marketing/__openerp__.py
@@ -38,7 +38,8 @@ Contains the installer for marketing-related modules.
'update_xml': [
'security/marketing_security.xml',
'security/ir.model.access.csv',
- 'marketing_view.xml'
+ 'marketing_view.xml',
+ 'res_config_view.xml',
],
'demo_xml': ['marketing_demo.xml'],
'installable': True,
diff --git a/addons/marketing/res_config.py b/addons/marketing/res_config.py
new file mode 100644
index 00000000000..7584f00e6b0
--- /dev/null
+++ b/addons/marketing/res_config.py
@@ -0,0 +1,40 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+# OpenERP, Open Source Business Applications
+# Copyright (C) 2004-2012 OpenERP S.A. ().
+#
+# 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 .
+#
+##############################################################################
+
+from osv import fields, osv
+
+class marketing_config_settings(osv.osv_memory):
+ _name = 'marketing.config.settings'
+ _inherit = 'res.config.settings'
+ _columns = {
+ 'module_marketing_campaign': fields.boolean('Marketing Campaigns',
+ help="""Provides leads automation through marketing campaigns.
+ Campaigns can in fact be defined on any resource, not just CRM leads.
+ This installs the module marketing_campaign."""),
+ 'module_marketing_campaign_crm_demo': fields.boolean('Demo Data for Marketing Campaigns',
+ help="""Installs demo data like leads, campaigns and segments for Marketing Campaigns.
+ This installs the module marketing_campaign_crm_demo."""),
+ 'module_crm_profiling': fields.boolean('Track Customer Profile to Focus your Campaigns',
+ help="""Allows users to perform segmentation within partners.
+ This installs the module crm_profiling."""),
+ }
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/marketing/res_config_view.xml b/addons/marketing/res_config_view.xml
new file mode 100644
index 00000000000..b7230aa65a7
--- /dev/null
+++ b/addons/marketing/res_config_view.xml
@@ -0,0 +1,36 @@
+
+
+
+
+ Configure Marketing
+ marketing.config.settings
+ form
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Configure Marketing
+ marketing.config.settings
+ form
+ inline
+
+
+
+
+
+
diff --git a/addons/mrp/mrp.py b/addons/mrp/mrp.py
index 7be84764192..02272040311 100644
--- a/addons/mrp/mrp.py
+++ b/addons/mrp/mrp.py
@@ -206,8 +206,8 @@ class mrp_bom(osv.osv):
'product_id': fields.many2one('product.product', 'Product', required=True),
'product_uos_qty': fields.float('Product UOS Qty'),
'product_uos': fields.many2one('product.uom', 'Product UOS', help="Product UOS (Unit of Sale) is the unit of measurement for the invoicing and promotion of stock."),
- 'product_qty': fields.float('Product Qty', required=True, digits_compute=dp.get_precision('Product UoM')),
- 'product_uom': fields.many2one('product.uom', 'Product UOM', required=True, help="UoM (Unit of Measure) is the unit of measurement for the inventory control"),
+ 'product_qty': fields.float('Product Qty', required=True, digits_compute=dp.get_precision('Product Unit of Measure')),
+ 'product_uom': fields.many2one('product.uom', 'Product Unit of Measure', required=True, help="Unit of Measure (Unit of Measure) is the unit of measurement for the inventory control"),
'product_rounding': fields.float('Product Rounding', help="Rounding applied on the product quantity."),
'product_efficiency': fields.float('Manufacturing Efficiency', required=True, help="A factor of 0.9 means a loss of 10% within the production process."),
'bom_lines': fields.one2many('mrp.bom', 'bom_id', 'BoM Lines'),
@@ -454,8 +454,8 @@ class mrp_production(osv.osv):
'priority': fields.selection([('0','Not urgent'),('1','Normal'),('2','Urgent'),('3','Very Urgent')], 'Priority', select=True),
'product_id': fields.many2one('product.product', 'Product', required=True, readonly=True, states={'draft':[('readonly',False)]}),
- 'product_qty': fields.float('Product Qty', digits_compute=dp.get_precision('Product UoM'), required=True, states={'draft':[('readonly',False)]}, readonly=True),
- 'product_uom': fields.many2one('product.uom', 'Product UOM', required=True, states={'draft':[('readonly',False)]}, readonly=True),
+ 'product_qty': fields.float('Product Qty', digits_compute=dp.get_precision('Product Unit of Measure'), required=True, states={'draft':[('readonly',False)]}, readonly=True),
+ 'product_uom': fields.many2one('product.uom', 'Product Unit of Measure', required=True, states={'draft':[('readonly',False)]}, readonly=True),
'product_uos_qty': fields.float('Product UoS Qty', states={'draft':[('readonly',False)]}, readonly=True),
'product_uos': fields.many2one('product.uom', 'Product UoS', states={'draft':[('readonly',False)]}, readonly=True),
@@ -1112,8 +1112,8 @@ class mrp_production_product_line(osv.osv):
_columns = {
'name': fields.char('Name', size=64, required=True),
'product_id': fields.many2one('product.product', 'Product', required=True),
- 'product_qty': fields.float('Product Qty', digits_compute=dp.get_precision('Product UoM'), required=True),
- 'product_uom': fields.many2one('product.uom', 'Product UOM', required=True),
+ 'product_qty': fields.float('Product Qty', digits_compute=dp.get_precision('Product Unit of Measure'), required=True),
+ 'product_uom': fields.many2one('product.uom', 'Product Unit of Measure', required=True),
'product_uos_qty': fields.float('Product UOS Qty'),
'product_uos': fields.many2one('product.uom', 'Product UOS'),
'production_id': fields.many2one('mrp.production', 'Production Order', select=True),
diff --git a/addons/mrp/mrp_view.xml b/addons/mrp/mrp_view.xml
index 387854fd010..00d3d120e41 100644
--- a/addons/mrp/mrp_view.xml
+++ b/addons/mrp/mrp_view.xml
@@ -432,7 +432,7 @@
-
+
@@ -663,7 +663,7 @@
-
+
diff --git a/addons/purchase/report/purchase_report.py b/addons/purchase/report/purchase_report.py
index 99692907591..f7d73bfb739 100644
--- a/addons/purchase/report/purchase_report.py
+++ b/addons/purchase/report/purchase_report.py
@@ -50,7 +50,7 @@ class purchase_report(osv.osv):
'date_approve':fields.date('Date Approved', readonly=True),
'expected_date':fields.date('Expected Date', readonly=True),
'validator' : fields.many2one('res.users', 'Validated By', readonly=True),
- 'product_uom' : fields.many2one('product.uom', 'Reference UoM', required=True),
+ 'product_uom' : fields.many2one('product.uom', 'Reference Unit of Measure', required=True),
'company_id':fields.many2one('res.company', 'Company', readonly=True),
'user_id':fields.many2one('res.users', 'Responsible', readonly=True),
'delay':fields.float('Days to Validate', digits=(16,2), readonly=True),
diff --git a/addons/purchase/report/purchase_report_view.xml b/addons/purchase/report/purchase_report_view.xml
index 399db12fb01..381b1bfee37 100644
--- a/addons/purchase/report/purchase_report_view.xml
+++ b/addons/purchase/report/purchase_report_view.xml
@@ -102,6 +102,8 @@
+
+
diff --git a/addons/purchase/res_config.py b/addons/purchase/res_config.py
index 9ee5e8a97de..d4baa2d6099 100644
--- a/addons/purchase/res_config.py
+++ b/addons/purchase/res_config.py
@@ -37,42 +37,54 @@ class purchase_config_settings(osv.osv_memory):
implied_group='product.group_purchase_pricelist',
help="""Allows to manage different prices based on rules per category of Supplier.
Example: 10% for retailers, promotion of 5 EUR on this product, etc."""),
- 'group_uom':fields.boolean("Manage Different UoM for Products",
+ 'group_uom':fields.boolean("Manage Different Units of Measure for Products",
implied_group='product.group_uom',
help="""Allows you to select and maintain different units of measure for products."""),
- 'module_purchase_analytic_plans': fields.boolean('Purchase Analytic Plan',
+ 'module_purchase_analytic_plans': fields.boolean('Use Multiple Analytic Accounts on Purchases',
help ="""Allows the user to maintain several analysis plans. These let you split
lines on a purchase order between several accounts and analytic plans.
This installs the module purchase_analytic_plans."""),
'module_warning': fields.boolean("Alerts by Products or Supplier",
- help="""To trigger warnings in OpenERP objects.
- Warning messages can be displayed for objects like sale order, purchase order, picking and invoice.
- This installs the module warning."""),
- 'module_product_manufacturer': fields.boolean("Define a Manufacturer of Products",
+ help="""Allow to configure warnings on products and trigger them when a user wants to purchase a given product or a given supplier.
+ Example: Product: this product is deprecated, do not purchase more than 5.
+ Supplier: don't forget to ask for an express delivery."""),
+ 'module_product_manufacturer': fields.boolean("Define Manufacturers on Products",
help="""This allows you to define the following for a product:
* Manufacturer
* Manufacturer Product Name
* Manufacturer Product Code
* Product Attributes.
This installs the module product_manufacturer."""),
- 'module_purchase_double_validation': fields.boolean("Double Validation",
+ 'module_purchase_double_validation': fields.boolean("Two Levels of Approval",
help="""Provide a double validation mechanism for purchases exceeding minimum amount.
This installs the module purchase_double_validation."""),
- 'module_purchase_requisition': fields.boolean("Purchase Requisition",
- help="""When a purchase order is created, you have the opportunity to save the related requisition.
- This object regroups and allows you to keep track and order all your purchase orders.
- This installs the module purchase_requisition."""),
+ 'module_purchase_requisition': fields.boolean("Use Purchase Requisition",
+ help="""Purchase Requisitions are used when you want to request quotations from several suppliers for a given set of products.
+ You can configure per product if you directly do a Request for Quotation
+ to one supplier or if you want a purchase requisition to negotiate with several suppliers."""),
+ 'decimal_precision': fields.integer('Decimal Precision on Price'),
}
_defaults = {
'default_invoice_method': 'manual',
}
+ def get_default_dp(self, cr, uid, fields, context=None):
+ dp = self.pool.get('ir.model.data').get_object(cr,uid, 'product','decimal_purchase')
+ return {'decimal_precision': dp.digits}
+
+ def set_default_dp(self, cr, uid, ids, context=None):
+ config = self.browse(cr, uid, ids[0], context)
+ dp = self.pool.get('ir.model.data').get_object(cr,uid, 'product','decimal_purchase')
+ dp.write({'digits': config.decimal_precision})
+
class account_config_settings(osv.osv_memory):
_inherit = 'account.config.settings'
_columns = {
+ 'module_purchase_analytic_plans': fields.boolean('Several Analytic Accounts on Purchases',
+ help="""This allows install module purchase_analytic_plans."""),
'group_analytic_account_for_purchases': fields.boolean('Analytic Accounting for Purchases',
implied_group='purchase.group_analytic_accounting',
help="Allows you to specify an analytic account on purchase orders."),
diff --git a/addons/purchase/res_config_view.xml b/addons/purchase/res_config_view.xml
index 26d40ac0be0..3d4c96b9587 100644
--- a/addons/purchase/res_config_view.xml
+++ b/addons/purchase/res_config_view.xml
@@ -13,7 +13,8 @@
-
+
+
@@ -39,16 +40,21 @@
+ sequence="3" action="action_purchase_configuration"/>
account settingsaccount.config.settingsform
+
-
+
+ 0
+
+
+
diff --git a/addons/purchase/stock.py b/addons/purchase/stock.py
index 35193dfa07b..06b391513e0 100644
--- a/addons/purchase/stock.py
+++ b/addons/purchase/stock.py
@@ -126,4 +126,13 @@ class stock_partial_picking(osv.osv_memory):
'currency': move.picking_id.purchase_id.pricelist_id.currency_id.id}
return super(stock_partial_picking, self)._product_cost_for_average_update(cr, uid, move)
+# Redefinition of the new field in order to update the model stock.picking.in in the orm
+# FIXME: this is a temporary workaround because of a framework bug (ref: lp996816). It should be removed as soon as
+# the bug is fixed
+class stock_picking_in(osv.osv):
+ _inherit = 'stock.picking.in'
+ _columns = {
+ 'purchase_id': fields.many2one('purchase.order', 'Purchase Order',
+ ondelete='set null', select=True),
+ }
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/purchase/stock_view.xml b/addons/purchase/stock_view.xml
index f29783c67ae..cc414c284db 100644
--- a/addons/purchase/stock_view.xml
+++ b/addons/purchase/stock_view.xml
@@ -19,7 +19,7 @@
-
+
@@ -28,9 +28,9 @@
domain="[('purchase_id', '=', active_id)]"
id="act_purchase_order_2_stock_picking"
name="Receptions"
- res_model="stock.picking"
+ res_model="stock.picking.in"
src_model="purchase.order"
- context="{'default_purchase_id': active_id, 'contact_display': 'partner'}" />
+ context="{'default_purchase_id': active_id, 'contact_display': 'partner', 'default_type': 'in'}" />
@@ -47,28 +47,28 @@
Incoming Picking Inherited
- stock.picking
+ stock.picking.inform
-
+
-
+
-
+
stock.picking.in.search
- stock.picking
+ stock.picking.insearch
-
+
@@ -89,7 +89,7 @@
- form
-
-
+
+
diff --git a/addons/purchase_requisition/purchase_requisition.py b/addons/purchase_requisition/purchase_requisition.py
index 9802c41f69f..8c9c7a67f9a 100644
--- a/addons/purchase_requisition/purchase_requisition.py
+++ b/addons/purchase_requisition/purchase_requisition.py
@@ -175,8 +175,8 @@ class purchase_requisition_line(osv.osv):
_columns = {
'product_id': fields.many2one('product.product', 'Product' ),
- 'product_uom_id': fields.many2one('product.uom', 'Product UoM'),
- 'product_qty': fields.float('Quantity', digits_compute=dp.get_precision('Product UoM')),
+ 'product_uom_id': fields.many2one('product.uom', 'Product Unit of Measure'),
+ 'product_qty': fields.float('Quantity', digits_compute=dp.get_precision('Product Unit of Measure')),
'requisition_id' : fields.many2one('purchase.requisition','Purchase Requisition', ondelete='cascade'),
'company_id': fields.related('requisition_id','company_id',type='many2one',relation='res.company',string='Company', store=True, readonly=True),
}
diff --git a/addons/sale/report/sale_report.py b/addons/sale/report/sale_report.py
index 42e090d54e5..d347da84adc 100644
--- a/addons/sale/report/sale_report.py
+++ b/addons/sale/report/sale_report.py
@@ -38,7 +38,7 @@ class sale_report(osv.osv):
('10', 'October'), ('11', 'November'), ('12', 'December')], 'Month', readonly=True),
'day': fields.char('Day', size=128, readonly=True),
'product_id': fields.many2one('product.product', 'Product', readonly=True),
- 'product_uom': fields.many2one('product.uom', 'UoM', readonly=True),
+ 'product_uom': fields.many2one('product.uom', 'Unit of Measure', readonly=True),
'product_uom_qty': fields.float('# of Qty', readonly=True),
'partner_id': fields.many2one('res.partner', 'Partner', readonly=True),
diff --git a/addons/sale/report/sale_report_view.xml b/addons/sale/report/sale_report_view.xml
index a86df29d56f..a751d92c62a 100644
--- a/addons/sale/report/sale_report_view.xml
+++ b/addons/sale/report/sale_report_view.xml
@@ -99,7 +99,7 @@
-
+
diff --git a/addons/sale/res_config.py b/addons/sale/res_config.py
index 95590f8f0c6..1007107f1a0 100644
--- a/addons/sale/res_config.py
+++ b/addons/sale/res_config.py
@@ -33,7 +33,7 @@ class sale_configuration(osv.osv_memory):
'group_invoice_deli_orders': fields.boolean('Based on Delivery Orders',
implied_group='sale.group_invoice_deli_orders',
help="To allow your salesman to make invoices for Delivery Orders using the menu 'Deliveries to Invoice'."),
- 'task_work': fields.boolean('Based on Tasks\' Work',
+ 'task_work': fields.boolean('Based on Task Activities',
help="""Lets you transfer the entries under tasks defined for Project Management to
the Timesheet line entries for particular date and particular user with the effect of creating, editing and deleting either ways
and to automatically creates project tasks from procurement lines.
@@ -42,13 +42,17 @@ class sale_configuration(osv.osv_memory):
help = """For modifying account analytic view to show important data to project manager of services companies.
You can also view the report of account analytic summary user-wise as well as month wise.
This installs the module account_analytic_analysis."""),
- 'module_account_analytic_analysis': fields.boolean('Manage Contracts',
- help = """This installs the module account_analytic_analysis."""),
+ 'module_account_analytic_analysis': fields.boolean('Manage Customer Contracts',
+ help = """Allows to define your customer contracts conditions: invoicing
+ method (fixed price, on timesheet, advance invoice), the exact pricing
+ (650€/day for a developer), the duration (one year support contract).
+ You will be able to follow the progress of the contract and invoice automatically.
+ It installs the account_analytic_analysis module."""),
'default_order_policy': fields.selection(
[('manual', 'Invoice Based on Sales Orders'), ('picking', 'Invoice Based on Deliveries')],
- 'Main Method Based On', required=True, default_model='sale.order',
+ 'Default Method', default_model='sale.order',
help="You can generate invoices based on sales orders or based on shippings."),
- 'module_delivery': fields.boolean('Charge Delivery Costs',
+ 'module_delivery': fields.boolean('Charge Shipping Cost',
help ="""Allows you to add delivery methods in sale orders and delivery orders.
You can define your own carrier and delivery grids for prices.
This installs the module delivery."""),
@@ -59,7 +63,7 @@ class sale_configuration(osv.osv_memory):
implied_group='product.group_sale_pricelist',
help="""Allows to manage different prices based on rules per category of customers.
Example: 10% for retailers, promotion of 5 EUR on this product, etc."""),
- 'group_uom':fields.boolean("Manage Different UoM for Products",
+ 'group_uom':fields.boolean("Allow Different Units of Measure",
implied_group='product.group_uom',
help="""Allows you to select and maintain different units of measure for products."""),
'group_sale_delivery_address': fields.boolean("Allow Different Addresses for Delivery and Invoice",
@@ -68,13 +72,17 @@ class sale_configuration(osv.osv_memory):
'group_discount_per_so_line': fields.boolean("Discount per Line",
implied_group='sale.group_discount_per_so_line',
help="Allows you to apply some discount per sale order line."),
+ 'group_multiple_shops': fields.boolean("Manage Multiple Shops",
+ implied_group='stock.group_locations',
+ help="This allows to configure and use multiple shops."),
'module_sale_layout': fields.boolean("Notes & Subtotals per Line",
help="""Allows to format sale order lines using notes, separators, titles and subtotals.
This installs the module sale_layout."""),
'module_warning': fields.boolean("Alerts by Products or Customers",
- help="""To raise user specific warning messages on different products used in Sales Orders, Purchase Orders, Invoices and Deliveries.
- This installs the module warning."""),
- 'module_sale_margin': fields.boolean("Display Margins for Users",
+ help="""Allow to configure warnings on products and trigger them when a user wants to sale a given product or a given customer.
+ Example: Product: this product is deprecated, do not purchase more than 5.
+ Supplier: don't forget to ask for an express delivery."""),
+ 'module_sale_margin': fields.boolean("Display Margins on Sale Orders",
help="""This adds the 'Margin' on sales order.
This gives the profitability by calculating the difference between the Unit Price and Cost Price.
This installs the module sale_margin."""),
@@ -82,7 +90,7 @@ class sale_configuration(osv.osv_memory):
help="""Allows you to categorize your sales and deliveries (picking lists) between different journals,
and perform batch operations on journals.
This installs the module sale_journal."""),
- 'module_analytic_user_function': fields.boolean("User Function by Contract",
+ 'module_analytic_user_function': fields.boolean("Assign User Roles per Contract",
help="""Allows you to define what is the default function of a specific user on a given account.
This is mostly used when a user encodes his timesheet. The values are retrieved and the fields are auto-filled.
But the possibility to change these values is still available.
@@ -93,6 +101,7 @@ class sale_configuration(osv.osv_memory):
'module_project_timesheet': fields.boolean("Project Timesheet"),
'module_project_mrp': fields.boolean("Project MRP"),
'module_project': fields.boolean("Project"),
+ 'decimal_precision': fields.integer('Decimal Precision on Price'),
}
def default_get(self, cr, uid, fields, context=None):
@@ -124,6 +133,15 @@ class sale_configuration(osv.osv_memory):
'time_unit': _get_default_time_unit,
}
+ def get_default_dp(self, cr, uid, fields, context=None):
+ dp = self.pool.get('ir.model.data').get_object(cr, uid, 'product','decimal_sale')
+ return {'decimal_precision': dp.digits}
+
+ def set_default_dp(self, cr, uid, ids, context=None):
+ config = self.browse(cr, uid, ids[0], context)
+ dp = self.pool.get('ir.model.data').get_object(cr, uid, 'product','decimal_sale')
+ dp.write({'digits': config.decimal_precision})
+
def set_sale_defaults(self, cr, uid, ids, context=None):
ir_values = self.pool.get('ir.values')
ir_model_data = self.pool.get('ir.model.data')
@@ -166,6 +184,8 @@ class sale_configuration(osv.osv_memory):
class account_config_settings(osv.osv_memory):
_inherit = 'account.config.settings'
_columns = {
+ 'module_sale_analytic_plans': fields.boolean('Several Analytic Accounts on Sales',
+ help="""This allows install module sale_analytic_plans."""),
'group_analytic_account_for_sales': fields.boolean('Analytic Accounting for Sales',
implied_group='sale.group_analytic_accounting',
help="Allows you to specify an analytic account on sale orders."),
diff --git a/addons/sale/res_config_view.xml b/addons/sale/res_config_view.xml
index 5c64121038b..fa8aa2baa8e 100644
--- a/addons/sale/res_config_view.xml
+++ b/addons/sale/res_config_view.xml
@@ -9,17 +9,16 @@
-
+
+
+
-
+
-
-
-
+
+
+
-
-
+
+
-
+
account settingsaccount.config.settingsform
+
-
+
+ 0
+
+
+
diff --git a/addons/sale/sale.py b/addons/sale/sale.py
index c2ee42b6fca..5144cb91402 100644
--- a/addons/sale/sale.py
+++ b/addons/sale/sale.py
@@ -238,7 +238,7 @@ class sale_order(osv.osv):
'order_line': fields.one2many('sale.order.line', 'order_id', 'Order Lines', readonly=True, states={'draft': [('readonly', False)]}),
'invoice_ids': fields.many2many('account.invoice', 'sale_order_invoice_rel', 'order_id', 'invoice_id', 'Invoices', readonly=True, help="This is the list of invoices that have been generated for this sales order. The same sales order may have been invoiced in several times (by line for example)."),
- 'picking_ids': fields.one2many('stock.picking', 'sale_id', 'Related Picking', readonly=True, help="This is a list of picking that has been generated for this sales order."),
+ 'picking_ids': fields.one2many('stock.picking.out', 'sale_id', 'Related Picking', readonly=True, help="This is a list of delivery orders that has been generated for this sales order."),
'shipped': fields.boolean('Delivered', readonly=True, help="It indicates that the sales order has been delivered. This field is updated only after the scheduler(s) have been launched."),
'picked_rate': fields.function(_picked_rate, string='Picked', type='float'),
'invoiced_rate': fields.function(_invoiced_rate, string='Invoiced', type='float'),
@@ -1015,7 +1015,7 @@ class sale_order_line(osv.osv):
help="If 'on order', it triggers a procurement when the sale order is confirmed to create a task, purchase order or manufacturing order linked to this sale order line."),
'property_ids': fields.many2many('mrp.property', 'sale_order_line_property_rel', 'order_id', 'property_id', 'Properties', readonly=True, states={'draft': [('readonly', False)]}),
'address_allotment_id': fields.many2one('res.partner', 'Allotment Partner'),
- 'product_uom_qty': fields.float('Quantity (UoM)', digits_compute= dp.get_precision('Product UoS'), required=True, readonly=True, states={'draft': [('readonly', False)]}),
+ 'product_uom_qty': fields.float('Quantity (Unit of Measure)', digits_compute= dp.get_precision('Product UoS'), required=True, readonly=True, states={'draft': [('readonly', False)]}),
'product_uom': fields.many2one('product.uom', 'Unit of Measure ', required=True, readonly=True, states={'draft': [('readonly', False)]}),
'product_uos_qty': fields.float('Quantity (UoS)' ,digits_compute= dp.get_precision('Product UoS'), readonly=True, states={'draft': [('readonly', False)]}),
'product_uos': fields.many2one('product.uom', 'Product UoS'),
diff --git a/addons/sale/sale_view.xml b/addons/sale/sale_view.xml
index 5d3b7c75050..308f1034920 100644
--- a/addons/sale/sale_view.xml
+++ b/addons/sale/sale_view.xml
@@ -42,7 +42,8 @@
If you have more than one shop reselling your company products, you can create and manage that from here. Whenever you will record a new quotation or sales order, it has to be linked to a shop. The shop also defines the warehouse from which the products will be delivered for each particular sales.
-
+
sale.order.calendar
@@ -195,8 +196,8 @@
-
-
+
+
@@ -242,8 +243,21 @@
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -365,7 +379,7 @@
-
+
diff --git a/addons/sale/stock.py b/addons/sale/stock.py
index 44b993ec0e1..83cd8f89e11 100644
--- a/addons/sale/stock.py
+++ b/addons/sale/stock.py
@@ -186,4 +186,13 @@ class stock_picking(osv.osv):
})
return result
+# Redefinition of the new field in order to update the model stock.picking.out in the orm
+# FIXME: this is a temporary workaround because of a framework bug (ref: lp996816). It should be removed as soon as
+# the bug is fixed
+class stock_picking_out(osv.osv):
+ _inherit = 'stock.picking.out'
+ _columns = {
+ 'sale_id': fields.many2one('sale.order', 'Sale Order',
+ ondelete='set null', select=True),
+ }
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/sale_analytic_plans/sale_analytic_plans_view.xml b/addons/sale_analytic_plans/sale_analytic_plans_view.xml
index 743bbcb48d9..2d4ff082288 100644
--- a/addons/sale_analytic_plans/sale_analytic_plans_view.xml
+++ b/addons/sale_analytic_plans/sale_analytic_plans_view.xml
@@ -18,7 +18,7 @@
form
-
+
diff --git a/addons/sale_layout/sale_layout.py b/addons/sale_layout/sale_layout.py
index 15531e76e1d..9e2052b134c 100644
--- a/addons/sale_layout/sale_layout.py
+++ b/addons/sale_layout/sale_layout.py
@@ -120,8 +120,8 @@ class sale_order_line(osv.osv):
,'Line Type', select=True, required=True),
'sequence': fields.integer('Line Sequence', select=True),
'price_unit': fields.float('Unit Price', required=True, digits_compute= dp.get_precision('Sale Price'), readonly=True, states={'draft': [('readonly', False)]}),
- 'product_uom_qty': fields.float('Quantity (UoM)', digits=(16,2)),
- 'product_uom': fields.many2one('product.uom', 'Product UoM'),
+ 'product_uom_qty': fields.float('Quantity (Unit of Measure)', digits=(16,2)),
+ 'product_uom': fields.many2one('product.uom', 'Product Unit of Measure'),
# Override the field to call the overridden _amount_line function
'price_subtotal': fields.function(_amount_line, method=True, string='Subtotal', digits_compute= dp.get_precision('Sale Price')),
}
diff --git a/addons/sale_layout/sale_layout_view.xml b/addons/sale_layout/sale_layout_view.xml
index 4c4300b497f..8b7a7b09764 100644
--- a/addons/sale_layout/sale_layout_view.xml
+++ b/addons/sale_layout/sale_layout_view.xml
@@ -98,7 +98,7 @@
-
+
diff --git a/addons/stock/__openerp__.py b/addons/stock/__openerp__.py
index 88ddead6645..102d54ae9ed 100644
--- a/addons/stock/__openerp__.py
+++ b/addons/stock/__openerp__.py
@@ -72,8 +72,8 @@ Thanks to the double entry management, the inventory controlling is powerful and
'wizard/stock_return_picking_view.xml',
"stock_workflow.xml",
"stock_incoterms.xml",
- "stock_view.xml",
"stock_report.xml",
+ "stock_view.xml",
"stock_sequence.xml",
"product_data.xml",
"product_view.xml",
diff --git a/addons/stock/product.py b/addons/stock/product.py
index 304fa8dcd87..e7838bb490a 100644
--- a/addons/stock/product.py
+++ b/addons/stock/product.py
@@ -332,7 +332,7 @@ class product_product(osv.osv):
_columns = {
'qty_available': fields.function(_product_available, multi='qty_available',
- type='float', digits_compute=dp.get_precision('Product UoM'),
+ type='float', digits_compute=dp.get_precision('Product Unit of Measure'),
string='Quantity On Hand',
help="Current quantity of products.\n"
"In a context with a single Stock Location, this includes "
@@ -346,7 +346,7 @@ class product_product(osv.osv):
"Otherwise, this includes goods stored in any Stock Location "
"typed as 'internal'."),
'virtual_available': fields.function(_product_available, multi='qty_available',
- type='float', digits_compute=dp.get_precision('Product UoM'),
+ type='float', digits_compute=dp.get_precision('Product Unit of Measure'),
string='Quantity Available',
help="Forecast quantity (computed as Quantity On Hand "
"- Outgoing + Incoming)\n"
@@ -361,7 +361,7 @@ class product_product(osv.osv):
"Otherwise, this includes goods stored in any Stock Location "
"typed as 'internal'."),
'incoming_qty': fields.function(_product_available, multi='qty_available',
- type='float', digits_compute=dp.get_precision('Product UoM'),
+ type='float', digits_compute=dp.get_precision('Product Unit of Measure'),
string='Incoming',
help="Quantity of products that are planned to arrive.\n"
"In a context with a single Stock Location, this includes "
@@ -375,7 +375,7 @@ class product_product(osv.osv):
"Otherwise, this includes goods arriving to any Stock "
"Location typed as 'internal'."),
'outgoing_qty': fields.function(_product_available, multi='qty_available',
- type='float', digits_compute=dp.get_precision('Product UoM'),
+ type='float', digits_compute=dp.get_precision('Product Unit of Measure'),
string='Outgoing',
help="Quantity of products that are planned to leave.\n"
"In a context with a single Stock Location, this includes "
@@ -388,9 +388,9 @@ class product_product(osv.osv):
"Shop, or any of its children.\n"
"Otherwise, this includes goods leaving from any Stock "
"Location typed as 'internal'."),
- 'track_production': fields.boolean('Track Manufacturing Lots', help="Forces to specify a Production Lot for all moves containing this product and generated by a Manufacturing Order"),
- 'track_incoming': fields.boolean('Track Incoming Lots', help="Forces to specify a Production Lot for all moves containing this product and coming from a Supplier Location"),
- 'track_outgoing': fields.boolean('Track Outgoing Lots', help="Forces to specify a Production Lot for all moves containing this product and going to a Customer Location"),
+ 'track_production': fields.boolean('Track Manufacturing Lots', help="Forces to specify a Serial Number for all moves containing this product and generated by a Manufacturing Order"),
+ 'track_incoming': fields.boolean('Track Incoming Lots', help="Forces to specify a Serial Number for all moves containing this product and coming from a Supplier Location"),
+ 'track_outgoing': fields.boolean('Track Outgoing Lots', help="Forces to specify a Serial Number for all moves containing this product and going to a Customer Location"),
'location_id': fields.dummy(string='Location', relation='stock.location', type='many2one'),
'warehouse_id': fields.dummy(string='Warehouse', relation='stock.warehouse', type='many2one'),
'valuation':fields.selection([('manual_periodic', 'Periodical (manual)'),
diff --git a/addons/stock/report/picking.rml b/addons/stock/report/picking.rml
index 63706a940e6..707ba3646d2 100644
--- a/addons/stock/report/picking.rml
+++ b/addons/stock/report/picking.rml
@@ -1,6 +1,6 @@
-
+
@@ -31,7 +31,6 @@
-
@@ -52,14 +51,12 @@
-
-
@@ -161,7 +158,9 @@
- Shipping Address :
+ Supplier Address : [[ (picking.type == 'in' or removeParentNode('para')) and '' ]]
+ Customer Address : [[ (picking.type == 'out' or removeParentNode('para')) and '' ]]
+ Warehouse Address : [[ (picking.type == 'internal' or removeParentNode('para')) and '' ]][[ (picking.partner_id and picking.partner_id.id and picking.partner_id.title.name) or '' ]] [[ picking.partner_id and picking.partner_id.id and picking.partner_id.name ]][[ picking.partner_id and display_address(picking.partner_id,'delivery') ]]
@@ -181,16 +180,16 @@
- Packing List: [[ (picking.type == 'out' or removeParentNode('para')) and '' ]] [[ picking.name ]]
- Reception: [[ (picking.type == 'in' or removeParentNode('para')) and '' ]] [[ picking.name ]]
- Picking List: [[ (picking.type == 'internal' or removeParentNode('para')) and '' ]] [[ picking.name ]]
+ Delivery Order : [[ (picking.type == 'out' or removeParentNode('para')) and '' ]] [[ picking.name ]]
+ Incoming Shipment : [[ (picking.type == 'in' or removeParentNode('para')) and '' ]] [[ picking.name ]]
+ Internal Shipment : [[ (picking.type == 'internal' or removeParentNode('para')) and '' ]] [[ picking.name ]]
-
+
Journal
@@ -209,7 +208,7 @@
-
+
[[ picking.stock_journal_id.name]]
@@ -240,7 +239,7 @@
Lot
- State
+ State
Location
@@ -287,7 +286,9 @@
[[ (move_lines.prodlot_id and move_lines.prodlot_id.name) or '' ]]
- [[ move_lines.state ]]
+ [[ (picking.type == 'in' or removeParentNode('para')) ]][[ move_lines.state == 'done' and 'Received' or move_lines.state]]
+ [[ (picking.type == 'out' or removeParentNode('para')) ]][[ move_lines.state == 'done' and 'Delivered' or move_lines.state]]
+ [[ (picking.type == 'internal' or removeParentNode('para')) ]][[ move_lines.state == 'done' and 'Transferred' or move_lines.state]]
[[ (move_lines.location_id and move_lines.location_id.name) or '' ]]
diff --git a/addons/stock/report/report_stock.py b/addons/stock/report/report_stock.py
index 37e4f28c858..e16b7ca6e6d 100644
--- a/addons/stock/report/report_stock.py
+++ b/addons/stock/report/report_stock.py
@@ -26,13 +26,13 @@ from tools.sql import drop_view_if_exists
class stock_report_prodlots(osv.osv):
_name = "stock.report.prodlots"
- _description = "Stock report by production lots"
+ _description = "Stock report by serial number"
_auto = False
_columns = {
'qty': fields.float('Quantity', readonly=True),
'location_id': fields.many2one('stock.location', 'Location', readonly=True, select=True),
'product_id': fields.many2one('product.product', 'Product', readonly=True, select=True),
- 'prodlot_id': fields.many2one('stock.production.lot', 'Production lot', readonly=True, select=True),
+ 'prodlot_id': fields.many2one('stock.production.lot', 'Serial Number', readonly=True, select=True),
}
def init(self, cr):
@@ -82,13 +82,13 @@ stock_report_prodlots()
class stock_report_tracklots(osv.osv):
_name = "stock.report.tracklots"
- _description = "Stock report by tracking lots"
+ _description = "Stock report by logistic serial number"
_auto = False
_columns = {
'name': fields.float('Quantity', readonly=True),
'location_id': fields.many2one('stock.location', 'Location', readonly=True, select=True),
'product_id': fields.many2one('product.product', 'Product', readonly=True, select=True),
- 'tracking_id': fields.many2one('stock.tracking', 'Tracking lot', readonly=True, select=True),
+ 'tracking_id': fields.many2one('stock.tracking', 'Logistic Serial Number', readonly=True, select=True),
}
def init(self, cr):
diff --git a/addons/stock/report/report_stock_move.py b/addons/stock/report/report_stock_move.py
index da6be7873c3..4d2d522d385 100644
--- a/addons/stock/report/report_stock_move.py
+++ b/addons/stock/report/report_stock_move.py
@@ -38,7 +38,7 @@ class report_stock_move(osv.osv):
'partner_id':fields.many2one('res.partner', 'Partner', readonly=True),
'product_id':fields.many2one('product.product', 'Product', readonly=True),
'company_id':fields.many2one('res.company', 'Company', readonly=True),
- 'picking_id':fields.many2one('stock.picking', 'Packing', readonly=True),
+ 'picking_id':fields.many2one('stock.picking', 'Shipment', readonly=True),
'type': fields.selection([('out', 'Sending Goods'), ('in', 'Getting Goods'), ('internal', 'Internal'), ('other', 'Others')], 'Shipping Type', required=True, select=True, help="Shipping type specify, goods coming in or going out."),
'location_id': fields.many2one('stock.location', 'Source Location', readonly=True, select=True, help="Sets a location if you produce at a fixed location. This can be a partner location if you subcontract the manufacturing operations."),
'location_dest_id': fields.many2one('stock.location', 'Dest. Location', readonly=True, select=True, help="Location where the system will stock the finished products."),
@@ -160,7 +160,7 @@ class report_stock_inventory(osv.osv):
'location_id': fields.many2one('stock.location', 'Location', readonly=True),
'prodlot_id': fields.many2one('stock.production.lot', 'Lot', readonly=True),
'company_id': fields.many2one('res.company', 'Company', readonly=True),
- 'product_qty':fields.float('Quantity', digits_compute=dp.get_precision('Product UoM'), readonly=True),
+ 'product_qty':fields.float('Quantity', digits_compute=dp.get_precision('Product Unit of Measure'), readonly=True),
'value' : fields.float('Total Value', digits_compute=dp.get_precision('Account'), required=True),
'state': fields.selection([('draft', 'Draft'), ('waiting', 'Waiting'), ('confirmed', 'Confirmed'), ('assigned', 'Available'), ('done', 'Done'), ('cancel', 'Cancelled')], 'State', readonly=True, select=True,
help='When the stock move is created it is in the \'Draft\' state.\n After that it is set to \'Confirmed\' state.\n If stock is available state is set to \'Avaiable\'.\n When the picking it done the state is \'Done\'.\
diff --git a/addons/stock/report/report_stock_move_view.xml b/addons/stock/report/report_stock_move_view.xml
index 01ef4a70289..967ac202d2e 100644
--- a/addons/stock/report/report_stock_move_view.xml
+++ b/addons/stock/report/report_stock_move_view.xml
@@ -117,7 +117,7 @@
-
+
diff --git a/addons/stock/res_config.py b/addons/stock/res_config.py
index 0113149278c..7e18809fc1a 100644
--- a/addons/stock/res_config.py
+++ b/addons/stock/res_config.py
@@ -26,21 +26,15 @@ class stock_config_settings(osv.osv_memory):
_inherit = 'res.config.settings'
_columns = {
- 'module_stock_no_autopicking': fields.boolean("Force Picking before Manufactoring Orders",
- help="""This module allows an intermediate picking process to provide raw materials to production orders.
- For example to manage production made by your suppliers (sub-contracting).
- To achieve this, set the assembled product which is sub-contracted to "No Auto-Picking"
- and put the location of the supplier in the routing of the assembly operation.
- This installs the module stock_no_autopicking."""),
- 'module_claim_from_delivery': fields.boolean("Track Claims from Delivery",
+ 'module_claim_from_delivery': fields.boolean("Allow Claims on Delivery Orders",
help="""Adds a Claim link to the delivery order.
This installs the module claim_from_delivery."""),
- 'module_stock_invoice_directly': fields.boolean("Invoice Picking on Delivery",
+ 'module_stock_invoice_directly': fields.boolean("Invoice Directly from the Picking",
help="""This allows to automatically launch the invoicing wizard if the delivery is
to be invoiced when you send or deliver goods.
This installs the module stock_invoice_directly."""),
'module_product_expiry': fields.boolean("Expiry Date on Lots",
- help="""Track different dates on products and production lots.
+ help="""Track different dates on products and serial numbers.
The following dates can be tracked:
- end of life
- best before date
@@ -52,10 +46,10 @@ class stock_config_settings(osv.osv_memory):
manage product manufacturing chains, manage default locations per product,
define routes within your warehouse according to business needs, etc.
This installs the module stock_location."""),
- 'group_uom': fields.boolean("Manage Different UoM for Products",
+ 'group_uom': fields.boolean("Manage Different Units of Measure for Products",
implied_group='product.group_uom',
help="""Allows you to select and maintain different units of measure for products."""),
- 'group_uos': fields.boolean("Manage Secondary UoM (for Sale)",
+ 'group_uos': fields.boolean("Manage Secondary Unit of Measure (for Sale)",
implied_group='product.group_uos',
help="""Allows you to sell units of a product, but invoice based on a different unit of measure.
For instance, you can sell pieces of meat that you invoice based on their weight."""),
@@ -66,16 +60,29 @@ class stock_config_settings(osv.osv_memory):
implied_group='stock.group_production_lot',
help="""This allows you to manage products by using serial numbers.
When you select a lot, you can get the upstream or downstream traceability of the products contained in lot."""),
- 'group_stock_tracking_lot': fields.boolean("Serial Numbers on Pallets (Logistic Units)",
+ 'group_stock_tracking_lot': fields.boolean("Serial Numbers on Logistic Units (Pallets)",
implied_group='stock.group_tracking_lot',
help="""Allows you to get the upstream or downstream traceability of the products contained in lot."""),
- 'group_stock_inventory_valuation': fields.boolean("Accounting Entries per Stock Movement",
+ 'group_stock_inventory_valuation': fields.boolean("Generate Accounting Entries per Stock Movement",
implied_group='stock.group_inventory_valuation',
- help="""This allows to split stock inventory lines according to production lots."""),
+ help="""This allows to split stock inventory lines according to serial numbers."""),
'group_stock_multiple_locations': fields.boolean("Manage Multiple Locations and Warehouses",
implied_group='stock.group_locations',
help="""This allows to configure and use multiple stock locations and warehouses,
instead of having a single default one."""),
+ 'group_product_variant': fields.boolean("Product Variant",
+ implied_group='product.group_product_variant',
+ help="""This allows to configure and use Product Variant."""),
+ 'decimal_precision': fields.integer('Decimal Precision on Weight'),
}
+ def get_default_dp(self, cr, uid, fields, context=None):
+ dp = self.pool.get('ir.model.data').get_object(cr, uid, 'product', 'decimal_stock_weight')
+ return {'decimal_precision': dp.digits}
+
+ def set_default_dp(self, cr, uid, ids, context=None):
+ config = self.browse(cr, uid, ids[0], context)
+ dp = self.pool.get('ir.model.data').get_object(cr, uid, 'product', 'decimal_stock_weight')
+ dp.write({'digits': config.decimal_precision})
+
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/stock/res_config_view.xml b/addons/stock/res_config_view.xml
index 0e43f2ad8bf..e760c453585 100644
--- a/addons/stock/res_config_view.xml
+++ b/addons/stock/res_config_view.xml
@@ -16,21 +16,22 @@
+ attrs="{'invisible': [('group_stock_production_lot','=',False)]}"/>
-
+
+
@@ -48,7 +49,7 @@
+ sequence="5" action="action_stock_config_settings"/>
diff --git a/addons/stock/security/stock_security.xml b/addons/stock/security/stock_security.xml
index a9653ffa81e..c9f8a03a378 100644
--- a/addons/stock/security/stock_security.xml
+++ b/addons/stock/security/stock_security.xml
@@ -14,12 +14,12 @@
- Manage Production Lots
+ Manage Serial Numbers
- Manage Tracking lots
+ Manage Logistic Serial Numbers
diff --git a/addons/stock/stock.py b/addons/stock/stock.py
index dee8e2a6c25..ef968bc77e7 100644
--- a/addons/stock/stock.py
+++ b/addons/stock/stock.py
@@ -19,6 +19,7 @@
#
##############################################################################
+from lxml import etree
from datetime import datetime
from dateutil.relativedelta import relativedelta
import time
@@ -605,7 +606,7 @@ class stock_picking(osv.osv):
res[pick]['min_date'] = dt1
res[pick]['max_date'] = dt2
return res
-
+
def create(self, cr, user, vals, context=None):
if ('name' not in vals) or (vals.get('name')=='/'):
seq_obj_name = 'stock.picking.' + vals['type']
@@ -616,52 +617,52 @@ class stock_picking(osv.osv):
return new_id
_columns = {
- 'name': fields.char('Reference', size=64, select=True),
- 'origin': fields.char('Origin', size=64, help="Reference of the document that produced this picking.", select=True),
- 'backorder_id': fields.many2one('stock.picking', 'Back Order of', help="If this picking was split this field links to the picking that contains the other part that has been processed already.", select=True),
- 'type': fields.selection([('out', 'Sending Goods'), ('in', 'Getting Goods'), ('internal', 'Internal')], 'Shipping Type', required=True, select=True, help="Shipping type specify, goods coming in or going out."),
- 'note': fields.text('Notes'),
- 'stock_journal_id': fields.many2one('stock.journal','Stock Journal', select=True),
- 'location_id': fields.many2one('stock.location', 'Location', help="Keep empty if you produce at the location where the finished products are needed." \
+ 'name': fields.char('Reference', size=64, select=True, states={'done':[('readonly', True)], 'cancel':[('readonly',True)]}),
+ 'origin': fields.char('Origin', size=64, states={'done':[('readonly', True)], 'cancel':[('readonly',True)]}, help="Reference of the document", select=True),
+ 'backorder_id': fields.many2one('stock.picking', 'Back Order of', states={'done':[('readonly', True)], 'cancel':[('readonly',True)]}, help="If this shipment was split, then this field links to the shipment which contains the already processed part.", select=True),
+ 'type': fields.selection([('out', 'Sending Goods'), ('in', 'Getting Goods'), ('internal', 'Internal')], 'Shipping Type', required=True, select=True, states={'done':[('readonly', True)], 'cancel':[('readonly',True)]}, help="Shipping type specify, goods coming in or going out."),
+ 'note': fields.text('Notes', states={'done':[('readonly', True)], 'cancel':[('readonly',True)]}),
+ 'stock_journal_id': fields.many2one('stock.journal','Stock Journal', select=True, states={'done':[('readonly', True)], 'cancel':[('readonly',True)]}),
+ 'location_id': fields.many2one('stock.location', 'Location', states={'done':[('readonly', True)], 'cancel':[('readonly',True)]}, help="Keep empty if you produce at the location where the finished products are needed." \
"Set a location if you produce at a fixed location. This can be a partner location " \
"if you subcontract the manufacturing operations.", select=True),
- 'location_dest_id': fields.many2one('stock.location', 'Dest. Location',help="Location where the system will stock the finished products.", select=True),
- 'move_type': fields.selection([('direct', 'Partial Delivery'), ('one', 'All at once')], 'Delivery Method', required=True, help="It specifies goods to be delivered all at once or by direct delivery"),
+ 'location_dest_id': fields.many2one('stock.location', 'Dest. Location', states={'done':[('readonly', True)], 'cancel':[('readonly',True)]}, help="Location where the system will stock the finished products.", select=True),
+ 'move_type': fields.selection([('direct', 'Partial'), ('one', 'All at once')], 'Delivery Method', required=True, states={'done':[('readonly', True)], 'cancel':[('readonly',True)]}, help="It specifies goods to be deliver partially or all at once"),
'state': fields.selection([
- ('draft', 'New'),
+ ('draft', 'Draft'),
('auto', 'Waiting Another Operation'),
('confirmed', 'Waiting Availability'),
- ('assigned', 'Ready to Process'),
- ('done', 'Done'),
- ('cancel', 'Cancelled'),
- ], 'State', readonly=True, select=True,
- help="* Draft: not confirmed yet and will not be scheduled until confirmed\n"\
- "* Confirmed: still waiting for the availability of products\n"\
- "* Available: products reserved, simply waiting for confirmation.\n"\
- "* Waiting: waiting for another move to proceed before it becomes automatically available (e.g. in Make-To-Order flows)\n"\
- "* Done: has been processed, can't be modified or cancelled anymore\n"\
- "* Cancelled: has been cancelled, can't be confirmed anymore"),
+ ('assigned', 'Ready to Transfer'),
+ ('done', 'Transferred'),
+ ('cancel', 'Cancelled'),], 'State', readonly=True, select=True, help="""
+ * Draft: not confirmed yet and will not be scheduled until confirmed\n
+ * Waiting Another Operation: waiting for another move to proceed before it becomes automatically available (e.g. in Make-To-Order flows)\n
+ * Waiting Availability: still waiting for the availability of products\n
+ * Ready to Transfer: products reserved, simply waiting for confirmation.\n
+ * Transferred: has been processed, can't be modified or cancelled anymore\n
+ * Cancelled: has been cancelled, can't be confirmed anymore"""
+ ),
'min_date': fields.function(get_min_max_date, fnct_inv=_set_minimum_date, multi="min_max_date",
- store=True, type='datetime', string='Expected Date', select=1, help="Expected date for the picking to be processed"),
- 'date': fields.datetime('Order Date', help="Date of Order", select=True),
- 'date_done': fields.datetime('Date Done', help="Date of Completion"),
+ store=True, type='datetime', string='Scheduled Date', select=1, help="Scheduled date for the shipment to be processed"),
+ 'date': fields.datetime('Order Date', help="Date of order", select=True, states={'done':[('readonly', True)], 'cancel':[('readonly',True)]}),
+ 'date_done': fields.datetime('Date Done', help="Date of Completion", states={'done':[('readonly', True)], 'cancel':[('readonly',True)]}),
'max_date': fields.function(get_min_max_date, fnct_inv=_set_maximum_date, multi="min_max_date",
store=True, type='datetime', string='Max. Expected Date', select=2),
'move_lines': fields.one2many('stock.move', 'picking_id', 'Internal Moves', states={'done': [('readonly', True)], 'cancel': [('readonly', True)]}),
- 'auto_picking': fields.boolean('Auto-Picking'),
- 'partner_id': fields.many2one('res.partner', 'Partner'),
+ 'auto_picking': fields.boolean('Auto-Picking', states={'done':[('readonly', True)], 'cancel':[('readonly',True)]}),
+ 'partner_id': fields.many2one('res.partner', 'Partner', states={'done':[('readonly', True)], 'cancel':[('readonly',True)]}),
'invoice_state': fields.selection([
("invoiced", "Invoiced"),
("2binvoiced", "To Be Invoiced"),
("none", "Not Applicable")], "Invoice Control",
select=True, required=True, readonly=True, states={'draft': [('readonly', False)]}),
- 'company_id': fields.many2one('res.company', 'Company', required=True, select=True),
+ 'company_id': fields.many2one('res.company', 'Company', required=True, select=True, states={'done':[('readonly', True)], 'cancel':[('readonly',True)]}),
}
_defaults = {
'name': lambda self, cr, uid, context: '/',
'state': 'draft',
'move_type': 'direct',
- 'type': 'in',
+ 'type': 'internal',
'invoice_state': 'none',
'date': lambda *a: time.strftime('%Y-%m-%d %H:%M:%S'),
'company_id': lambda self, cr, uid, c: self.pool.get('res.company')._company_default_get(cr, uid, 'stock.picking', context=c)
@@ -671,21 +672,14 @@ class stock_picking(osv.osv):
]
def action_process(self, cr, uid, ids, context=None):
- if context is None: context = {}
- context = dict(context, active_ids=ids, active_model=self._name)
- partial_id = self.pool.get("stock.partial.picking").create(cr, uid, {}, context=context)
return {
- 'name':_("Products to Process"),
- 'view_mode': 'form',
- 'view_id': False,
'view_type': 'form',
+ 'view_mode': 'form',
'res_model': 'stock.partial.picking',
- 'res_id': partial_id,
'type': 'ir.actions.act_window',
- 'nodestroy': True,
'target': 'new',
- 'domain': '[]',
'context': context,
+ 'nodestroy': True,
}
def copy(self, cr, uid, id, default=None, context=None):
@@ -740,6 +734,9 @@ class stock_picking(osv.osv):
@return: True
"""
for pick in self.browse(cr, uid, ids):
+ if pick.state == 'draft':
+ wf_service = netsvc.LocalService("workflow")
+ wf_service.trg_validate(uid, 'stock.picking', pick.id, 'button_confirm', cr)
move_ids = [x.id for x in pick.move_lines if x.state == 'confirmed']
if not move_ids:
raise osv.except_osv(_('Warning !'),_('Not enough stock, unable to reserve the products.'))
@@ -821,6 +818,10 @@ class stock_picking(osv.osv):
ok = True
for pick in self.browse(cr, uid, ids):
mt = pick.move_type
+ # incomming shipments are always set as available if they aren't chained
+ if pick.type == 'in':
+ if all([x.state != 'waiting' for x in pick.move_lines]):
+ return True
for move in pick.move_lines:
if (move.state in ('confirmed', 'draft')) and (mt == 'one'):
return False
@@ -873,7 +874,7 @@ class stock_picking(osv.osv):
def _get_partner_to_invoice(self, cr, uid, picking, context=None):
""" Gets the partner that will be invoiced
- Note that this function is inherited in the sale module
+ Note that this function is inherited in the sale and purchase modules
@param picking: object of the picking for which we are selecting the partner to invoice
@return: object of the partner to invoice
"""
@@ -1430,7 +1431,7 @@ class stock_production_lot(osv.osv):
return self.name_get(cr, uid, ids, context)
_name = 'stock.production.lot'
- _description = 'Production lot'
+ _description = 'Serial Number'
def _get_stock(self, cr, uid, ids, field_name, arg, context=None):
""" Gets stock of products for locations
@@ -1477,17 +1478,17 @@ class stock_production_lot(osv.osv):
return ids
_columns = {
- 'name': fields.char('Production Lot', size=64, required=True, help="Unique production lot, will be displayed as: PREFIX/SERIAL [INT_REF]"),
+ 'name': fields.char('Serial Number', size=64, required=True, help="Unique Serial Number, will be displayed as: PREFIX/SERIAL [INT_REF]"),
'ref': fields.char('Internal Reference', size=256, help="Internal reference number in case it differs from the manufacturer's serial number"),
'prefix': fields.char('Prefix', size=64, help="Optional prefix to prepend when displaying this serial number: PREFIX/SERIAL [INT_REF]"),
'product_id': fields.many2one('product.product', 'Product', required=True, domain=[('type', '<>', 'service')]),
'date': fields.datetime('Creation Date', required=True),
'stock_available': fields.function(_get_stock, fnct_search=_stock_search, type="float", string="Available", select=True,
help="Current quantity of products with this Production Lot Number available in company warehouses",
- digits_compute=dp.get_precision('Product UoM')),
+ digits_compute=dp.get_precision('Product Unit of Measure')),
'revisions': fields.one2many('stock.production.lot.revision', 'lot_id', 'Revisions'),
'company_id': fields.many2one('res.company', 'Company', select=True),
- 'move_ids': fields.one2many('stock.move', 'prodlot_id', 'Moves for this production lot', readonly=True),
+ 'move_ids': fields.one2many('stock.move', 'prodlot_id', 'Moves for this serial number', readonly=True),
}
_defaults = {
'date': lambda *a: time.strftime('%Y-%m-%d %H:%M:%S'),
@@ -1512,7 +1513,7 @@ stock_production_lot()
class stock_production_lot_revision(osv.osv):
_name = 'stock.production.lot.revision'
- _description = 'Production lot revisions'
+ _description = 'Serial Number Revision'
_columns = {
'name': fields.char('Revision Name', size=64, required=True),
@@ -1520,7 +1521,7 @@ class stock_production_lot_revision(osv.osv):
'date': fields.date('Revision Date'),
'indice': fields.char('Revision Number', size=16),
'author_id': fields.many2one('res.users', 'Author'),
- 'lot_id': fields.many2one('stock.production.lot', 'Production lot', select=True, ondelete='cascade'),
+ 'lot_id': fields.many2one('stock.production.lot', 'Serial Number', select=True, ondelete='cascade'),
'company_id': fields.related('lot_id','company_id',type='many2one',relation='res.company',string='Company', store=True, readonly=True),
}
@@ -1578,7 +1579,7 @@ class stock_move(osv.osv):
return res
def _check_tracking(self, cr, uid, ids, context=None):
- """ Checks if production lot is assigned to stock move or not.
+ """ Checks if serial number is assigned to stock move or not.
@return: True or False
"""
for move in self.browse(cr, uid, ids, context=context):
@@ -1610,9 +1611,9 @@ class stock_move(osv.osv):
'date_expected': fields.datetime('Scheduled Date', states={'done': [('readonly', True)]},required=True, select=True, help="Scheduled date for the processing of this move"),
'product_id': fields.many2one('product.product', 'Product', required=True, select=True, domain=[('type','<>','service')],states={'done': [('readonly', True)]}),
- 'product_qty': fields.float('Quantity', digits_compute=dp.get_precision('Product UoM'), required=True,states={'done': [('readonly', True)]}),
+ 'product_qty': fields.float('Quantity', digits_compute=dp.get_precision('Product Unit of Measure'), required=True,states={'done': [('readonly', True)]}),
'product_uom': fields.many2one('product.uom', 'Unit of Measure', required=True,states={'done': [('readonly', True)]}),
- 'product_uos_qty': fields.float('Quantity (UOS)', digits_compute=dp.get_precision('Product UoM'), states={'done': [('readonly', True)]}),
+ 'product_uos_qty': fields.float('Quantity (UOS)', digits_compute=dp.get_precision('Product Unit of Measure'), states={'done': [('readonly', True)]}),
'product_uos': fields.many2one('product.uom', 'Product UOS', states={'done': [('readonly', True)]}),
'product_packaging': fields.many2one('product.packaging', 'Packaging', help="It specifies attributes of packaging like type, quantity of packaging,etc."),
@@ -1620,7 +1621,7 @@ class stock_move(osv.osv):
'location_dest_id': fields.many2one('stock.location', 'Destination Location', required=True,states={'done': [('readonly', True)]}, select=True, help="Location where the system will stock the finished products."),
'partner_id': fields.many2one('res.partner', 'Destination Address ', states={'done': [('readonly', True)]}, help="Optional address where goods are to be delivered, specifically used for allotment"),
- 'prodlot_id': fields.many2one('stock.production.lot', 'Production Lot', states={'done': [('readonly', True)]}, help="Production lot is used to put a serial number on the production", select=True),
+ 'prodlot_id': fields.many2one('stock.production.lot', 'Serial Number', states={'done': [('readonly', True)]}, help="Serial number is used to put a serial number on the production", select=True),
'tracking_id': fields.many2one('stock.tracking', 'Pack', select=True, states={'done': [('readonly', True)]}, help="Logistical shipping unit: pallet, box, pack ..."),
'auto_validate': fields.boolean('Auto Validate'),
@@ -1630,9 +1631,17 @@ class stock_move(osv.osv):
'move_history_ids2': fields.many2many('stock.move', 'stock_move_history_ids', 'child_id', 'parent_id', 'Move History (parent moves)'),
'picking_id': fields.many2one('stock.picking', 'Reference', select=True,states={'done': [('readonly', True)]}),
'note': fields.text('Notes'),
- 'state': fields.selection([('draft', 'New'), ('waiting', 'Waiting Another Move'), ('confirmed', 'Waiting Availability'), ('assigned', 'Available'), ('done', 'Done'), ('cancel', 'Cancelled')], 'State', readonly=True, select=True,
- help='When the stock move is created it is in the \'Draft\' state.\n After that, it is set to \'Not Available\' state if the scheduler did not find the products.\n When products are reserved it is set to \'Available\'.\n When the picking is done the state is \'Done\'.\
- \nThe state is \'Waiting\' if the move is waiting for another one.'),
+ 'state': fields.selection([('draft', 'New'),
+ ('waiting', 'Waiting Another Move'),
+ ('confirmed', 'Waiting Availability'),
+ ('assigned', 'Available'),
+ ('done', 'Done'),
+ ('cancel', 'Cancelled')], 'State', readonly=True, select=True,
+ help= "* New: When the stock move is created and not yet confirmed.\n"\
+ "* Waiting Another Move: This state can be seen when a move is waiting for another one, for example in a chained flow.\n"\
+ "* Waiting Availability: This state is reached when the procurement resolution is not straight forward. It may need the scheduler to run, a component to me manufactured...\n"\
+ "* Available: When products are reserved, it is set to \'Available\'.\n"\
+ "* Done: When the shipment is processed, the state is \'Done\'."),
'price_unit': fields.float('Unit Price', digits_compute= dp.get_precision('Account'), help="Technical field used to record the product cost set by the user during a picking confirmation (when average price costing method is used)"),
'price_currency_id': fields.many2one('res.currency', 'Currency for average price', help="Technical field used to record the currency chosen by the user during a picking confirmation (when average price costing method is used)"),
'company_id': fields.many2one('res.company', 'Company', required=True, select=True),
@@ -1650,7 +1659,7 @@ class stock_move(osv.osv):
_constraints = [
(_check_tracking,
- 'You must assign a production lot for this product',
+ 'You must assign a serial number for this product',
['prodlot_id']),
(_check_location, 'You can not move products from or to a location of the type view.',
['location_id','location_dest_id']),
@@ -1737,7 +1746,7 @@ class stock_move(osv.osv):
if move.state == 'done':
if frozen_fields.intersection(vals):
raise osv.except_osv(_('Operation forbidden'),
- _('Quantities, UoMs, Products and Locations cannot be modified on stock moves that have already been processed (except by the Administrator)'))
+ _('Quantities, Unit of Measures, Products and Locations cannot be modified on stock moves that have already been processed (except by the Administrator)'))
return super(stock_move, self).write(cr, uid, ids, vals, context=context)
def copy(self, cr, uid, id, default=None, context=None):
@@ -2110,11 +2119,11 @@ class stock_move(osv.osv):
return True
if context is None:
context = {}
- pickings = {}
+ pickings = set()
for move in self.browse(cr, uid, ids, context=context):
if move.state in ('confirmed', 'waiting', 'assigned', 'draft'):
if move.picking_id:
- pickings[move.picking_id.id] = True
+ pickings.add(move.picking_id.id)
if move.move_dest_id and move.move_dest_id.state == 'waiting':
self.write(cr, uid, [move.move_dest_id.id], {'state': 'assigned'})
if context.get('call_unlink',False) and move.move_dest_id.picking_id:
@@ -2122,7 +2131,7 @@ class stock_move(osv.osv):
wf_service.trg_write(uid, 'stock.picking', move.move_dest_id.picking_id.id, cr)
self.write(cr, uid, ids, {'state': 'cancel', 'move_dest_id': False})
if not context.get('call_unlink',False):
- for pick in self.pool.get('stock.picking').browse(cr, uid, pickings.keys()):
+ for pick in self.pool.get('stock.picking').browse(cr, uid, list(pickings), context=context):
if all(move.state == 'cancel' for move in pick.move_lines):
self.pool.get('stock.picking').write(cr, uid, [pick.id], {'state': 'cancel'})
@@ -2778,10 +2787,10 @@ class stock_inventory_line(osv.osv):
'inventory_id': fields.many2one('stock.inventory', 'Inventory', ondelete='cascade', select=True),
'location_id': fields.many2one('stock.location', 'Location', required=True),
'product_id': fields.many2one('product.product', 'Product', required=True, select=True),
- 'product_uom': fields.many2one('product.uom', 'Product UOM', required=True),
- 'product_qty': fields.float('Quantity', digits_compute=dp.get_precision('Product UoM')),
+ 'product_uom': fields.many2one('product.uom', 'Product Unit of Measure', required=True),
+ 'product_qty': fields.float('Quantity', digits_compute=dp.get_precision('Product Unit of Measure')),
'company_id': fields.related('inventory_id','company_id',type='many2one',relation='res.company',string='Company',store=True, select=True, readonly=True),
- 'prod_lot_id': fields.many2one('stock.production.lot', 'Production Lot', domain="[('product_id','=',product_id)]"),
+ 'prod_lot_id': fields.many2one('stock.production.lot', 'Serial Number', domain="[('product_id','=',product_id)]"),
'state': fields.related('inventory_id','state',type='char',string='State',readonly=True),
}
@@ -2822,4 +2831,86 @@ class stock_warehouse(osv.osv):
stock_warehouse()
+#----------------------------------------------------------
+# "Empty" Classes that are used to vary from the original stock.picking (that are dedicated to the internal pickings)
+# in order to offer a different usability with different views, labels, available reports/wizards...
+#----------------------------------------------------------
+class stock_picking_in(osv.osv):
+ _name = "stock.picking.in"
+ _inherit = "stock.picking"
+ _table = "stock_picking"
+ _description = "Incomming Shipments"
+
+ def check_access_rights(self, cr, uid, operation, raise_exception=True):
+ #override in order to redirect the check of acces rights on the stock.picking object
+ return self.pool.get('stock.picking').check_access_rights(cr, uid, operation, raise_exception=raise_exception)
+
+ def check_access_rule(self, cr, uid, ids, operation, context=None):
+ #override in order to redirect the check of acces rules on the stock.picking object
+ return self.pool.get('stock.picking').check_access_rule(cr, uid, ids, operation, context=context)
+
+ def _workflow_trigger(self, cr, uid, ids, trigger, context=None):
+ #override in order to trigger the workflow of stock.picking at the end of create, write and unlink operation
+ #instead of it's own workflow (which is not existing)
+ return self.pool.get('stock.picking')._workflow_trigger(cr, uid, ids, trigger, context=context)
+
+ _columns = {
+ 'state': fields.selection(
+ [('draft', 'Draft'),
+ ('auto', 'Waiting Another Operation'),
+ ('confirmed', 'Waiting Availability'),
+ ('assigned', 'Ready to Receive'),
+ ('done', 'Received'),
+ ('cancel', 'Cancelled'),],
+ 'State', readonly=True, select=True,
+ help="""* Draft: not confirmed yet and will not be scheduled until confirmed\n
+ * Waiting Another Operation: waiting for another move to proceed before it becomes automatically available (e.g. in Make-To-Order flows)\n
+ * Waiting Availability: still waiting for the availability of products\n
+ * Ready to Receive: products reserved, simply waiting for confirmation.\n
+ * Received: has been processed, can't be modified or cancelled anymore\n
+ * Cancelled: has been cancelled, can't be confirmed anymore"""),
+ }
+ _defaults = {
+ 'type': 'in',
+ }
+
+class stock_picking_out(osv.osv):
+ _name = "stock.picking.out"
+ _inherit = "stock.picking"
+ _table = "stock_picking"
+ _description = "Delivery Orders"
+
+ def check_access_rights(self, cr, uid, operation, raise_exception=True):
+ #override in order to redirect the check of acces rights on the stock.picking object
+ return self.pool.get('stock.picking').check_access_rights(cr, uid, operation, raise_exception=raise_exception)
+
+ def check_access_rule(self, cr, uid, ids, operation, context=None):
+ #override in order to redirect the check of acces rules on the stock.picking object
+ return self.pool.get('stock.picking').check_access_rule(cr, uid, ids, operation, context=context)
+
+ def _workflow_trigger(self, cr, uid, ids, trigger, context=None):
+ #override in order to trigger the workflow of stock.picking at the end of create, write and unlink operation
+ #instead of it's own workflow (which is not existing)
+ return self.pool.get('stock.picking')._workflow_trigger(cr, uid, ids, trigger, context=context)
+
+ _columns = {
+ 'state': fields.selection(
+ [('draft', 'Draft'),
+ ('auto', 'Waiting Another Operation'),
+ ('confirmed', 'Waiting Availability'),
+ ('assigned', 'Ready to Deliver'),
+ ('done', 'Delivered'),
+ ('cancel', 'Cancelled'),],
+ 'State', readonly=True, select=True,
+ help="""* Draft: not confirmed yet and will not be scheduled until confirmed\n
+ * Waiting Another Operation: waiting for another move to proceed before it becomes automatically available (e.g. in Make-To-Order flows)\n
+ * Waiting Availability: still waiting for the availability of products\n
+ * Ready to Deliver: products reserved, simply waiting for confirmation.\n
+ * Delivered: has been processed, can't be modified or cancelled anymore\n
+ * Cancelled: has been cancelled, can't be confirmed anymore"""),
+ }
+ _defaults = {
+ 'type': 'out',
+ }
+
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/stock/stock_data.xml b/addons/stock/stock_data.xml
index c0c872e99f2..3e3ffcb83f5 100644
--- a/addons/stock/stock_data.xml
+++ b/addons/stock/stock_data.xml
@@ -20,7 +20,7 @@
Request link
-->
- Production Lot
+ Serial Numberstock.production.lot
diff --git a/addons/stock/stock_demo.yml b/addons/stock/stock_demo.yml
index 0db509e40ba..245e55c38c6 100644
--- a/addons/stock/stock_demo.yml
+++ b/addons/stock/stock_demo.yml
@@ -18,11 +18,7 @@
-
!record {model: stock.location, id: location_convenience_shop}:
name: Convenient Store
- chained_auto_packing: auto
- chained_location_type: fixed
usage: supplier
- chained_location_id: location_refrigerator
- location_id: stock_location_suppliers
-
!record {model: stock.warehouse, id: warehouse_icecream}:
name: Ice Cream Shop
diff --git a/addons/stock/stock_report.xml b/addons/stock/stock_report.xml
index 96e0ee5cd59..540e6a8f902 100644
--- a/addons/stock/stock_report.xml
+++ b/addons/stock/stock_report.xml
@@ -2,7 +2,9 @@
-
+
+
+
diff --git a/addons/stock/stock_sequence.xml b/addons/stock/stock_sequence.xml
index a8515c2f0df..6c0b3e84cf2 100644
--- a/addons/stock/stock_sequence.xml
+++ b/addons/stock/stock_sequence.xml
@@ -52,11 +52,11 @@
Sequences from tracking numbers
-->
- Production Lots
+ Serial Numbersstock.lot.serial
- Production Lots
+ Serial Numbersstock.lot.serial7
diff --git a/addons/stock/stock_view.xml b/addons/stock/stock_view.xml
index 1baef686d18..fd85d73a93e 100644
--- a/addons/stock/stock_view.xml
+++ b/addons/stock/stock_view.xml
@@ -29,10 +29,10 @@
parent="stock.menu_product_in_config_stock" sequence="35" groups="product.group_uom"/>
+ parent="menu_stock_configuration" sequence="30" groups="product.group_uom"/>
+ parent="menu_stock_configuration" sequence="35" groups="product.group_uom"/>
stock.inventory.line.tree
@@ -47,7 +47,7 @@
-
+
@@ -145,9 +145,9 @@
-
+
-
-
-
+
+
@@ -289,7 +289,7 @@
stock.production.lot.revisionform
-
-
-
-
-
-
-
-
-
-
-
@@ -817,42 +833,67 @@
+
-
- stock.picking.list.select
+
+ stock.picking.internal.searchstock.pickingsearch
-
+
-
-
+
+
-
-
-
-
-
+
+
-
+
+
+
+
+
-
-
-
+
+
+ Internal Moves
+ stock.picking
+ ir.actions.act_window
+ form
+ tree,form,calendar
+ [('type','=','internal')]
+ {'contact_display': 'partner_address', 'search_default_available': 1}
+
+ Internal Moves display all inventory operations you have to perform in your warehouse. All operations can be categorized into stock journals, so that each worker has his own list of operations to perform in his own journal. Most operations are prepared automatically by OpenERP according to your preconfigured logistics rules, but you can also record manual stock operations.
+
+
+
+
+ tree
+
+
+
+
+
+ form
+
+
+
+
stock.picking.in.tree
- stock.picking
+ stock.picking.intree
@@ -1097,138 +1040,34 @@
stock.picking.in.form
- stock.picking
+ stock.picking.in
+ form
-
+
+
-
stock.picking.in.search
- stock.picking
+ stock.picking.insearch
@@ -1262,12 +1101,12 @@
Incoming Shipments
- stock.picking
+ stock.picking.inir.actions.act_windowformtree,form,calendar[('type','=','in')]
- {'contact_display': 'partner_address'}
+ {'contact_display': 'partner_address', 'default_type': 'in'}The Incoming Shipments is the list of all orders you will receive from your suppliers. An incoming shipment contains a list of products to be received according to the original purchase order. You can validate the shipment totally or partially.
@@ -1290,61 +1129,12 @@
-
- stock.picking.internal.search
- stock.picking
- search
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Internal Moves
- stock.picking
- ir.actions.act_window
- form
- tree,form,calendar
- [('type','=','internal')]
- {'default_type': 'internal', 'contact_display': 'partner_address', 'search_default_available': 1}
-
- Internal Moves display all inventory operations you have to perform in your warehouse. All operations can be categorized into stock journals, so that each worker has his own list of operations to perform in his own journal. Most operations are prepared automatically by OpenERP according to your preconfigured logistics rules, but you can also record manual stock operations.
-
-
-
- tree
-
-
-
-
-
- form
-
-
-
+
@@ -1362,7 +1152,7 @@
-
+
-
@@ -1383,8 +1173,8 @@
groups="product.group_stock_packaging"
icon="terp-stock_effects-object-colorize"
states="draft,assigned,confirmed,done"/>
-
-
+
+
@@ -1411,8 +1201,8 @@
icon="gtk-convert" context="{'scrap': True}"
states="draft,waiting,confirmed,assigned" colspan="1"/>
-
-
+
+
@@ -1535,13 +1325,13 @@
-
+
-
@@ -1573,7 +1363,7 @@
-
+
@@ -1597,8 +1387,8 @@
icon="gtk-convert" context="{'scrap': True}"
states="draft,waiting,confirmed,assigned" colspan="1"/>
-
-
+
+
@@ -1640,12 +1430,12 @@
-
+
-
+
diff --git a/addons/stock/test/shipment.yml b/addons/stock/test/shipment.yml
index 96c42c6c488..b30feccdacf 100644
--- a/addons/stock/test/shipment.yml
+++ b/addons/stock/test/shipment.yml
@@ -73,6 +73,7 @@
assert shipment.state == 'done', "shipment should be close after received."
for move_line in shipment.move_lines:
assert move_line.product_qty == 10, "Qty does not correspond."
+ assert move_line.product_id.virtual_available == 20, "Virtual stock does not correspond."
assert move_line.state == 'done', "Move line should be closed."
-
@@ -82,11 +83,15 @@
invoice_state: none
-
!python {model: stock.return.picking }: |
+ # this work without giving the id of the picking to return, magically, thanks to the context
self.create_returns(cr, uid, [ref('return_incomming')], context=context)
-
I cancel incomming shipment after return it.
-
!python {model: stock.picking}: |
+ # the cancel is not on the return, but on the incomming shipment (which now has a quantity of 10, thanks to the
+ # backorder). This situation is a little weird as we returned a move that we finally cancelled... As result, only
+ # 30Kg from the original 50Kg will be counted in the stock (50 - 10 (cancelled quantity) - 10 (returned quantity))
self.action_cancel(cr, uid, [ref("incomming_shipment")], context=context)
-
I make invoice of backorder of incomming shipment.
@@ -107,12 +112,12 @@
shipment = self.browse(cr, uid, ref("incomming_shipment"))
assert shipment.backorder_id.invoice_state == 'invoiced', 'Invoice state is not upadted.'
-
- I check availabile stock after received incomming shipping.
+ I check available stock after received incomming shipping.
-
!python {model: product.product}: |
product = self.browse(cr, uid, ref('product_icecream'), context=context)
assert product.qty_available == 140, "Stock does not correspond."
- assert product.virtual_available == 10, "Vitual stock does not correspond."
+ assert product.virtual_available == 0, "Vitual stock does not correspond."
-
I split incomming shipment into lots. each lot contain 10 kgm Ice-cream.
-
@@ -198,7 +203,7 @@
!python {model: product.product}: |
product = self.browse(cr, uid, ref('product_icecream'), context=context)
assert product.qty_available == 135.96, "Stock does not correspond."
- assert round(product.virtual_available, 2) == 5.96, "Vitual stock does not correspond."
+ assert round(product.virtual_available, 2) == -4.04, "Vitual stock does not correspond."
-
I trace all incoming lots.
-
@@ -269,9 +274,9 @@
for move_line in shipment.move_lines:
assert move_line.state == "done", "Move should be closed."
-
- I check availabile stock after deliver.
+ I check availaible stock after deliver.
-
!python {model: product.product}: |
product = self.browse(cr, uid, ref('product_icecream'), context=context)
assert round(product.qty_available, 2) == 5.96, "Stock does not correspond."
- assert round(product.virtual_available, 2) == 5.96, "Vitual stock does not correspond."
+ assert round(product.virtual_available, 2) == -4.04, "Vitual stock does not correspond."
diff --git a/addons/stock/wizard/stock_change_product_qty.py b/addons/stock/wizard/stock_change_product_qty.py
index 162aea77f86..3abd41240d3 100644
--- a/addons/stock/wizard/stock_change_product_qty.py
+++ b/addons/stock/wizard/stock_change_product_qty.py
@@ -30,8 +30,8 @@ class stock_change_product_qty(osv.osv_memory):
_description = "Change Product Quantity"
_columns = {
'product_id' : fields.many2one('product.product', 'Product'),
- 'new_quantity': fields.float('Quantity', digits_compute=dp.get_precision('Product UoM'), required=True, help='This quantity is expressed in the Default UoM of the product.'),
- 'prodlot_id': fields.many2one('stock.production.lot', 'Production Lot', domain="[('product_id','=',product_id)]"),
+ 'new_quantity': fields.float('Quantity', digits_compute=dp.get_precision('Product Unit of Measure'), required=True, help='This quantity is expressed in the Default Unit of Measure of the product.'),
+ 'prodlot_id': fields.many2one('stock.production.lot', 'Serial Number', domain="[('product_id','=',product_id)]"),
'location_id': fields.many2one('stock.location', 'Location', required=True, domain="[('usage', '=', 'internal')]"),
}
diff --git a/addons/stock/wizard/stock_inventory_line_split.py b/addons/stock/wizard/stock_inventory_line_split.py
index 1267bc35532..b2d503ff73d 100644
--- a/addons/stock/wizard/stock_inventory_line_split.py
+++ b/addons/stock/wizard/stock_inventory_line_split.py
@@ -27,8 +27,8 @@ class stock_inventory_line_split(osv.osv_memory):
_description = "Split inventory lines"
_columns = {
- 'line_ids': fields.one2many('stock.inventory.line.split.lines', 'wizard_id', 'Production Lots'),
- 'line_exist_ids': fields.one2many('stock.inventory.line.split.lines', 'wizard_exist_id', 'Production Lots'),
+ 'line_ids': fields.one2many('stock.inventory.line.split.lines', 'wizard_id', 'Serial Numbers'),
+ 'line_exist_ids': fields.one2many('stock.inventory.line.split.lines', 'wizard_exist_id', 'Serial Numbers'),
}
def default_get(self, cr, uid, fields, context=None):
@@ -46,7 +46,7 @@ class stock_inventory_line_split(osv.osv_memory):
return res
def split(self, cr, uid, ids, line_ids, context=None):
- """ To split stock inventory lines according to production lot.
+ """ To split stock inventory lines according to serial numbers.
:param line_ids: the ID or list of IDs of inventory lines we want to split
"""
diff --git a/addons/stock/wizard/stock_invoice_onshipping_view.xml b/addons/stock/wizard/stock_invoice_onshipping_view.xml
index 5e2f25c3bbf..5095a40fa50 100644
--- a/addons/stock/wizard/stock_invoice_onshipping_view.xml
+++ b/addons/stock/wizard/stock_invoice_onshipping_view.xml
@@ -23,7 +23,7 @@
move_qty:
- raise osv.except_osv(_('Processing Error'), _('Production lot quantity %d of %s is larger than available quantity (%d) !') \
+ raise osv.except_osv(_('Processing Error'), _('Serial number quantity %d of %s is larger than available quantity (%d) !') \
% (total_move_qty, move.product_id.name, move_qty))
if quantity <= 0 or move_qty == 0:
continue
@@ -260,11 +260,11 @@ class stock_move_split_lines_exist(osv.osv_memory):
_name = "stock.move.split.lines"
_description = "Stock move Split lines"
_columns = {
- 'name': fields.char('Production Lot', size=64),
- 'quantity': fields.float('Quantity', digits_compute=dp.get_precision('Product UoM')),
+ 'name': fields.char('Serial Number', size=64),
+ 'quantity': fields.float('Quantity', digits_compute=dp.get_precision('Product Unit of Measure')),
'wizard_id': fields.many2one('stock.move.split', 'Parent Wizard'),
'wizard_exist_id': fields.many2one('stock.move.split', 'Parent Wizard (for existing lines)'),
- 'prodlot_id': fields.many2one('stock.production.lot', 'Production Lot'),
+ 'prodlot_id': fields.many2one('stock.production.lot', 'Serial Number'),
}
_defaults = {
'quantity': 1.0,
diff --git a/addons/stock/wizard/stock_move_view.xml b/addons/stock/wizard/stock_move_view.xml
index 3895f93ddc7..577411e3c09 100644
--- a/addons/stock/wizard/stock_move_view.xml
+++ b/addons/stock/wizard/stock_move_view.xml
@@ -93,11 +93,11 @@
-
+
-
+
@@ -105,11 +105,11 @@
-
+
-
+
diff --git a/addons/stock/wizard/stock_partial_picking.py b/addons/stock/wizard/stock_partial_picking.py
index 6f815413497..dd91f20e8cf 100644
--- a/addons/stock/wizard/stock_partial_picking.py
+++ b/addons/stock/wizard/stock_partial_picking.py
@@ -20,6 +20,7 @@
##############################################################################
import time
+from lxml import etree
from osv import fields, osv
from tools.misc import DEFAULT_SERVER_DATETIME_FORMAT
import decimal_precision as dp
@@ -42,9 +43,9 @@ class stock_partial_picking_line(osv.TransientModel):
_rec_name = 'product_id'
_columns = {
'product_id' : fields.many2one('product.product', string="Product", required=True, ondelete='CASCADE'),
- 'quantity' : fields.float("Quantity", digits_compute=dp.get_precision('Product UoM'), required=True),
+ 'quantity' : fields.float("Quantity", digits_compute=dp.get_precision('Product Unit of Measure'), required=True),
'product_uom': fields.many2one('product.uom', 'Unit of Measure', required=True, ondelete='CASCADE'),
- 'prodlot_id' : fields.many2one('stock.production.lot', 'Production Lot', ondelete='CASCADE'),
+ 'prodlot_id' : fields.many2one('stock.production.lot', 'Serial Number', ondelete='CASCADE'),
'location_id': fields.many2one('stock.location', 'Location', required=True, ondelete='CASCADE', domain = [('usage','<>','view')]),
'location_dest_id': fields.many2one('stock.location', 'Dest. Location', required=True, ondelete='CASCADE',domain = [('usage','<>','view')]),
'move_id' : fields.many2one('stock.move', "Move", ondelete='CASCADE'),
@@ -71,15 +72,40 @@ class stock_partial_picking(osv.osv_memory):
'picking_id': fields.many2one('stock.picking', 'Picking', required=True, ondelete='CASCADE'),
'hide_tracking': fields.function(_hide_tracking, string='Tracking', type='boolean', help='This field is for internal purpose. It is used to decide if the column prodlot has to be shown on the move_ids field or not'),
}
+
+ def fields_view_get(self, cr, uid, view_id=None, view_type='form', context=None, toolbar=False, submenu=False):
+ #override of fields_view_get in order to change the label of the process button and the separator accordingly to the shipping type
+ if context is None:
+ context={}
+ res = super(stock_partial_picking, self).fields_view_get(cr, uid, view_id=view_id, view_type=view_type, context=context, toolbar=toolbar, submenu=submenu)
+ type = context.get('active_model','').split('.')[-1]
+ if type:
+ doc = etree.XML(res['arch'])
+ for node in doc.xpath("//button[@name='do_partial']"):
+ if type == 'in':
+ node.set('string', _('_Receive'))
+ elif type == 'out':
+ node.set('string', _('_Deliver'))
+ for node in doc.xpath("//separator[@name='product_separator']"):
+ if type == 'in':
+ node.set('string', _('Receive Products'))
+ elif type == 'out':
+ node.set('string', _('Deliver Products'))
+ res['arch'] = etree.tostring(doc)
+ return res
def default_get(self, cr, uid, fields, context=None):
if context is None: context = {}
res = super(stock_partial_picking, self).default_get(cr, uid, fields, context=context)
picking_ids = context.get('active_ids', [])
- if not picking_ids or (not context.get('active_model') == 'stock.picking') \
- or len(picking_ids) != 1:
+ if not picking_ids or len(picking_ids) != 1:
# Partial Picking Processing may only be done for one picking at a time
return res
+ # The check about active_model is there in case the client mismatched the context during propagation of it
+ # (already seen in previous bug where context passed was containing ir.ui.menu as active_model and the menu
+ # ID as active_id). Though this should be fixed in clients now, this place is sensitive enough to ensure the
+ # consistancy of the context.
+ assert context.get('active_model') in ('stock.picking', 'stock.picking.in', 'stock.picking.out'), 'Bad context propagation'
picking_id, = picking_ids
if 'picking_id' in fields:
res.update(picking_id=picking_id)
@@ -111,7 +137,7 @@ class stock_partial_picking(osv.osv_memory):
def _partial_move_for(self, cr, uid, move):
partial_move = {
'product_id' : move.product_id.id,
- 'quantity' : move.state in ('assigned','new') and move.product_qty or 0,
+ 'quantity' : move.state in ('assigned','draft','confirmed') and move.product_qty or 0,
'product_uom' : move.product_uom.id,
'prodlot_id' : move.prodlot_id.id,
'move_id' : move.id,
@@ -145,7 +171,7 @@ class stock_partial_picking(osv.osv_memory):
if line_uom.factor and line_uom.factor <> 0:
if qty_in_line_uom <> wizard_line.quantity:
- raise osv.except_osv(_('Warning'), _('The uom rounding does not allow you to ship "%s %s", only roundings of "%s %s" is accepted by the uom.') % (wizard_line.quantity, line_uom.name, line_uom.rounding, line_uom.name))
+ raise osv.except_osv(_('Warning'), _('The unit of measure rounding does not allow you to ship "%s %s", only roundings of "%s %s" is accepted by the Unit of Measure.') % (wizard_line.quantity, line_uom.name, line_uom.rounding, line_uom.name))
if move_id:
#Check rounding Quantity.ex.
#picking: 1kg, uom kg rounding = 0.01 (rounding to 10g),
diff --git a/addons/stock/wizard/stock_partial_picking_view.xml b/addons/stock/wizard/stock_partial_picking_view.xml
index c461f42a322..c57c6c400e4 100644
--- a/addons/stock/wizard/stock_partial_picking_view.xml
+++ b/addons/stock/wizard/stock_partial_picking_view.xml
@@ -9,6 +9,7 @@
new
+
stock.partial.picking.formstock.partial.picking
@@ -16,7 +17,7 @@
-
+
@@ -34,7 +35,7 @@
-
+
diff --git a/addons/stock/wizard/stock_return_picking.py b/addons/stock/wizard/stock_return_picking.py
index 689f17cd9b9..4c85ddcae85 100644
--- a/addons/stock/wizard/stock_return_picking.py
+++ b/addons/stock/wizard/stock_return_picking.py
@@ -31,7 +31,7 @@ class stock_return_picking_memory(osv.osv_memory):
_rec_name = 'product_id'
_columns = {
'product_id' : fields.many2one('product.product', string="Product", required=True),
- 'quantity' : fields.float("Quantity", digits_compute=dp.get_precision('Product UoM'), required=True),
+ 'quantity' : fields.float("Quantity", digits_compute=dp.get_precision('Product Unit of Measure'), required=True),
'wizard_id' : fields.many2one('stock.return.picking', string="Wizard"),
'move_id' : fields.many2one('stock.move', "Move"),
}
@@ -45,7 +45,7 @@ class stock_return_picking(osv.osv_memory):
_columns = {
'product_return_moves' : fields.one2many('stock.return.picking.memory', 'wizard_id', 'Moves'),
'invoice_state': fields.selection([('2binvoiced', 'To be refunded/invoiced'), ('none', 'No invoicing')], 'Invoicing',required=True),
- }
+ }
def default_get(self, cr, uid, fields, context=None):
"""
@@ -143,6 +143,8 @@ class stock_return_picking(osv.osv_memory):
pick_obj = self.pool.get('stock.picking')
uom_obj = self.pool.get('product.uom')
data_obj = self.pool.get('stock.return.picking.memory')
+ act_obj = self.pool.get('ir.actions.act_window')
+ model_obj = self.pool.get('ir.model.data')
wf_service = netsvc.LocalService("workflow")
pick = pick_obj.browse(cr, uid, record_id, context=context)
data = self.read(cr, uid, ids[0], context=context)
@@ -152,15 +154,20 @@ class stock_return_picking(osv.osv_memory):
returned_lines = 0
# Create new picking for returned products
- if pick.type=='out':
+ if pick.type =='out':
new_type = 'in'
- elif pick.type=='in':
+ elif pick.type =='in':
new_type = 'out'
else:
new_type = 'internal'
- new_picking = pick_obj.copy(cr, uid, pick.id, {'name':'%s-return' % pick.name,
- 'move_lines':[], 'state':'draft', 'type':new_type,
- 'date':date_cur, 'invoice_state':data['invoice_state'],})
+ new_picking = pick_obj.copy(cr, uid, pick.id, {
+ 'name': _('%s-return') % pick.name,
+ 'move_lines': [],
+ 'state':'draft',
+ 'type': new_type,
+ 'date':date_cur,
+ 'invoice_state': data['invoice_state'],
+ })
val_id = data['product_return_moves']
for v in val_id:
@@ -178,35 +185,34 @@ class stock_return_picking(osv.osv_memory):
if new_qty:
returned_lines += 1
new_move=move_obj.copy(cr, uid, move.id, {
- 'product_qty': new_qty,
- 'product_uos_qty': uom_obj._compute_qty(cr, uid, move.product_uom.id,
- new_qty, move.product_uos.id),
- 'picking_id':new_picking, 'state':'draft',
- 'location_id':new_location, 'location_dest_id':move.location_id.id,
- 'date':date_cur,})
- move_obj.write(cr, uid, [move.id], {'move_history_ids2':[(4,new_move)]})
+ 'product_qty': new_qty,
+ 'product_uos_qty': uom_obj._compute_qty(cr, uid, move.product_uom.id, new_qty, move.product_uos.id),
+ 'picking_id':new_picking,
+ 'state': 'draft',
+ 'location_id': new_location,
+ 'location_dest_id': move.location_id.id,
+ 'date': date_cur,
+ })
+ move_obj.write(cr, uid, [move.id], {'move_history_ids2':[(4,new_move)]}, context=context)
if not returned_lines:
raise osv.except_osv(_('Warning !'), _("Please specify at least one non-zero quantity!"))
if set_invoice_state_to_none:
- pick_obj.write(cr, uid, [pick.id], {'invoice_state':'none'})
+ pick_obj.write(cr, uid, [pick.id], {'invoice_state':'none'}, context=context)
wf_service.trg_validate(uid, 'stock.picking', new_picking, 'button_confirm', cr)
pick_obj.force_assign(cr, uid, [new_picking], context)
# Update view id in context, lp:702939
- view_list = {
- 'out': 'view_picking_out_tree',
- 'in': 'view_picking_in_tree',
- 'internal': 'vpicktree',
- }
- data_obj = self.pool.get('ir.model.data')
- res = data_obj.get_object_reference(cr, uid, 'stock', view_list.get(new_type, 'vpicktree'))
- context.update({'view_id': res and res[1] or False})
+ model_list = {
+ 'out': 'stock.picking.out',
+ 'in': 'stock.picking.in',
+ 'internal': 'stock.picking',
+ }
return {
'domain': "[('id', 'in', ["+str(new_picking)+"])]",
- 'name': 'Picking List',
+ 'name': _('Returned Picking'),
'view_type':'form',
'view_mode':'tree,form',
- 'res_model':'stock.picking',
+ 'res_model': model_list.get(new_type, 'stock.picking'),
'type':'ir.actions.act_window',
'context':context,
}
@@ -214,4 +220,3 @@ class stock_return_picking(osv.osv_memory):
stock_return_picking()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
-
diff --git a/addons/stock/wizard/stock_return_picking_view.xml b/addons/stock/wizard/stock_return_picking_view.xml
index 51431eeee45..7735801624d 100644
--- a/addons/stock/wizard/stock_return_picking_view.xml
+++ b/addons/stock/wizard/stock_return_picking_view.xml
@@ -1,14 +1,30 @@
-
+ id="act_stock_return_picking"/>
+
+ stock.return.picking.memory.tree
diff --git a/addons/stock/wizard/stock_splitinto.py b/addons/stock/wizard/stock_splitinto.py
index 68397cc98f1..d9b34a604cf 100644
--- a/addons/stock/wizard/stock_splitinto.py
+++ b/addons/stock/wizard/stock_splitinto.py
@@ -27,7 +27,7 @@ class stock_split_into(osv.osv_memory):
_name = "stock.split.into"
_description = "Split into"
_columns = {
- 'quantity': fields.float('Quantity',digits_compute=dp.get_precision('Product UoM')),
+ 'quantity': fields.float('Quantity',digits_compute=dp.get_precision('Product Unit of Measure')),
}
_defaults = {
'quantity': lambda *x: 0,
diff --git a/addons/stock_planning/stock_planning.py b/addons/stock_planning/stock_planning.py
index d104d57c62b..417a2a5cb27 100644
--- a/addons/stock_planning/stock_planning.py
+++ b/addons/stock_planning/stock_planning.py
@@ -81,17 +81,17 @@ class stock_sale_forecast(osv.osv):
help = 'Shows which period this forecast concerns.'),
'product_id': fields.many2one('product.product', 'Product', readonly=True, required=True, states={'draft':[('readonly',False)]}, \
help = 'Shows which product this forecast concerns.'),
- 'product_qty': fields.float('Forecast Quantity', digits_compute=dp.get_precision('Product UoM'), required=True, readonly=True, \
+ 'product_qty': fields.float('Forecast Quantity', digits_compute=dp.get_precision('Product Unit of Measure'), required=True, readonly=True, \
states={'draft':[('readonly',False)]}, help= 'Forecast Product quantity.'),
'product_amt': fields.float('Product Amount', readonly=True, states={'draft':[('readonly',False)]}, \
help='Forecast value which will be converted to Product Quantity according to prices.'),
- 'product_uom_categ': fields.many2one('product.uom.categ', 'Product UoM Category'), # Invisible field for product_uom domain
- 'product_uom': fields.many2one('product.uom', 'Product UoM', required=True, readonly=True, states={'draft':[('readonly',False)]}, \
+ 'product_uom_categ': fields.many2one('product.uom.categ', 'Product Unit of Measure Category'), # Invisible field for product_uom domain
+ 'product_uom': fields.many2one('product.uom', 'Product Unit of Measure', required=True, readonly=True, states={'draft':[('readonly',False)]}, \
help = "Unit of Measure used to show the quantities of stock calculation." \
"You can use units form default category or from second category (UoS category)."),
'product_uos_categ' : fields.many2one('product.uom.categ', 'Product UoS Category'), # Invisible field for product_uos domain
# Field used in onchange_uom to check what uom was before change and recalculate quantities according to old uom (active_uom) and new uom.
- 'active_uom': fields.many2one('product.uom', string = "Active UoM"),
+ 'active_uom': fields.many2one('product.uom', string = "Active Unit of Measure"),
'state': fields.selection([('draft','Draft'),('validated','Validated')],'State',readonly=True),
'analyzed_period1_id': fields.many2one('stock.period', 'Period1', readonly=True, states={'draft':[('readonly',False)]},),
'analyzed_period2_id': fields.many2one('stock.period', 'Period2', readonly=True, states={'draft':[('readonly',False)]},),
@@ -452,12 +452,12 @@ class stock_planning(osv.osv):
help = 'Period for this planning. Requisition will be created for beginning of the period.', select=True),
'warehouse_id': fields.many2one('stock.warehouse','Warehouse', required=True),
'product_id': fields.many2one('product.product' , 'Product', required=True, help = 'Product which this planning is created for.'),
- 'product_uom_categ' : fields.many2one('product.uom.categ', 'Product UoM Category'), # Invisible field for product_uom domain
- 'product_uom': fields.many2one('product.uom', 'UoM', required=True, help = "Unit of Measure used to show the quantities of stock calculation." \
+ 'product_uom_categ' : fields.many2one('product.uom.categ', 'Product Unit of Measure Category'), # Invisible field for product_uom domain
+ 'product_uom': fields.many2one('product.uom', 'Unit of Measure', required=True, help = "Unit of Measure used to show the quantities of stock calculation." \
"You can use units from default category or from second category (UoS category)."),
- 'product_uos_categ': fields.many2one('product.uom.categ', 'Product UoM Category'), # Invisible field for product_uos domain
+ 'product_uos_categ': fields.many2one('product.uom.categ', 'Product Unit of Measure Category'), # Invisible field for product_uos domain
# Field used in onchange_uom to check what uom was before change to recalculate quantities according to old uom (active_uom) and new uom.
- 'active_uom': fields.many2one('product.uom', string = "Active UoM"), # It works only in Forecast
+ 'active_uom': fields.many2one('product.uom', string = "Active Unit of Measure"), # It works only in Forecast
'planned_outgoing': fields.float('Planned Out', required=True, \
help = 'Enter planned outgoing quantity from selected Warehouse during the selected Period of selected Product. '\
'To plan this value look at Confirmed Out or Sales Forecasts. This value should be equal or greater than Confirmed Out.'),
diff --git a/addons/stock_planning/stock_planning_view.xml b/addons/stock_planning/stock_planning_view.xml
index a75c3957c24..32d0633fb28 100644
--- a/addons/stock_planning/stock_planning_view.xml
+++ b/addons/stock_planning/stock_planning_view.xml
@@ -204,7 +204,7 @@
-
+