diff --git a/addons/hr/res_config.py b/addons/hr/res_config.py
index ff505ee1114..0230a9285a5 100644
--- a/addons/hr/res_config.py
+++ b/addons/hr/res_config.py
@@ -26,8 +26,8 @@ class hr_config_settings(osv.osv_memory):
help ="""This installs the module hr_evaluation."""),
'module_hr_gamification': fields.boolean('Drive engagement with challenges and badges',
help ="""This installs the module hr_gamification."""),
- 'module_account_analytic_analysis': fields.boolean('Allow invoicing based on timesheets (the sale application will be installed)',
- help ="""This installs the module account_analytic_analysis, which will install sales management too."""),
+ 'module_sale_contract': fields.boolean('Allow invoicing based on timesheets (the sale application will be installed)',
+ help ="""This installs the module sale_contract, which will install sales management too."""),
'module_hr_payroll': fields.boolean('Manage payroll',
help ="""This installs the module hr_payroll."""),
'module_website_hr_recruitment': fields.boolean('Publish jobs on your website',
diff --git a/addons/project_timesheet/__openerp__.py b/addons/project_timesheet/__openerp__.py
index c6e2695571b..e6b4c6961ec 100644
--- a/addons/project_timesheet/__openerp__.py
+++ b/addons/project_timesheet/__openerp__.py
@@ -16,7 +16,7 @@ with the effect of creating, editing and deleting either ways.
'author': 'OpenERP SA',
'website': 'https://www.odoo.com/page/project-management',
'images': ['images/invoice_task_work.jpeg', 'images/my_timesheet.jpeg', 'images/working_hour.jpeg'],
- 'depends': ['resource', 'project', 'account_analytic_analysis', 'procurement'],
+ 'depends': ['resource', 'project', 'sale_contract', 'procurement'],
'data': [
'security/ir.model.access.csv',
'security/project_timesheet_security.xml',
diff --git a/addons/project_timesheet/project_timesheet_view.xml b/addons/project_timesheet/project_timesheet_view.xml
index ef068f084d9..1ce6617152b 100644
--- a/addons/project_timesheet/project_timesheet_view.xml
+++ b/addons/project_timesheet/project_timesheet_view.xml
@@ -126,7 +126,7 @@
tree,form,graph{}[('type','=','normal')]
-
+
Click to add a customer contract.
@@ -136,6 +136,9 @@
+
+
project.task.form.inherited
diff --git a/addons/sale/res_config.py b/addons/sale/res_config.py
index f4560f43f3c..8caa269b7fe 100644
--- a/addons/sale/res_config.py
+++ b/addons/sale/res_config.py
@@ -16,13 +16,13 @@ class sale_configuration(osv.TransientModel):
'timesheet': fields.boolean('Prepare invoices based on timesheets',
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.\n'
- '-This installs the module account_analytic_analysis.'),
- 'module_account_analytic_analysis': fields.boolean('Use contracts management',
+ '-This installs the module sale_contract.'),
+ 'module_sale_contract': fields.boolean('Use contracts management',
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).\n'
'You will be able to follow the progress of the contract and invoice automatically.\n'
- '-It installs the account_analytic_analysis module.'),
+ '-It installs the sale_contract module.'),
'group_sale_pricelist':fields.boolean("Use pricelists to adapt your price per customers",
implied_group='product.group_sale_pricelist',
help="""Allows to manage different prices based on rules per category of customers.
@@ -79,7 +79,7 @@ Example: 10% for retailers, promotion of 5 EUR on this product, etc."""),
def onchange_timesheet(self, cr, uid, ids, timesheet, context=None):
return {'value': {
'timesheet': timesheet,
- 'module_account_analytic_analysis': timesheet,
+ 'module_sale_contract': timesheet,
}}
class account_config_settings(osv.osv_memory):
diff --git a/addons/sale/res_config_view.xml b/addons/sale/res_config_view.xml
index 536459d7107..2cf95f12ec0 100644
--- a/addons/sale/res_config_view.xml
+++ b/addons/sale/res_config_view.xml
@@ -95,10 +95,10 @@
-
-
+
+
-
+
diff --git a/addons/account_analytic_analysis/__init__.py b/addons/sale_contract/__init__.py
similarity index 66%
rename from addons/account_analytic_analysis/__init__.py
rename to addons/sale_contract/__init__.py
index b27cee9bfb4..6e1a92f403e 100644
--- a/addons/account_analytic_analysis/__init__.py
+++ b/addons/sale_contract/__init__.py
@@ -1,5 +1,6 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
-import account_analytic_analysis
-import res_config
+import models
+import report
+import test
diff --git a/addons/account_analytic_analysis/__openerp__.py b/addons/sale_contract/__openerp__.py
similarity index 78%
rename from addons/account_analytic_analysis/__openerp__.py
rename to addons/sale_contract/__openerp__.py
index 07102ba3de4..e52743e660d 100644
--- a/addons/account_analytic_analysis/__openerp__.py
+++ b/addons/sale_contract/__openerp__.py
@@ -18,13 +18,14 @@ Adds menu to show relevant information to each manager.You can also view the rep
'data': [
'security/ir.model.access.csv',
'security/account_analytic_analysis_security.xml',
- 'account_analytic_analysis_view.xml',
- 'account_analytic_analysis_cron.xml',
- 'res_config_view.xml',
+ 'views/sale_contract_view.xml',
+ 'data/sale_contract_cron.xml',
+ 'views/res_config_view.xml',
'views/account_analytic_analysis.xml',
+ 'views/product_template_view.xml',
],
- 'demo': ['analytic_account_demo.xml', 'analytic_account_demo.yml'],
- 'test': ['../account/test/account_minimal_test.xml', 'test/account_analytic_analysis.yml'],
+ 'demo': ['demo/sale_contract_demo.xml'],
+ 'test': ['test/account_analytic_analysis.yml'],
'installable': True,
'auto_install': False,
}
diff --git a/addons/account_analytic_analysis/account_analytic_analysis_cron.xml b/addons/sale_contract/data/sale_contract_cron.xml
similarity index 100%
rename from addons/account_analytic_analysis/account_analytic_analysis_cron.xml
rename to addons/sale_contract/data/sale_contract_cron.xml
diff --git a/addons/account_analytic_analysis/analytic_account_demo.xml b/addons/sale_contract/demo/sale_contract_demo.xml
similarity index 100%
rename from addons/account_analytic_analysis/analytic_account_demo.xml
rename to addons/sale_contract/demo/sale_contract_demo.xml
diff --git a/addons/account_analytic_analysis/i18n/account_analytic_analysis.pot b/addons/sale_contract/i18n/account_analytic_analysis.pot
similarity index 100%
rename from addons/account_analytic_analysis/i18n/account_analytic_analysis.pot
rename to addons/sale_contract/i18n/account_analytic_analysis.pot
diff --git a/addons/account_analytic_analysis/i18n/ar.po b/addons/sale_contract/i18n/ar.po
similarity index 100%
rename from addons/account_analytic_analysis/i18n/ar.po
rename to addons/sale_contract/i18n/ar.po
diff --git a/addons/account_analytic_analysis/i18n/bg.po b/addons/sale_contract/i18n/bg.po
similarity index 100%
rename from addons/account_analytic_analysis/i18n/bg.po
rename to addons/sale_contract/i18n/bg.po
diff --git a/addons/account_analytic_analysis/i18n/bs.po b/addons/sale_contract/i18n/bs.po
similarity index 100%
rename from addons/account_analytic_analysis/i18n/bs.po
rename to addons/sale_contract/i18n/bs.po
diff --git a/addons/account_analytic_analysis/i18n/ca.po b/addons/sale_contract/i18n/ca.po
similarity index 100%
rename from addons/account_analytic_analysis/i18n/ca.po
rename to addons/sale_contract/i18n/ca.po
diff --git a/addons/account_analytic_analysis/i18n/cs.po b/addons/sale_contract/i18n/cs.po
similarity index 100%
rename from addons/account_analytic_analysis/i18n/cs.po
rename to addons/sale_contract/i18n/cs.po
diff --git a/addons/account_analytic_analysis/i18n/da.po b/addons/sale_contract/i18n/da.po
similarity index 100%
rename from addons/account_analytic_analysis/i18n/da.po
rename to addons/sale_contract/i18n/da.po
diff --git a/addons/account_analytic_analysis/i18n/de.po b/addons/sale_contract/i18n/de.po
similarity index 100%
rename from addons/account_analytic_analysis/i18n/de.po
rename to addons/sale_contract/i18n/de.po
diff --git a/addons/account_analytic_analysis/i18n/el.po b/addons/sale_contract/i18n/el.po
similarity index 100%
rename from addons/account_analytic_analysis/i18n/el.po
rename to addons/sale_contract/i18n/el.po
diff --git a/addons/account_analytic_analysis/i18n/en_GB.po b/addons/sale_contract/i18n/en_GB.po
similarity index 100%
rename from addons/account_analytic_analysis/i18n/en_GB.po
rename to addons/sale_contract/i18n/en_GB.po
diff --git a/addons/account_analytic_analysis/i18n/es.po b/addons/sale_contract/i18n/es.po
similarity index 100%
rename from addons/account_analytic_analysis/i18n/es.po
rename to addons/sale_contract/i18n/es.po
diff --git a/addons/account_analytic_analysis/i18n/es_AR.po b/addons/sale_contract/i18n/es_AR.po
similarity index 100%
rename from addons/account_analytic_analysis/i18n/es_AR.po
rename to addons/sale_contract/i18n/es_AR.po
diff --git a/addons/account_analytic_analysis/i18n/es_CR.po b/addons/sale_contract/i18n/es_CR.po
similarity index 100%
rename from addons/account_analytic_analysis/i18n/es_CR.po
rename to addons/sale_contract/i18n/es_CR.po
diff --git a/addons/account_analytic_analysis/i18n/es_EC.po b/addons/sale_contract/i18n/es_EC.po
similarity index 100%
rename from addons/account_analytic_analysis/i18n/es_EC.po
rename to addons/sale_contract/i18n/es_EC.po
diff --git a/addons/account_analytic_analysis/i18n/es_MX.po b/addons/sale_contract/i18n/es_MX.po
similarity index 100%
rename from addons/account_analytic_analysis/i18n/es_MX.po
rename to addons/sale_contract/i18n/es_MX.po
diff --git a/addons/account_analytic_analysis/i18n/es_PY.po b/addons/sale_contract/i18n/es_PY.po
similarity index 100%
rename from addons/account_analytic_analysis/i18n/es_PY.po
rename to addons/sale_contract/i18n/es_PY.po
diff --git a/addons/account_analytic_analysis/i18n/es_VE.po b/addons/sale_contract/i18n/es_VE.po
similarity index 100%
rename from addons/account_analytic_analysis/i18n/es_VE.po
rename to addons/sale_contract/i18n/es_VE.po
diff --git a/addons/account_analytic_analysis/i18n/et.po b/addons/sale_contract/i18n/et.po
similarity index 100%
rename from addons/account_analytic_analysis/i18n/et.po
rename to addons/sale_contract/i18n/et.po
diff --git a/addons/account_analytic_analysis/i18n/fa.po b/addons/sale_contract/i18n/fa.po
similarity index 100%
rename from addons/account_analytic_analysis/i18n/fa.po
rename to addons/sale_contract/i18n/fa.po
diff --git a/addons/account_analytic_analysis/i18n/fi.po b/addons/sale_contract/i18n/fi.po
similarity index 100%
rename from addons/account_analytic_analysis/i18n/fi.po
rename to addons/sale_contract/i18n/fi.po
diff --git a/addons/account_analytic_analysis/i18n/fr.po b/addons/sale_contract/i18n/fr.po
similarity index 100%
rename from addons/account_analytic_analysis/i18n/fr.po
rename to addons/sale_contract/i18n/fr.po
diff --git a/addons/account_analytic_analysis/i18n/gl.po b/addons/sale_contract/i18n/gl.po
similarity index 100%
rename from addons/account_analytic_analysis/i18n/gl.po
rename to addons/sale_contract/i18n/gl.po
diff --git a/addons/account_analytic_analysis/i18n/gu.po b/addons/sale_contract/i18n/gu.po
similarity index 100%
rename from addons/account_analytic_analysis/i18n/gu.po
rename to addons/sale_contract/i18n/gu.po
diff --git a/addons/account_analytic_analysis/i18n/hr.po b/addons/sale_contract/i18n/hr.po
similarity index 100%
rename from addons/account_analytic_analysis/i18n/hr.po
rename to addons/sale_contract/i18n/hr.po
diff --git a/addons/account_analytic_analysis/i18n/hu.po b/addons/sale_contract/i18n/hu.po
similarity index 100%
rename from addons/account_analytic_analysis/i18n/hu.po
rename to addons/sale_contract/i18n/hu.po
diff --git a/addons/account_analytic_analysis/i18n/id.po b/addons/sale_contract/i18n/id.po
similarity index 100%
rename from addons/account_analytic_analysis/i18n/id.po
rename to addons/sale_contract/i18n/id.po
diff --git a/addons/account_analytic_analysis/i18n/it.po b/addons/sale_contract/i18n/it.po
similarity index 100%
rename from addons/account_analytic_analysis/i18n/it.po
rename to addons/sale_contract/i18n/it.po
diff --git a/addons/account_analytic_analysis/i18n/ja.po b/addons/sale_contract/i18n/ja.po
similarity index 100%
rename from addons/account_analytic_analysis/i18n/ja.po
rename to addons/sale_contract/i18n/ja.po
diff --git a/addons/account_analytic_analysis/i18n/ko.po b/addons/sale_contract/i18n/ko.po
similarity index 100%
rename from addons/account_analytic_analysis/i18n/ko.po
rename to addons/sale_contract/i18n/ko.po
diff --git a/addons/account_analytic_analysis/i18n/lt.po b/addons/sale_contract/i18n/lt.po
similarity index 100%
rename from addons/account_analytic_analysis/i18n/lt.po
rename to addons/sale_contract/i18n/lt.po
diff --git a/addons/account_analytic_analysis/i18n/lv.po b/addons/sale_contract/i18n/lv.po
similarity index 100%
rename from addons/account_analytic_analysis/i18n/lv.po
rename to addons/sale_contract/i18n/lv.po
diff --git a/addons/account_analytic_analysis/i18n/mk.po b/addons/sale_contract/i18n/mk.po
similarity index 100%
rename from addons/account_analytic_analysis/i18n/mk.po
rename to addons/sale_contract/i18n/mk.po
diff --git a/addons/account_analytic_analysis/i18n/mn.po b/addons/sale_contract/i18n/mn.po
similarity index 100%
rename from addons/account_analytic_analysis/i18n/mn.po
rename to addons/sale_contract/i18n/mn.po
diff --git a/addons/account_analytic_analysis/i18n/nb.po b/addons/sale_contract/i18n/nb.po
similarity index 100%
rename from addons/account_analytic_analysis/i18n/nb.po
rename to addons/sale_contract/i18n/nb.po
diff --git a/addons/account_analytic_analysis/i18n/nl.po b/addons/sale_contract/i18n/nl.po
similarity index 100%
rename from addons/account_analytic_analysis/i18n/nl.po
rename to addons/sale_contract/i18n/nl.po
diff --git a/addons/account_analytic_analysis/i18n/nl_BE.po b/addons/sale_contract/i18n/nl_BE.po
similarity index 100%
rename from addons/account_analytic_analysis/i18n/nl_BE.po
rename to addons/sale_contract/i18n/nl_BE.po
diff --git a/addons/account_analytic_analysis/i18n/oc.po b/addons/sale_contract/i18n/oc.po
similarity index 100%
rename from addons/account_analytic_analysis/i18n/oc.po
rename to addons/sale_contract/i18n/oc.po
diff --git a/addons/account_analytic_analysis/i18n/pl.po b/addons/sale_contract/i18n/pl.po
similarity index 100%
rename from addons/account_analytic_analysis/i18n/pl.po
rename to addons/sale_contract/i18n/pl.po
diff --git a/addons/account_analytic_analysis/i18n/pt.po b/addons/sale_contract/i18n/pt.po
similarity index 100%
rename from addons/account_analytic_analysis/i18n/pt.po
rename to addons/sale_contract/i18n/pt.po
diff --git a/addons/account_analytic_analysis/i18n/pt_BR.po b/addons/sale_contract/i18n/pt_BR.po
similarity index 100%
rename from addons/account_analytic_analysis/i18n/pt_BR.po
rename to addons/sale_contract/i18n/pt_BR.po
diff --git a/addons/account_analytic_analysis/i18n/ro.po b/addons/sale_contract/i18n/ro.po
similarity index 100%
rename from addons/account_analytic_analysis/i18n/ro.po
rename to addons/sale_contract/i18n/ro.po
diff --git a/addons/account_analytic_analysis/i18n/ru.po b/addons/sale_contract/i18n/ru.po
similarity index 100%
rename from addons/account_analytic_analysis/i18n/ru.po
rename to addons/sale_contract/i18n/ru.po
diff --git a/addons/account_analytic_analysis/i18n/sk.po b/addons/sale_contract/i18n/sk.po
similarity index 100%
rename from addons/account_analytic_analysis/i18n/sk.po
rename to addons/sale_contract/i18n/sk.po
diff --git a/addons/account_analytic_analysis/i18n/sl.po b/addons/sale_contract/i18n/sl.po
similarity index 100%
rename from addons/account_analytic_analysis/i18n/sl.po
rename to addons/sale_contract/i18n/sl.po
diff --git a/addons/account_analytic_analysis/i18n/sq.po b/addons/sale_contract/i18n/sq.po
similarity index 100%
rename from addons/account_analytic_analysis/i18n/sq.po
rename to addons/sale_contract/i18n/sq.po
diff --git a/addons/account_analytic_analysis/i18n/sr.po b/addons/sale_contract/i18n/sr.po
similarity index 100%
rename from addons/account_analytic_analysis/i18n/sr.po
rename to addons/sale_contract/i18n/sr.po
diff --git a/addons/account_analytic_analysis/i18n/sr@latin.po b/addons/sale_contract/i18n/sr@latin.po
similarity index 100%
rename from addons/account_analytic_analysis/i18n/sr@latin.po
rename to addons/sale_contract/i18n/sr@latin.po
diff --git a/addons/account_analytic_analysis/i18n/sv.po b/addons/sale_contract/i18n/sv.po
similarity index 100%
rename from addons/account_analytic_analysis/i18n/sv.po
rename to addons/sale_contract/i18n/sv.po
diff --git a/addons/account_analytic_analysis/i18n/tlh.po b/addons/sale_contract/i18n/tlh.po
similarity index 100%
rename from addons/account_analytic_analysis/i18n/tlh.po
rename to addons/sale_contract/i18n/tlh.po
diff --git a/addons/account_analytic_analysis/i18n/tr.po b/addons/sale_contract/i18n/tr.po
similarity index 100%
rename from addons/account_analytic_analysis/i18n/tr.po
rename to addons/sale_contract/i18n/tr.po
diff --git a/addons/account_analytic_analysis/i18n/uk.po b/addons/sale_contract/i18n/uk.po
similarity index 100%
rename from addons/account_analytic_analysis/i18n/uk.po
rename to addons/sale_contract/i18n/uk.po
diff --git a/addons/account_analytic_analysis/i18n/vi.po b/addons/sale_contract/i18n/vi.po
similarity index 100%
rename from addons/account_analytic_analysis/i18n/vi.po
rename to addons/sale_contract/i18n/vi.po
diff --git a/addons/account_analytic_analysis/i18n/zh_CN.po b/addons/sale_contract/i18n/zh_CN.po
similarity index 100%
rename from addons/account_analytic_analysis/i18n/zh_CN.po
rename to addons/sale_contract/i18n/zh_CN.po
diff --git a/addons/account_analytic_analysis/i18n/zh_TW.po b/addons/sale_contract/i18n/zh_TW.po
similarity index 100%
rename from addons/account_analytic_analysis/i18n/zh_TW.po
rename to addons/sale_contract/i18n/zh_TW.po
diff --git a/addons/sale_contract/models/__init__.py b/addons/sale_contract/models/__init__.py
new file mode 100644
index 00000000000..616ffabaed9
--- /dev/null
+++ b/addons/sale_contract/models/__init__.py
@@ -0,0 +1,4 @@
+import sale_contract
+import sale
+import res_config
+
diff --git a/addons/account_analytic_analysis/res_config.py b/addons/sale_contract/models/res_config.py
similarity index 93%
rename from addons/account_analytic_analysis/res_config.py
rename to addons/sale_contract/models/res_config.py
index bc158117863..30f75853a74 100644
--- a/addons/account_analytic_analysis/res_config.py
+++ b/addons/sale_contract/models/res_config.py
@@ -10,7 +10,7 @@ class sale_configuration(osv.osv_memory):
_columns = {
'group_template_required': fields.boolean("Mandatory use of templates.",
- implied_group='account_analytic_analysis.group_template_required',
+ implied_group='sale_contract.group_template_required',
help="Allows you to set the template field as required when creating an analytic account or a contract."),
'time_unit': fields.many2one('product.uom', 'The default working time unit.'),
}
@@ -25,7 +25,7 @@ class sale_configuration(osv.osv_memory):
product = ir_model_data.xmlid_to_object(cr, uid, 'product.product_product_consultant')
if product and product.exists():
res['time_unit'] = product.uom_id.id
- res['timesheet'] = res.get('module_account_analytic_analysis')
+ res['timesheet'] = res.get('module_sale_contract')
return res
def set_sale_defaults(self, cr, uid, ids, context=None):
diff --git a/addons/sale_contract/models/sale.py b/addons/sale_contract/models/sale.py
new file mode 100644
index 00000000000..0174749b875
--- /dev/null
+++ b/addons/sale_contract/models/sale.py
@@ -0,0 +1,37 @@
+from openerp import models, fields, api
+
+
+class product_template(models.Model):
+ """ Add recurrent_invoice field to product template if it is true,
+ it will add to related contract.
+ """
+ _inherit = "product.template"
+
+ recurring_invoice = fields.Boolean(
+ string='Recurrent Invoice Product', default=False,
+ help="If selected, this product will be added to the "
+ "related contract (which must be associated with the SO). \n"
+ "It will be used as product for invoice lines and generate "
+ "the recurring invoices automatically")
+
+
+class sale_order_line(models.Model):
+ _inherit = "sale.order.line"
+
+ @api.one
+ def button_confirm(self):
+ if self.product_id.recurring_invoice and self.order_id.project_id:
+ invoice_line_ids = [((0, 0, {
+ 'product_id': self.product_id.id,
+ 'analytic_account_id': self.order_id.project_id.id,
+ 'name': self.name,
+ 'quantity': self.product_uom_qty,
+ 'uom_id': self.product_uom.id,
+ 'price_unit': self.price_unit,
+ 'price_subtotal': self.price_subtotal
+ }))]
+ analytic_values = {'recurring_invoices': True, 'recurring_invoice_line_ids': invoice_line_ids}
+ if not self.order_id.project_id.partner_id:
+ analytic_values['partner_id'] = self.order_id.partner_id.id
+ self.order_id.project_id.write(analytic_values)
+ return super(sale_order_line, self).button_confirm()
\ No newline at end of file
diff --git a/addons/account_analytic_analysis/account_analytic_analysis.py b/addons/sale_contract/models/sale_contract.py
similarity index 87%
rename from addons/account_analytic_analysis/account_analytic_analysis.py
rename to addons/sale_contract/models/sale_contract.py
index 367d5ae28af..cd0a6a77e32 100644
--- a/addons/account_analytic_analysis/account_analytic_analysis.py
+++ b/addons/sale_contract/models/sale_contract.py
@@ -623,8 +623,8 @@ class account_analytic_account(osv.osv):
fill_remind("future", [('state', 'in', ['draft', 'open']), ('date', '!=', False), ('date', '<', (datetime.datetime.now() + datetime.timedelta(30)).strftime("%Y-%m-%d"))])
context['base_url'] = self.pool.get('ir.config_parameter').get_param(cr, uid, 'web.base.url')
- context['action_id'] = self.pool.get('ir.model.data').get_object_reference(cr, uid, 'account_analytic_analysis', 'action_account_analytic_overdue_all')[1]
- template_id = self.pool.get('ir.model.data').get_object_reference(cr, uid, 'account_analytic_analysis', 'account_analytic_cron_email_template')[1]
+ context['action_id'] = self.pool.get('ir.model.data').get_object_reference(cr, uid, 'sale_contract', 'action_account_analytic_overdue_all')[1]
+ template_id = self.pool.get('ir.model.data').get_object_reference(cr, uid, 'sale_contract', 'account_analytic_cron_email_template')[1]
for user_id, data in remind.items():
context["data"] = data
_logger.debug("Sending reminder to uid %s", user_id)
@@ -763,126 +763,3 @@ class account_analytic_account(osv.osv):
else:
raise
return invoice_ids
-
-class account_analytic_account_summary_user(osv.osv):
- _name = "account_analytic_analysis.summary.user"
- _description = "Hours Summary by User"
- _order='user'
- _auto = False
- _rec_name = 'user'
-
- def _unit_amount(self, cr, uid, ids, name, arg, context=None):
- res = {}
- account_obj = self.pool.get('account.analytic.account')
- cr.execute('SELECT MAX(id) FROM res_users')
- max_user = cr.fetchone()[0]
- account_ids = [int(str(x/max_user - (x%max_user == 0 and 1 or 0))) for x in ids]
- user_ids = [int(str(x-((x/max_user - (x%max_user == 0 and 1 or 0)) *max_user))) for x in ids]
- parent_ids = tuple(account_ids) #We don't want consolidation for each of these fields because those complex computation is resource-greedy.
- if parent_ids:
- cr.execute('SELECT id, unit_amount ' \
- 'FROM account_analytic_analysis_summary_user ' \
- 'WHERE account_id IN %s ' \
- 'AND "user" IN %s',(parent_ids, tuple(user_ids),))
- for sum_id, unit_amount in cr.fetchall():
- res[sum_id] = unit_amount
- for id in ids:
- res[id] = round(res.get(id, 0.0), 2)
- return res
-
- _columns = {
- 'account_id': fields.many2one('account.analytic.account', 'Analytic Account', readonly=True),
- 'unit_amount': fields.float('Total Time'),
- 'user': fields.many2one('res.users', 'User'),
- }
-
- _depends = {
- 'res.users': ['id'],
- 'account.analytic.line': ['account_id', 'journal_id', 'unit_amount', 'user_id'],
- 'account.analytic.journal': ['type'],
- }
-
- def init(self, cr):
- openerp.tools.sql.drop_view_if_exists(cr, 'account_analytic_analysis_summary_user')
- cr.execute('''CREATE OR REPLACE VIEW account_analytic_analysis_summary_user AS (
- with mu as
- (select max(id) as max_user from res_users)
- , lu AS
- (SELECT
- l.account_id AS account_id,
- coalesce(l.user_id, 0) AS user_id,
- SUM(l.unit_amount) AS unit_amount
- FROM account_analytic_line AS l,
- account_analytic_journal AS j
- WHERE (j.type = 'general' ) and (j.id=l.journal_id)
- GROUP BY l.account_id, l.user_id
- )
- select (lu.account_id * mu.max_user) + lu.user_id as id,
- lu.account_id as account_id,
- lu.user_id as "user",
- unit_amount
- from lu, mu)''')
-
-class account_analytic_account_summary_month(osv.osv):
- _name = "account_analytic_analysis.summary.month"
- _description = "Hours summary by month"
- _auto = False
- _rec_name = 'month'
-
- _columns = {
- 'account_id': fields.many2one('account.analytic.account', 'Analytic Account', readonly=True),
- 'unit_amount': fields.float('Total Time'),
- 'month': fields.char('Month', size=32, readonly=True),
- }
-
- _depends = {
- 'account.analytic.line': ['account_id', 'date', 'journal_id', 'unit_amount'],
- 'account.analytic.journal': ['type'],
- }
-
- def init(self, cr):
- openerp.tools.sql.drop_view_if_exists(cr, 'account_analytic_analysis_summary_month')
- cr.execute('CREATE VIEW account_analytic_analysis_summary_month AS (' \
- 'SELECT ' \
- '(TO_NUMBER(TO_CHAR(d.month, \'YYYYMM\'), \'999999\') + (d.account_id * 1000000::bigint))::bigint AS id, ' \
- 'd.account_id AS account_id, ' \
- 'TO_CHAR(d.month, \'Mon YYYY\') AS month, ' \
- 'TO_NUMBER(TO_CHAR(d.month, \'YYYYMM\'), \'999999\') AS month_id, ' \
- 'COALESCE(SUM(l.unit_amount), 0.0) AS unit_amount ' \
- 'FROM ' \
- '(SELECT ' \
- 'd2.account_id, ' \
- 'd2.month ' \
- 'FROM ' \
- '(SELECT ' \
- 'a.id AS account_id, ' \
- 'l.month AS month ' \
- 'FROM ' \
- '(SELECT ' \
- 'DATE_TRUNC(\'month\', l.date) AS month ' \
- 'FROM account_analytic_line AS l, ' \
- 'account_analytic_journal AS j ' \
- 'WHERE j.type = \'general\' ' \
- 'GROUP BY DATE_TRUNC(\'month\', l.date) ' \
- ') AS l, ' \
- 'account_analytic_account AS a ' \
- 'GROUP BY l.month, a.id ' \
- ') AS d2 ' \
- 'GROUP BY d2.account_id, d2.month ' \
- ') AS d ' \
- 'LEFT JOIN ' \
- '(SELECT ' \
- 'l.account_id AS account_id, ' \
- 'DATE_TRUNC(\'month\', l.date) AS month, ' \
- 'SUM(l.unit_amount) AS unit_amount ' \
- 'FROM account_analytic_line AS l, ' \
- 'account_analytic_journal AS j ' \
- 'WHERE (j.type = \'general\') and (j.id=l.journal_id) ' \
- 'GROUP BY l.account_id, DATE_TRUNC(\'month\', l.date) ' \
- ') AS l '
- 'ON (' \
- 'd.account_id = l.account_id ' \
- 'AND d.month = l.month' \
- ') ' \
- 'GROUP BY d.month, d.account_id ' \
- ')')
diff --git a/addons/sale_contract/report/__init__.py b/addons/sale_contract/report/__init__.py
new file mode 100644
index 00000000000..6f892af3ae4
--- /dev/null
+++ b/addons/sale_contract/report/__init__.py
@@ -0,0 +1,2 @@
+# -*- coding: utf-8 -*-
+import account_analytic_analysis_summary
\ No newline at end of file
diff --git a/addons/sale_contract/report/account_analytic_analysis_summary.py b/addons/sale_contract/report/account_analytic_analysis_summary.py
new file mode 100644
index 00000000000..24eef913827
--- /dev/null
+++ b/addons/sale_contract/report/account_analytic_analysis_summary.py
@@ -0,0 +1,137 @@
+# -*- coding: utf-8 -*-
+from dateutil.relativedelta import relativedelta
+import datetime
+import logging
+import time
+
+from openerp.osv import osv, fields
+import openerp.tools
+from openerp.tools.translate import _
+from openerp.exceptions import UserError
+
+from openerp.addons.decimal_precision import decimal_precision as dp
+
+_logger = logging.getLogger(__name__)
+
+class account_analytic_account_summary_user(osv.osv):
+ _name = "account_analytic_analysis.summary.user"
+ _description = "Hours Summary by User"
+ _order='user'
+ _auto = False
+ _rec_name = 'user'
+
+ def _unit_amount(self, cr, uid, ids, name, arg, context=None):
+ res = {}
+ account_obj = self.pool.get('account.analytic.account')
+ cr.execute('SELECT MAX(id) FROM res_users')
+ max_user = cr.fetchone()[0]
+ account_ids = [int(str(x/max_user - (x%max_user == 0 and 1 or 0))) for x in ids]
+ user_ids = [int(str(x-((x/max_user - (x%max_user == 0 and 1 or 0)) *max_user))) for x in ids]
+ parent_ids = tuple(account_ids) #We don't want consolidation for each of these fields because those complex computation is resource-greedy.
+ if parent_ids:
+ cr.execute('SELECT id, unit_amount ' \
+ 'FROM account_analytic_analysis_summary_user ' \
+ 'WHERE account_id IN %s ' \
+ 'AND "user" IN %s',(parent_ids, tuple(user_ids),))
+ for sum_id, unit_amount in cr.fetchall():
+ res[sum_id] = unit_amount
+ for id in ids:
+ res[id] = round(res.get(id, 0.0), 2)
+ return res
+
+ _columns = {
+ 'account_id': fields.many2one('account.analytic.account', 'Analytic Account', readonly=True),
+ 'unit_amount': fields.float('Total Time'),
+ 'user': fields.many2one('res.users', 'User'),
+ }
+
+ _depends = {
+ 'res.users': ['id'],
+ 'account.analytic.line': ['account_id', 'journal_id', 'unit_amount', 'user_id'],
+ 'account.analytic.journal': ['type'],
+ }
+
+ def init(self, cr):
+ openerp.tools.sql.drop_view_if_exists(cr, 'account_analytic_analysis_summary_user')
+ cr.execute('''CREATE OR REPLACE VIEW account_analytic_analysis_summary_user AS (
+ with mu as
+ (select max(id) as max_user from res_users)
+ , lu AS
+ (SELECT
+ l.account_id AS account_id,
+ coalesce(l.user_id, 0) AS user_id,
+ SUM(l.unit_amount) AS unit_amount
+ FROM account_analytic_line AS l,
+ account_analytic_journal AS j
+ WHERE (j.type = 'general' ) and (j.id=l.journal_id)
+ GROUP BY l.account_id, l.user_id
+ )
+ select (lu.account_id * mu.max_user) + lu.user_id as id,
+ lu.account_id as account_id,
+ lu.user_id as "user",
+ unit_amount
+ from lu, mu)''')
+
+class account_analytic_account_summary_month(osv.osv):
+ _name = "account_analytic_analysis.summary.month"
+ _description = "Hours summary by month"
+ _auto = False
+ _rec_name = 'month'
+
+ _columns = {
+ 'account_id': fields.many2one('account.analytic.account', 'Analytic Account', readonly=True),
+ 'unit_amount': fields.float('Total Time'),
+ 'month': fields.char('Month', size=32, readonly=True),
+ }
+
+ _depends = {
+ 'account.analytic.line': ['account_id', 'date', 'journal_id', 'unit_amount'],
+ 'account.analytic.journal': ['type'],
+ }
+
+ def init(self, cr):
+ openerp.tools.sql.drop_view_if_exists(cr, 'account_analytic_analysis_summary_month')
+ cr.execute('CREATE VIEW account_analytic_analysis_summary_month AS (' \
+ 'SELECT ' \
+ '(TO_NUMBER(TO_CHAR(d.month, \'YYYYMM\'), \'999999\') + (d.account_id * 1000000::bigint))::bigint AS id, ' \
+ 'd.account_id AS account_id, ' \
+ 'TO_CHAR(d.month, \'Mon YYYY\') AS month, ' \
+ 'TO_NUMBER(TO_CHAR(d.month, \'YYYYMM\'), \'999999\') AS month_id, ' \
+ 'COALESCE(SUM(l.unit_amount), 0.0) AS unit_amount ' \
+ 'FROM ' \
+ '(SELECT ' \
+ 'd2.account_id, ' \
+ 'd2.month ' \
+ 'FROM ' \
+ '(SELECT ' \
+ 'a.id AS account_id, ' \
+ 'l.month AS month ' \
+ 'FROM ' \
+ '(SELECT ' \
+ 'DATE_TRUNC(\'month\', l.date) AS month ' \
+ 'FROM account_analytic_line AS l, ' \
+ 'account_analytic_journal AS j ' \
+ 'WHERE j.type = \'general\' ' \
+ 'GROUP BY DATE_TRUNC(\'month\', l.date) ' \
+ ') AS l, ' \
+ 'account_analytic_account AS a ' \
+ 'GROUP BY l.month, a.id ' \
+ ') AS d2 ' \
+ 'GROUP BY d2.account_id, d2.month ' \
+ ') AS d ' \
+ 'LEFT JOIN ' \
+ '(SELECT ' \
+ 'l.account_id AS account_id, ' \
+ 'DATE_TRUNC(\'month\', l.date) AS month, ' \
+ 'SUM(l.unit_amount) AS unit_amount ' \
+ 'FROM account_analytic_line AS l, ' \
+ 'account_analytic_journal AS j ' \
+ 'WHERE (j.type = \'general\') and (j.id=l.journal_id) ' \
+ 'GROUP BY l.account_id, DATE_TRUNC(\'month\', l.date) ' \
+ ') AS l '
+ 'ON (' \
+ 'd.account_id = l.account_id ' \
+ 'AND d.month = l.month' \
+ ') ' \
+ 'GROUP BY d.month, d.account_id ' \
+ ')')
diff --git a/addons/account_analytic_analysis/security/account_analytic_analysis_security.xml b/addons/sale_contract/security/account_analytic_analysis_security.xml
similarity index 100%
rename from addons/account_analytic_analysis/security/account_analytic_analysis_security.xml
rename to addons/sale_contract/security/account_analytic_analysis_security.xml
diff --git a/addons/account_analytic_analysis/security/ir.model.access.csv b/addons/sale_contract/security/ir.model.access.csv
similarity index 100%
rename from addons/account_analytic_analysis/security/ir.model.access.csv
rename to addons/sale_contract/security/ir.model.access.csv
diff --git a/addons/account_analytic_analysis/static/src/css/analytic.css b/addons/sale_contract/static/src/css/analytic.css
similarity index 100%
rename from addons/account_analytic_analysis/static/src/css/analytic.css
rename to addons/sale_contract/static/src/css/analytic.css
diff --git a/addons/account_analytic_analysis/static/src/css/analytic.sass b/addons/sale_contract/static/src/css/analytic.sass
similarity index 100%
rename from addons/account_analytic_analysis/static/src/css/analytic.sass
rename to addons/sale_contract/static/src/css/analytic.sass
diff --git a/addons/account_analytic_analysis/test/account_analytic_analysis.yml b/addons/sale_contract/test/account_analytic_analysis.yml
similarity index 80%
rename from addons/account_analytic_analysis/test/account_analytic_analysis.yml
rename to addons/sale_contract/test/account_analytic_analysis.yml
index 947667b0fe7..00476a6f003 100644
--- a/addons/account_analytic_analysis/test/account_analytic_analysis.yml
+++ b/addons/sale_contract/test/account_analytic_analysis.yml
@@ -19,14 +19,14 @@
-
!record {model: account.analytic.account, id: contract_main}:
partner_id: base.main_partner
- template_id: account_analytic_analysis.contract_template
+ template_id: sale_contract.contract_template
type: contract
-
I check that the contract inherited from data of the template
-
!python {model: account.analytic.account}: |
- contract = self.browse(cr, uid, ref('account_analytic_analysis.contract_main'))
- template = self.browse(cr, uid, ref('account_analytic_analysis.contract_template'))
+ contract = self.browse(cr, uid, ref('sale_contract.contract_main'))
+ template = self.browse(cr, uid, ref('sale_contract.contract_template'))
assert template.recurring_interval == contract.recurring_interval, "The recurring interval of the contract does not match with the contract template"
assert template.recurring_invoices == contract.recurring_invoices, "Invoice method of contract does not match with the contract template"
-
@@ -39,8 +39,8 @@
-
!python {model: account.invoice}: |
from openerp.tools import float_compare
- aid = ref('account_analytic_analysis.contract_main')
- ids = self.search(cr, uid, [('invoice_line_ids.account_analytic_id','=',aid)], context=context)
+ aid = ref('sale_contract.contract_main')
+ ids = self.search(cr, uid, [('invoice_line.analytic_account_id','=',aid)], context=context)
assert len(ids)>=1, 'No invoice created for the contract'
for invoice in self.browse(cr, uid, ids,context=context):
assert float_compare(invoice.amount_untaxed, 150.0, precision_digits=2) == 0, "The invoice total is different than 150!"
diff --git a/addons/account_analytic_analysis/views/account_analytic_analysis.xml b/addons/sale_contract/views/account_analytic_analysis.xml
similarity index 73%
rename from addons/account_analytic_analysis/views/account_analytic_analysis.xml
rename to addons/sale_contract/views/account_analytic_analysis.xml
index d54b80ece15..4b0c339bc20 100644
--- a/addons/account_analytic_analysis/views/account_analytic_analysis.xml
+++ b/addons/sale_contract/views/account_analytic_analysis.xml
@@ -3,7 +3,7 @@
-
+
diff --git a/addons/sale_contract/views/product_template_view.xml b/addons/sale_contract/views/product_template_view.xml
new file mode 100644
index 00000000000..3a24fb3d458
--- /dev/null
+++ b/addons/sale_contract/views/product_template_view.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+ product_template_form_view.inherit
+ product.template
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/addons/account_analytic_analysis/res_config_view.xml b/addons/sale_contract/views/res_config_view.xml
similarity index 96%
rename from addons/account_analytic_analysis/res_config_view.xml
rename to addons/sale_contract/views/res_config_view.xml
index e9f2ddad7e8..9f9b778d308 100644
--- a/addons/account_analytic_analysis/res_config_view.xml
+++ b/addons/sale_contract/views/res_config_view.xml
@@ -17,7 +17,7 @@
0
-
+
diff --git a/addons/account_analytic_analysis/account_analytic_analysis_view.xml b/addons/sale_contract/views/sale_contract_view.xml
similarity index 99%
rename from addons/account_analytic_analysis/account_analytic_analysis_view.xml
rename to addons/sale_contract/views/sale_contract_view.xml
index 73360859062..cfd002256e7 100644
--- a/addons/account_analytic_analysis/account_analytic_analysis_view.xml
+++ b/addons/sale_contract/views/sale_contract_view.xml
@@ -368,7 +368,7 @@
-
+ account.analytic.account.invoice.form.inheritaccount.analytic.account