From 107f5141896319d9c3ae351c7942f1f5e0ad2e55 Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 4 Feb 2014 14:41:42 +0100 Subject: [PATCH 01/15] Add account_analytic_analysis_recurring --- contract/__init__.py | 22 ++ contract/__openerp__.py | 46 ++++ .../account_analytic_analysis_recurring.py | 209 ++++++++++++++++++ ...count_analytic_analysis_recurring_cron.xml | 16 ++ ...count_analytic_analysis_recurring_view.xml | 44 ++++ 5 files changed, 337 insertions(+) create mode 100644 contract/__init__.py create mode 100644 contract/__openerp__.py create mode 100644 contract/account_analytic_analysis_recurring.py create mode 100644 contract/account_analytic_analysis_recurring_cron.xml create mode 100644 contract/account_analytic_analysis_recurring_view.xml diff --git a/contract/__init__.py b/contract/__init__.py new file mode 100644 index 000000000..7088b5aa8 --- /dev/null +++ b/contract/__init__.py @@ -0,0 +1,22 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# OpenERP, Open Source Management Solution +# Copyright (C) 2004-2010 Tiny SPRL () +# +# 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 . +# +############################################################################## + +import account_analytic_analysis_recurring diff --git a/contract/__openerp__.py b/contract/__openerp__.py new file mode 100644 index 000000000..0c417361a --- /dev/null +++ b/contract/__openerp__.py @@ -0,0 +1,46 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# OpenERP, Open Source Management Solution +# Copyright (C) 2004-2010 Tiny SPRL (). +# +# 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 . +# +############################################################################## + + +{ + 'name': 'Contracts Management recurring', + 'version': '0.1', + 'category': 'Other', + 'description': """ +This module add a new feature in contracts to manage recurring invoice +======================================================================================= + +This is a backport of the new V8 feature available in trunk and saas. With the V8 release this module will be deprecated. +It also add a little feature, you can use #START# and #END# in the contract line to automatically insert the dates of the invoiced period. +""", + 'author': 'Yannick Buron', + 'website': 'http://openerp.com', + 'depends': ['base', 'account_analytic_analysis'], + 'data': [ + 'account_analytic_analysis_recurring_cron.xml', + 'account_analytic_analysis_recurring_view.xml', + ], + 'demo': [''], + 'test':[], + 'installable': True, + 'images': [], +} +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/contract/account_analytic_analysis_recurring.py b/contract/account_analytic_analysis_recurring.py new file mode 100644 index 000000000..2b85cce6d --- /dev/null +++ b/contract/account_analytic_analysis_recurring.py @@ -0,0 +1,209 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# OpenERP, Open Source Management Solution +# Copyright (C) 2004-2010 Tiny SPRL (). +# +# 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 dateutil.relativedelta import relativedelta +import datetime +import logging +import time + +from openerp.osv import osv, fields +from openerp.osv.orm import intersect, except_orm +import openerp.tools +from openerp.tools.translate import _ + +from openerp.addons.decimal_precision import decimal_precision as dp + +_logger = logging.getLogger(__name__) + +class account_analytic_invoice_line(osv.osv): + _name = "account.analytic.invoice.line" + + def _amount_line(self, cr, uid, ids, prop, unknow_none, unknow_dict, context=None): + res = {} + for line in self.browse(cr, uid, ids, context=context): + res[line.id] = line.quantity * line.price_unit + if line.analytic_account_id.pricelist_id: + cur = line.analytic_account_id.pricelist_id.currency_id + res[line.id] = self.pool.get('res.currency').round(cr, uid, cur, res[line.id]) + return res + + _columns = { + 'product_id': fields.many2one('product.product','Product',required=True), + 'analytic_account_id': fields.many2one('account.analytic.account', 'Analytic Account'), + 'name': fields.text('Description', required=True), + 'quantity': fields.float('Quantity', required=True), + 'uom_id': fields.many2one('product.uom', 'Unit of Measure',required=True), + 'price_unit': fields.float('Unit Price', required=True), + 'price_subtotal': fields.function(_amount_line, string='Sub Total', type="float",digits_compute= dp.get_precision('Account')), + } + _defaults = { + 'quantity' : 1, + } + + def product_id_change(self, cr, uid, ids, product, uom_id, qty=0, name='', partner_id=False, price_unit=False, pricelist_id=False, company_id=None, context=None): + context = context or {} + uom_obj = self.pool.get('product.uom') + company_id = company_id or False + context.update({'company_id': company_id, 'force_company': company_id, 'pricelist_id': pricelist_id}) + + if not product: + return {'value': {'price_unit': 0.0}, 'domain':{'product_uom':[]}} + if partner_id: + part = self.pool.get('res.partner').browse(cr, uid, partner_id, context=context) + if part.lang: + context.update({'lang': part.lang}) + + result = {} + res = self.pool.get('product.product').browse(cr, uid, product, context=context) + result.update({'name':res.partner_ref or False,'uom_id': uom_id or res.uom_id.id or False, 'price_unit': res.list_price or 0.0}) + if res.description: + result['name'] += '\n'+res.description + + res_final = {'value':result} + if result['uom_id'] != res.uom_id.id: + selected_uom = uom_obj.browse(cr, uid, result['uom_id'], context=context) + new_price = uom_obj._compute_price(cr, uid, res.uom_id.id, res_final['value']['price_unit'], result['uom_id']) + res_final['value']['price_unit'] = new_price + return res_final + + +class account_analytic_account(osv.osv): + _name = "account.analytic.account" + _inherit = "account.analytic.account" + + _columns = { + 'recurring_invoice_line_ids': fields.one2many('account.analytic.invoice.line', 'analytic_account_id', 'Invoice Lines'), + 'recurring_invoices' : fields.boolean('Generate recurring invoices automatically'), + 'recurring_rule_type': fields.selection([ + ('daily', 'Day(s)'), + ('weekly', 'Week(s)'), + ('monthly', 'Month(s)'), + ('yearly', 'Year(s)'), + ], 'Recurrency', help="Invoice automatically repeat at specified interval"), + 'recurring_interval': fields.integer('Repeat Every', help="Repeat every (Days/Week/Month/Year)"), + 'recurring_next_date': fields.date('Date of Next Invoice'), + } + + _defaults = { + 'recurring_interval': 1, + 'recurring_next_date': lambda *a: time.strftime('%Y-%m-%d'), + 'recurring_rule_type':'monthly' + } + + def onchange_recurring_invoices(self, cr, uid, ids, recurring_invoices, date_start=False, context=None): + value = {} + if date_start and recurring_invoices: + value = {'value': {'recurring_next_date': date_start}} + return value + + def _prepare_invoice(self, cr, uid, contract, context=None): + context = context or {} + + inv_obj = self.pool.get('account.invoice') + journal_obj = self.pool.get('account.journal') + fpos_obj = self.pool.get('account.fiscal.position') + lang_obj = self.pool.get('res.lang') + + if not contract.partner_id: + raise osv.except_osv(_('No Customer Defined!'),_("You must first select a Customer for Contract %s!") % contract.name ) + + fpos = contract.partner_id.property_account_position or False + journal_ids = journal_obj.search(cr, uid, [('type', '=','sale'),('company_id', '=', contract.company_id.id or False)], limit=1) + if not journal_ids: + raise osv.except_osv(_('Error!'), + _('Please define a sale journal for the company "%s".') % (contract.company_id.name or '', )) + + partner_payment_term = contract.partner_id.property_payment_term and contract.partner_id.property_payment_term.id or False + + + inv_data = { + 'reference': contract.code or False, + 'account_id': contract.partner_id.property_account_receivable.id, + 'type': 'out_invoice', + 'partner_id': contract.partner_id.id, + 'currency_id': contract.partner_id.property_product_pricelist.id or False, + 'journal_id': len(journal_ids) and journal_ids[0] or False, + 'date_invoice': contract.recurring_next_date, + 'origin': contract.name, + 'fiscal_position': fpos and fpos.id, + 'payment_term': partner_payment_term, + 'company_id': contract.company_id.id or False, + } + invoice_id = inv_obj.create(cr, uid, inv_data, context=context) + + for line in contract.recurring_invoice_line_ids: + + res = line.product_id + account_id = res.property_account_income.id + if not account_id: + account_id = res.categ_id.property_account_income_categ.id + account_id = fpos_obj.map_account(cr, uid, fpos, account_id) + + taxes = res.taxes_id or False + tax_id = fpos_obj.map_tax(cr, uid, fpos, taxes) + + if 'old_date' in context: + lang_ids = lang_obj.search(cr, uid, [('code', '=', contract.partner_id.lang)], context=context) + format = lang_obj.browse(cr, uid, lang_ids, context=context)[0].date_format + line.name = line.name.replace('#START#', context['old_date'].strftime(format)) + line.name = line.name.replace('#END#', context['next_date'].strftime(format)) + + invoice_line_vals = { + 'name': line.name, + 'account_id': account_id, + 'account_analytic_id': contract.id, + 'price_unit': line.price_unit or 0.0, + 'quantity': line.quantity, + 'uos_id': line.uom_id.id or False, + 'product_id': line.product_id.id or False, + 'invoice_id' : invoice_id, + 'invoice_line_tax_id': [(6, 0, tax_id)], + } + self.pool.get('account.invoice.line').create(cr, uid, invoice_line_vals, context=context) + + inv_obj.button_compute(cr, uid, [invoice_id], context=context) + return invoice_id + + def recurring_create_invoice(self, cr, uid, automatic=False, context=None): + context = context or {} + current_date = time.strftime('%Y-%m-%d') + + contract_ids = self.search(cr, uid, [('recurring_next_date','<=', current_date), ('state','=', 'open'), ('recurring_invoices','=', True)]) + for contract in self.browse(cr, uid, contract_ids, context=context): + + next_date = datetime.datetime.strptime(contract.recurring_next_date or current_date, "%Y-%m-%d") + interval = contract.recurring_interval + if contract.recurring_rule_type == 'daily': + old_date = next_date-relativedelta(days=+interval) + new_date = next_date+relativedelta(days=+interval) + elif contract.recurring_rule_type == 'weekly': + old_date = next_date-relativedelta(weeks=+interval) + new_date = next_date+relativedelta(weeks=+interval) + else: + old_date = next_date+relativedelta(months=+interval) + new_date = next_date+relativedelta(months=+interval) + + context['old_date'] = old_date + context['next_date'] = datetime.datetime.strptime(contract.recurring_next_date or current_date,"%Y-%m-%d") + invoice_id = self._prepare_invoice(cr, uid, contract, context=context) + + self.write(cr, uid, [contract.id], {'recurring_next_date': new_date.strftime('%Y-%m-%d')}, context=context) + return True + diff --git a/contract/account_analytic_analysis_recurring_cron.xml b/contract/account_analytic_analysis_recurring_cron.xml new file mode 100644 index 000000000..95ae54de8 --- /dev/null +++ b/contract/account_analytic_analysis_recurring_cron.xml @@ -0,0 +1,16 @@ + + + + + + Generate Recurring Invoices from Contracts + 1 + days + -1 + + + + + + + diff --git a/contract/account_analytic_analysis_recurring_view.xml b/contract/account_analytic_analysis_recurring_view.xml new file mode 100644 index 000000000..e28934767 --- /dev/null +++ b/contract/account_analytic_analysis_recurring_view.xml @@ -0,0 +1,44 @@ + + + + + + account.analytic.account.invoice.recurring.form.inherit + account.analytic.account + + + + + +
+ +
+ + +
+
+
+ +
+
From fa624403414bd1ca72a932f1302a8bbabc83ea04 Mon Sep 17 00:00:00 2001 From: unknown Date: Fri, 21 Feb 2014 12:43:57 +0100 Subject: [PATCH 02/15] Corrections following the feedback of MP --- contract/__openerp__.py | 4 +- .../account_analytic_analysis_recurring.pot | 129 ++++++++++++++++++ 2 files changed, 132 insertions(+), 1 deletion(-) create mode 100644 contract/account_analytic_analysis_recurring.pot diff --git a/contract/__openerp__.py b/contract/__openerp__.py index 0c417361a..cfdd15fc8 100644 --- a/contract/__openerp__.py +++ b/contract/__openerp__.py @@ -30,8 +30,10 @@ This module add a new feature in contracts to manage recurring invoice This is a backport of the new V8 feature available in trunk and saas. With the V8 release this module will be deprecated. It also add a little feature, you can use #START# and #END# in the contract line to automatically insert the dates of the invoiced period. + +Backport done By Yannick Buron. """, - 'author': 'Yannick Buron', + 'author': 'OpenERP SA', 'website': 'http://openerp.com', 'depends': ['base', 'account_analytic_analysis'], 'data': [ diff --git a/contract/account_analytic_analysis_recurring.pot b/contract/account_analytic_analysis_recurring.pot new file mode 100644 index 000000000..7d2f21f1f --- /dev/null +++ b/contract/account_analytic_analysis_recurring.pot @@ -0,0 +1,129 @@ +# Translation of OpenERP Server. +# This file contains the translation of the following modules: +# * account_analytic_analysis_recurring +# +msgid "" +msgstr "" +"Project-Id-Version: OpenERP Server 7.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2014-02-21 11:41+0000\n" +"PO-Revision-Date: 2014-02-21 11:41+0000\n" +"Last-Translator: <>\n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: account_analytic_analysis_recurring +#: field:account.analytic.invoice.line,price_subtotal:0 +msgid "Sub Total" +msgstr "" + +#. module: account_analytic_analysis_recurring +#: field:account.analytic.account,recurring_rule_type:0 +msgid "Recurrency" +msgstr "" + +#. module: account_analytic_analysis_recurring +#: field:account.analytic.invoice.line,price_unit:0 +msgid "Unit Price" +msgstr "" + +#. module: account_analytic_analysis_recurring +#: view:account.analytic.account:0 +msgid ". create invoices" +msgstr "" + +#. module: account_analytic_analysis_recurring +#: view:account.analytic.account:0 +msgid "Account Analytic Lines" +msgstr "" + +#. module: account_analytic_analysis_recurring +#: field:account.analytic.account,recurring_invoice_line_ids:0 +msgid "Invoice Lines" +msgstr "" + +#. module: account_analytic_analysis_recurring +#: field:account.analytic.invoice.line,uom_id:0 +msgid "Unit of Measure" +msgstr "" + +#. module: account_analytic_analysis_recurring +#: selection:account.analytic.account,recurring_rule_type:0 +msgid "Day(s)" +msgstr "" + +#. module: account_analytic_analysis_recurring +#: help:account.analytic.account,recurring_rule_type:0 +msgid "Invoice automatically repeat at specified interval" +msgstr "" + +#. module: account_analytic_analysis_recurring +#: field:account.analytic.invoice.line,product_id:0 +msgid "Product" +msgstr "" + +#. module: account_analytic_analysis_recurring +#: field:account.analytic.invoice.line,name:0 +msgid "Description" +msgstr "" + +#. module: account_analytic_analysis_recurring +#: field:account.analytic.account,recurring_interval:0 +msgid "Repeat Every" +msgstr "" + +#. module: account_analytic_analysis_recurring +#: view:account.analytic.account:0 +msgid "Recurring Invoices" +msgstr "" + +#. module: account_analytic_analysis_recurring +#: field:account.analytic.account,recurring_invoices:0 +msgid "Generate recurring invoices automatically" +msgstr "" + +#. module: account_analytic_analysis_recurring +#: selection:account.analytic.account,recurring_rule_type:0 +msgid "Year(s)" +msgstr "" + +#. module: account_analytic_analysis_recurring +#: selection:account.analytic.account,recurring_rule_type:0 +msgid "Week(s)" +msgstr "" + +#. module: account_analytic_analysis_recurring +#: field:account.analytic.invoice.line,quantity:0 +msgid "Quantity" +msgstr "" + +#. module: account_analytic_analysis_recurring +#: model:ir.model,name:account_analytic_analysis_recurring.model_account_analytic_invoice_line +msgid "account.analytic.invoice.line" +msgstr "" + +#. module: account_analytic_analysis_recurring +#: field:account.analytic.account,recurring_next_date:0 +msgid "Date of Next Invoice" +msgstr "" + +#. module: account_analytic_analysis_recurring +#: field:account.analytic.invoice.line,analytic_account_id:0 +#: model:ir.model,name:account_analytic_analysis_recurring.model_account_analytic_account +msgid "Analytic Account" +msgstr "" + +#. module: account_analytic_analysis_recurring +#: selection:account.analytic.account,recurring_rule_type:0 +msgid "Month(s)" +msgstr "" + +#. module: account_analytic_analysis_recurring +#: help:account.analytic.account,recurring_interval:0 +msgid "Repeat every (Days/Week/Month/Year)" +msgstr "" + + From d49952ea703b9dc3e6d17a7ca0c6d5345d3b9ed9 Mon Sep 17 00:00:00 2001 From: Stefan Rijnhart Date: Fri, 11 Jul 2014 16:18:08 +0200 Subject: [PATCH 03/15] [ADD] Pot file and Dutch translation --- .../account_analytic_analysis_recurring.pot | 145 ++++++++++++++++ contract/i18n/nl.po | 156 ++++++++++++++++++ 2 files changed, 301 insertions(+) create mode 100644 contract/i18n/account_analytic_analysis_recurring.pot create mode 100644 contract/i18n/nl.po diff --git a/contract/i18n/account_analytic_analysis_recurring.pot b/contract/i18n/account_analytic_analysis_recurring.pot new file mode 100644 index 000000000..ce2499c51 --- /dev/null +++ b/contract/i18n/account_analytic_analysis_recurring.pot @@ -0,0 +1,145 @@ +# Translation of OpenERP Server. +# This file contains the translation of the following modules: +# * account_analytic_analysis_recurring +# +msgid "" +msgstr "" + +#. module: account_analytic_analysis_recurring +#: view:account.analytic.account:0 +msgid ". create invoices" +msgstr "" + +#. module: account_analytic_analysis_recurring +#: view:account.analytic.account:0 +msgid "Account Analytic Lines" +msgstr "" + +#. module: account_analytic_analysis_recurring +#: code:_description:0 +#: field:account.analytic.invoice.line,analytic_account_id:0 +#: model:ir.model,name:account_analytic_analysis_recurring.model_account_analytic_account +#, python-format +msgid "Analytic Account" +msgstr "" + +#. module: account_analytic_analysis_recurring +#: field:account.analytic.account,recurring_next_date:0 +msgid "Date of Next Invoice" +msgstr "" + +#. module: account_analytic_analysis_recurring +#: selection:account.analytic.account,recurring_rule_type:0 +msgid "Day(s)" +msgstr "" + +#. module: account_analytic_analysis_recurring +#: field:account.analytic.invoice.line,name:0 +msgid "Description" +msgstr "" + +#. module: account_analytic_analysis_recurring +#: code:addons/account_analytic_analysis_recurring/account_analytic_analysis_recurring.py:130 +#, python-format +msgid "Error!" +msgstr "" + +#. module: account_analytic_analysis_recurring +#: field:account.analytic.account,recurring_invoices:0 +msgid "Generate recurring invoices automatically" +msgstr "" + +#. module: account_analytic_analysis_recurring +#: field:account.analytic.account,recurring_invoice_line_ids:0 +msgid "Invoice Lines" +msgstr "" + +#. module: account_analytic_analysis_recurring +#: help:account.analytic.account,recurring_rule_type:0 +msgid "Invoice automatically repeat at specified interval" +msgstr "" + +#. module: account_analytic_analysis_recurring +#: selection:account.analytic.account,recurring_rule_type:0 +msgid "Month(s)" +msgstr "" + +#. module: account_analytic_analysis_recurring +#: code:addons/account_analytic_analysis_recurring/account_analytic_analysis_recurring.py:125 +#, python-format +msgid "No Customer Defined!" +msgstr "" + +#. module: account_analytic_analysis_recurring +#: code:addons/account_analytic_analysis_recurring/account_analytic_analysis_recurring.py:131 +#, python-format +msgid "Please define a sale journal for the company \"%s\"." +msgstr "" + +#. module: account_analytic_analysis_recurring +#: field:account.analytic.invoice.line,product_id:0 +msgid "Product" +msgstr "" + +#. module: account_analytic_analysis_recurring +#: field:account.analytic.invoice.line,quantity:0 +msgid "Quantity" +msgstr "" + +#. module: account_analytic_analysis_recurring +#: field:account.analytic.account,recurring_rule_type:0 +msgid "Recurrency" +msgstr "" + +#. module: account_analytic_analysis_recurring +#: view:account.analytic.account:0 +msgid "Recurring Invoices" +msgstr "" + +#. module: account_analytic_analysis_recurring +#: field:account.analytic.account,recurring_interval:0 +msgid "Repeat Every" +msgstr "" + +#. module: account_analytic_analysis_recurring +#: help:account.analytic.account,recurring_interval:0 +msgid "Repeat every (Days/Week/Month/Year)" +msgstr "" + +#. module: account_analytic_analysis_recurring +#: field:account.analytic.invoice.line,price_subtotal:0 +msgid "Sub Total" +msgstr "" + +#. module: account_analytic_analysis_recurring +#: field:account.analytic.invoice.line,price_unit:0 +msgid "Unit Price" +msgstr "" + +#. module: account_analytic_analysis_recurring +#: field:account.analytic.invoice.line,uom_id:0 +msgid "Unit of Measure" +msgstr "" + +#. module: account_analytic_analysis_recurring +#: selection:account.analytic.account,recurring_rule_type:0 +msgid "Week(s)" +msgstr "" + +#. module: account_analytic_analysis_recurring +#: selection:account.analytic.account,recurring_rule_type:0 +msgid "Year(s)" +msgstr "" + +#. module: account_analytic_analysis_recurring +#: code:addons/account_analytic_analysis_recurring/account_analytic_analysis_recurring.py:125 +#, python-format +msgid "You must first select a Customer for Contract %s!" +msgstr "" + +#. module: account_analytic_analysis_recurring +#: code:_description:0 +#: model:ir.model,name:account_analytic_analysis_recurring.model_account_analytic_invoice_line +#, python-format +msgid "account.analytic.invoice.line" +msgstr "" diff --git a/contract/i18n/nl.po b/contract/i18n/nl.po new file mode 100644 index 000000000..b04b804dd --- /dev/null +++ b/contract/i18n/nl.po @@ -0,0 +1,156 @@ +# Translation of OpenERP Server. +# This file contains the translation of the following modules: +# * account_analytic_analysis_recurring +# +msgid "" +msgstr "" +"Project-Id-Version: OpenERP Server 7.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2014-07-11 13:24+0000\n" +"PO-Revision-Date: 2014-07-11 13:24+0000\n" +"Last-Translator: <>\n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: account_analytic_analysis_recurring +#: view:account.analytic.account:0 +msgid ". create invoices" +msgstr ". create invoices" + +#. module: account_analytic_analysis_recurring +#: view:account.analytic.account:0 +msgid "Account Analytic Lines" +msgstr "Kostenplaatsenboekingen" + +#. module: account_analytic_analysis_recurring +#: code:_description:0 +#: field:account.analytic.invoice.line,analytic_account_id:0 +#: model:ir.model,name:account_analytic_analysis_recurring.model_account_analytic_account +#, python-format +msgid "Analytic Account" +msgstr "Kostenplaats" + +#. module: account_analytic_analysis_recurring +#: field:account.analytic.account,recurring_next_date:0 +msgid "Date of Next Invoice" +msgstr "Datum volgende factuur" + +#. module: account_analytic_analysis_recurring +#: selection:account.analytic.account,recurring_rule_type:0 +msgid "Day(s)" +msgstr "Dag(en)" + +#. module: account_analytic_analysis_recurring +#: field:account.analytic.invoice.line,name:0 +msgid "Description" +msgstr "Omschrijving" + +#. module: account_analytic_analysis_recurring +#: code:addons/account_analytic_analysis_recurring/account_analytic_analysis_recurring.py:130 +#, python-format +msgid "Error!" +msgstr "Fout" + +#. module: account_analytic_analysis_recurring +#: field:account.analytic.account,recurring_invoices:0 +msgid "Generate recurring invoices automatically" +msgstr "Periodieke facturering" + +#. module: account_analytic_analysis_recurring +#: field:account.analytic.account,recurring_invoice_line_ids:0 +msgid "Invoice Lines" +msgstr "Sjablonen factuurregels" + +#. module: account_analytic_analysis_recurring +#: help:account.analytic.account,recurring_rule_type:0 +msgid "Invoice automatically repeat at specified interval" +msgstr "Factureer automatisch met dit interval" + +#. module: account_analytic_analysis_recurring +#: selection:account.analytic.account,recurring_rule_type:0 +msgid "Month(s)" +msgstr "Maand(en)" + +#. module: account_analytic_analysis_recurring +#: code:addons/account_analytic_analysis_recurring/account_analytic_analysis_recurring.py:125 +#, python-format +msgid "No Customer Defined!" +msgstr "Er is geen klant ingesteld." + +#. module: account_analytic_analysis_recurring +#: code:addons/account_analytic_analysis_recurring/account_analytic_analysis_recurring.py:131 +#, python-format +msgid "Please define a sale journal for the company \"%s\"." +msgstr "Er moet een inkoopdagboek worden ingesteld voor bedrijf \"%s\"." + +#. module: account_analytic_analysis_recurring +#: field:account.analytic.invoice.line,product_id:0 +msgid "Product" +msgstr "Product" + +#. module: account_analytic_analysis_recurring +#: field:account.analytic.invoice.line,quantity:0 +msgid "Quantity" +msgstr "Hoeveelheid" + +#. module: account_analytic_analysis_recurring +#: field:account.analytic.account,recurring_rule_type:0 +msgid "Recurrency" +msgstr "Herhaling" + +#. module: account_analytic_analysis_recurring +#: view:account.analytic.account:0 +msgid "Recurring Invoices" +msgstr "Periodieke facturen" + +#. module: account_analytic_analysis_recurring +#: field:account.analytic.account,recurring_interval:0 +msgid "Repeat Every" +msgstr "Herhaal elke:" + +#. module: account_analytic_analysis_recurring +#: help:account.analytic.account,recurring_interval:0 +msgid "Repeat every (Days/Week/Month/Year)" +msgstr "Herhaal elke (dag/week/maand/jaar)" + +#. module: account_analytic_analysis_recurring +#: field:account.analytic.invoice.line,price_subtotal:0 +msgid "Sub Total" +msgstr "Subtotaal" + +#. module: account_analytic_analysis_recurring +#: field:account.analytic.invoice.line,price_unit:0 +msgid "Unit Price" +msgstr "Prijs per eenheid" + +#. module: account_analytic_analysis_recurring +#: field:account.analytic.invoice.line,uom_id:0 +msgid "Unit of Measure" +msgstr "Maateenheid" + +#. module: account_analytic_analysis_recurring +#: selection:account.analytic.account,recurring_rule_type:0 +msgid "Week(s)" +msgstr "Week/weken" + +#. module: account_analytic_analysis_recurring +#: selection:account.analytic.account,recurring_rule_type:0 +msgid "Year(s)" +msgstr "Jaar" + +#. module: account_analytic_analysis_recurring +#: code:addons/account_analytic_analysis_recurring/account_analytic_analysis_recurring.py:125 +#, python-format +msgid "You must first select a Customer for Contract %s!" +msgstr " Er moet eerst een klant worden ingesteld op contract %s!" + +#. module: account_analytic_analysis_recurring +#: code:_description:0 +#: model:ir.model,name:account_analytic_analysis_recurring.model_account_analytic_invoice_line +#, python-format +msgid "account.analytic.invoice.line" +msgstr "account.analytic.invoice.line" + From 7b1b64bf05364fff43789a901c417554c1461e57 Mon Sep 17 00:00:00 2001 From: Stefan Rijnhart Date: Fri, 11 Jul 2014 16:18:31 +0200 Subject: [PATCH 04/15] [RFR] PEP8 --- contract/__openerp__.py | 11 +- .../account_analytic_analysis_recurring.py | 168 ++++++++++++------ 2 files changed, 116 insertions(+), 63 deletions(-) diff --git a/contract/__openerp__.py b/contract/__openerp__.py index cfdd15fc8..3e323eb29 100644 --- a/contract/__openerp__.py +++ b/contract/__openerp__.py @@ -26,10 +26,13 @@ 'category': 'Other', 'description': """ This module add a new feature in contracts to manage recurring invoice -======================================================================================= +====================================================================== -This is a backport of the new V8 feature available in trunk and saas. With the V8 release this module will be deprecated. -It also add a little feature, you can use #START# and #END# in the contract line to automatically insert the dates of the invoiced period. +This is a backport of the new V8 feature available in trunk and saas. With +the V8 release this module will be deprecated. + +It also add a little feature, you can use #START# and #END# in the contract +line to automatically insert the dates of the invoiced period. Backport done By Yannick Buron. """, @@ -41,7 +44,7 @@ Backport done By Yannick Buron. 'account_analytic_analysis_recurring_view.xml', ], 'demo': [''], - 'test':[], + 'test': [], 'installable': True, 'images': [], } diff --git a/contract/account_analytic_analysis_recurring.py b/contract/account_analytic_analysis_recurring.py index 2b85cce6d..f6f0d71ec 100644 --- a/contract/account_analytic_analysis_recurring.py +++ b/contract/account_analytic_analysis_recurring.py @@ -24,62 +24,82 @@ import logging import time from openerp.osv import osv, fields -from openerp.osv.orm import intersect, except_orm -import openerp.tools from openerp.tools.translate import _ from openerp.addons.decimal_precision import decimal_precision as dp _logger = logging.getLogger(__name__) + class account_analytic_invoice_line(osv.osv): _name = "account.analytic.invoice.line" - def _amount_line(self, cr, uid, ids, prop, unknow_none, unknow_dict, context=None): + def _amount_line( + self, cr, uid, ids, prop, unknow_none, unknow_dict, context=None): res = {} for line in self.browse(cr, uid, ids, context=context): res[line.id] = line.quantity * line.price_unit if line.analytic_account_id.pricelist_id: cur = line.analytic_account_id.pricelist_id.currency_id - res[line.id] = self.pool.get('res.currency').round(cr, uid, cur, res[line.id]) + res[line.id] = self.pool.get('res.currency').round( + cr, uid, cur, res[line.id]) return res _columns = { - 'product_id': fields.many2one('product.product','Product',required=True), - 'analytic_account_id': fields.many2one('account.analytic.account', 'Analytic Account'), + 'product_id': fields.many2one( + 'product.product', 'Product', required=True), + 'analytic_account_id': fields.many2one( + 'account.analytic.account', 'Analytic Account'), 'name': fields.text('Description', required=True), 'quantity': fields.float('Quantity', required=True), - 'uom_id': fields.many2one('product.uom', 'Unit of Measure',required=True), + 'uom_id': fields.many2one( + 'product.uom', 'Unit of Measure', required=True), 'price_unit': fields.float('Unit Price', required=True), - 'price_subtotal': fields.function(_amount_line, string='Sub Total', type="float",digits_compute= dp.get_precision('Account')), + 'price_subtotal': fields.function( + _amount_line, string='Sub Total', + type="float", digits_compute=dp.get_precision('Account')), } _defaults = { - 'quantity' : 1, + 'quantity': 1, } - def product_id_change(self, cr, uid, ids, product, uom_id, qty=0, name='', partner_id=False, price_unit=False, pricelist_id=False, company_id=None, context=None): + def product_id_change( + self, cr, uid, ids, product, uom_id, qty=0, name='', + partner_id=False, price_unit=False, pricelist_id=False, + company_id=None, context=None): context = context or {} uom_obj = self.pool.get('product.uom') company_id = company_id or False - context.update({'company_id': company_id, 'force_company': company_id, 'pricelist_id': pricelist_id}) + context.update( + {'company_id': company_id, + 'force_company': company_id, + 'pricelist_id': pricelist_id}) if not product: - return {'value': {'price_unit': 0.0}, 'domain':{'product_uom':[]}} + return { + 'value': {'price_unit': 0.0}, + 'domain': {'product_uom': []}} if partner_id: - part = self.pool.get('res.partner').browse(cr, uid, partner_id, context=context) + part = self.pool.get('res.partner').browse( + cr, uid, partner_id, context=context) if part.lang: context.update({'lang': part.lang}) result = {} - res = self.pool.get('product.product').browse(cr, uid, product, context=context) - result.update({'name':res.partner_ref or False,'uom_id': uom_id or res.uom_id.id or False, 'price_unit': res.list_price or 0.0}) + res = self.pool.get('product.product').browse( + cr, uid, product, context=context) + result.update( + {'name': res.partner_ref or False, + 'uom_id': uom_id or res.uom_id.id or False, + 'price_unit': res.list_price or 0.0}) if res.description: result['name'] += '\n'+res.description - res_final = {'value':result} + res_final = {'value': result} if result['uom_id'] != res.uom_id.id: - selected_uom = uom_obj.browse(cr, uid, result['uom_id'], context=context) - new_price = uom_obj._compute_price(cr, uid, res.uom_id.id, res_final['value']['price_unit'], result['uom_id']) + new_price = uom_obj._compute_price( + cr, uid, res.uom_id.id, + res_final['value']['price_unit'], result['uom_id']) res_final['value']['price_unit'] = new_price return res_final @@ -89,25 +109,32 @@ class account_analytic_account(osv.osv): _inherit = "account.analytic.account" _columns = { - 'recurring_invoice_line_ids': fields.one2many('account.analytic.invoice.line', 'analytic_account_id', 'Invoice Lines'), - 'recurring_invoices' : fields.boolean('Generate recurring invoices automatically'), - 'recurring_rule_type': fields.selection([ - ('daily', 'Day(s)'), - ('weekly', 'Week(s)'), - ('monthly', 'Month(s)'), - ('yearly', 'Year(s)'), - ], 'Recurrency', help="Invoice automatically repeat at specified interval"), - 'recurring_interval': fields.integer('Repeat Every', help="Repeat every (Days/Week/Month/Year)"), + 'recurring_invoice_line_ids': fields.one2many( + 'account.analytic.invoice.line', 'analytic_account_id', + 'Invoice Lines'), + 'recurring_invoices': fields.boolean( + 'Generate recurring invoices automatically'), + 'recurring_rule_type': fields.selection( + [('daily', 'Day(s)'), + ('weekly', 'Week(s)'), + ('monthly', 'Month(s)'), + ('yearly', 'Year(s)'), + ], 'Recurrency', + help="Invoice automatically repeat at specified interval"), + 'recurring_interval': fields.integer( + 'Repeat Every', help="Repeat every (Days/Week/Month/Year)"), 'recurring_next_date': fields.date('Date of Next Invoice'), } _defaults = { 'recurring_interval': 1, 'recurring_next_date': lambda *a: time.strftime('%Y-%m-%d'), - 'recurring_rule_type':'monthly' + 'recurring_rule_type': 'monthly' } - def onchange_recurring_invoices(self, cr, uid, ids, recurring_invoices, date_start=False, context=None): + def onchange_recurring_invoices( + self, cr, uid, ids, recurring_invoices, + date_start=False, context=None): value = {} if date_start and recurring_invoices: value = {'value': {'recurring_next_date': date_start}} @@ -122,29 +149,37 @@ class account_analytic_account(osv.osv): lang_obj = self.pool.get('res.lang') if not contract.partner_id: - raise osv.except_osv(_('No Customer Defined!'),_("You must first select a Customer for Contract %s!") % contract.name ) + raise osv.except_osv( + _('No Customer Defined!'), + _("You must first select a Customer for Contract %s!") % + contract.name) fpos = contract.partner_id.property_account_position or False - journal_ids = journal_obj.search(cr, uid, [('type', '=','sale'),('company_id', '=', contract.company_id.id or False)], limit=1) + journal_ids = journal_obj.search( + cr, uid, + [('type', '=', 'sale'), + ('company_id', '=', contract.company_id.id or False)], + limit=1) if not journal_ids: - raise osv.except_osv(_('Error!'), - _('Please define a sale journal for the company "%s".') % (contract.company_id.name or '', )) - - partner_payment_term = contract.partner_id.property_payment_term and contract.partner_id.property_payment_term.id or False + raise osv.except_osv( + _('Error!'), + _('Please define a sale journal for the company "%s".') % + (contract.company_id.name or '', )) + partner_payment_term = contract.partner_id.property_payment_term.id inv_data = { - 'reference': contract.code or False, - 'account_id': contract.partner_id.property_account_receivable.id, - 'type': 'out_invoice', - 'partner_id': contract.partner_id.id, - 'currency_id': contract.partner_id.property_product_pricelist.id or False, - 'journal_id': len(journal_ids) and journal_ids[0] or False, - 'date_invoice': contract.recurring_next_date, - 'origin': contract.name, - 'fiscal_position': fpos and fpos.id, - 'payment_term': partner_payment_term, - 'company_id': contract.company_id.id or False, + 'reference': contract.code or False, + 'account_id': contract.partner_id.property_account_receivable.id, + 'type': 'out_invoice', + 'partner_id': contract.partner_id.id, + 'currency_id': contract.partner_id.property_product_pricelist.id, + 'journal_id': len(journal_ids) and journal_ids[0] or False, + 'date_invoice': contract.recurring_next_date, + 'origin': contract.name, + 'fiscal_position': fpos and fpos.id, + 'payment_term': partner_payment_term, + 'company_id': contract.company_id.id or False, } invoice_id = inv_obj.create(cr, uid, inv_data, context=context) @@ -160,10 +195,15 @@ class account_analytic_account(osv.osv): tax_id = fpos_obj.map_tax(cr, uid, fpos, taxes) if 'old_date' in context: - lang_ids = lang_obj.search(cr, uid, [('code', '=', contract.partner_id.lang)], context=context) - format = lang_obj.browse(cr, uid, lang_ids, context=context)[0].date_format - line.name = line.name.replace('#START#', context['old_date'].strftime(format)) - line.name = line.name.replace('#END#', context['next_date'].strftime(format)) + lang_ids = lang_obj.search( + cr, uid, [('code', '=', contract.partner_id.lang)], + context=context) + format = lang_obj.browse( + cr, uid, lang_ids, context=context)[0].date_format + line.name = line.name.replace( + '#START#', context['old_date'].strftime(format)) + line.name = line.name.replace( + '#END#', context['next_date'].strftime(format)) invoice_line_vals = { 'name': line.name, @@ -173,22 +213,28 @@ class account_analytic_account(osv.osv): 'quantity': line.quantity, 'uos_id': line.uom_id.id or False, 'product_id': line.product_id.id or False, - 'invoice_id' : invoice_id, + 'invoice_id': invoice_id, 'invoice_line_tax_id': [(6, 0, tax_id)], } - self.pool.get('account.invoice.line').create(cr, uid, invoice_line_vals, context=context) + self.pool.get('account.invoice.line').create( + cr, uid, invoice_line_vals, context=context) inv_obj.button_compute(cr, uid, [invoice_id], context=context) return invoice_id def recurring_create_invoice(self, cr, uid, automatic=False, context=None): context = context or {} - current_date = time.strftime('%Y-%m-%d') + current_date = time.strftime('%Y-%m-%d') - contract_ids = self.search(cr, uid, [('recurring_next_date','<=', current_date), ('state','=', 'open'), ('recurring_invoices','=', True)]) + contract_ids = self.search( + cr, uid, + [('recurring_next_date', '<=', current_date), + ('state', '=', 'open'), + ('recurring_invoices', '=', True)]) for contract in self.browse(cr, uid, contract_ids, context=context): - next_date = datetime.datetime.strptime(contract.recurring_next_date or current_date, "%Y-%m-%d") + next_date = datetime.datetime.strptime( + contract.recurring_next_date or current_date, "%Y-%m-%d") interval = contract.recurring_interval if contract.recurring_rule_type == 'daily': old_date = next_date-relativedelta(days=+interval) @@ -201,9 +247,13 @@ class account_analytic_account(osv.osv): new_date = next_date+relativedelta(months=+interval) context['old_date'] = old_date - context['next_date'] = datetime.datetime.strptime(contract.recurring_next_date or current_date,"%Y-%m-%d") - invoice_id = self._prepare_invoice(cr, uid, contract, context=context) + context['next_date'] = datetime.datetime.strptime( + contract.recurring_next_date or current_date, "%Y-%m-%d") + self._prepare_invoice( + cr, uid, contract, context=context) - self.write(cr, uid, [contract.id], {'recurring_next_date': new_date.strftime('%Y-%m-%d')}, context=context) + self.write( + cr, uid, [contract.id], + {'recurring_next_date': new_date.strftime('%Y-%m-%d')}, + context=context) return True - From c9ea8bde2224269f138b8a374f47ec175abcf6a9 Mon Sep 17 00:00:00 2001 From: "Pedro M. Baeza" Date: Mon, 25 Aug 2014 20:32:38 +0200 Subject: [PATCH 05/15] [IMP] account_analytic_analysis_recurring: Spanish translation --- contract/i18n/es.po | 156 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 156 insertions(+) create mode 100644 contract/i18n/es.po diff --git a/contract/i18n/es.po b/contract/i18n/es.po new file mode 100644 index 000000000..8ea63a970 --- /dev/null +++ b/contract/i18n/es.po @@ -0,0 +1,156 @@ +# Translation of OpenERP Server. +# This file contains the translation of the following modules: +# * account_analytic_analysis_recurring +# +msgid "" +msgstr "" +"Project-Id-Version: OpenERP Server 7.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2014-08-18 23:13+0000\n" +"PO-Revision-Date: 2014-08-19 01:14+0100\n" +"Last-Translator: Joaquin Gutierrez \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: \n" + +#. module: account_analytic_analysis_recurring +#: view:account.analytic.account:0 +msgid ". create invoices" +msgstr ". crear facturas" + +#. module: account_analytic_analysis_recurring +#: view:account.analytic.account:0 +msgid "Account Analytic Lines" +msgstr "Ver líneas contables analíticas" + +#. module: account_analytic_analysis_recurring +#: code:_description:0 +#: field:account.analytic.invoice.line,analytic_account_id:0 +#: model:ir.model,name:account_analytic_analysis_recurring.model_account_analytic_account +#, python-format +msgid "Analytic Account" +msgstr "Cuenta analítica" + +#. module: account_analytic_analysis_recurring +#: field:account.analytic.account,recurring_next_date:0 +msgid "Date of Next Invoice" +msgstr "Próximo fecha de factura" + +#. module: account_analytic_analysis_recurring +#: selection:account.analytic.account,recurring_rule_type:0 +msgid "Day(s)" +msgstr "Día(s)" + +#. module: account_analytic_analysis_recurring +#: field:account.analytic.invoice.line,name:0 +msgid "Description" +msgstr "Descripción" + +#. module: account_analytic_analysis_recurring +#: code:addons/account_analytic_analysis_recurring/account_analytic_analysis_recurring.py:165 +#, python-format +msgid "Error!" +msgstr "¡Error!" + +#. module: account_analytic_analysis_recurring +#: field:account.analytic.account,recurring_invoices:0 +msgid "Generate recurring invoices automatically" +msgstr "Generar facturas recurrentes automáticamente." + +#. module: account_analytic_analysis_recurring +#: field:account.analytic.account,recurring_invoice_line_ids:0 +msgid "Invoice Lines" +msgstr "Líneas de factura" + +#. module: account_analytic_analysis_recurring +#: help:account.analytic.account,recurring_rule_type:0 +msgid "Invoice automatically repeat at specified interval" +msgstr "Repetir factura automáticamente en ese intervalo" + +#. module: account_analytic_analysis_recurring +#: selection:account.analytic.account,recurring_rule_type:0 +msgid "Month(s)" +msgstr "Mes(es)" + +#. module: account_analytic_analysis_recurring +#: code:addons/account_analytic_analysis_recurring/account_analytic_analysis_recurring.py:153 +#, python-format +msgid "No Customer Defined!" +msgstr "¡No se ha definido un cliente!" + +#. module: account_analytic_analysis_recurring +#: code:addons/account_analytic_analysis_recurring/account_analytic_analysis_recurring.py:166 +#, python-format +msgid "Please define a sale journal for the company \"%s\"." +msgstr "Defina por favor un diario de ventas para esta compañía \"%s\"." + +#. module: account_analytic_analysis_recurring +#: field:account.analytic.invoice.line,product_id:0 +msgid "Product" +msgstr "Producto" + +#. module: account_analytic_analysis_recurring +#: field:account.analytic.invoice.line,quantity:0 +msgid "Quantity" +msgstr "Cantidad" + +#. module: account_analytic_analysis_recurring +#: field:account.analytic.account,recurring_rule_type:0 +msgid "Recurrency" +msgstr "Recurrencia" + +#. module: account_analytic_analysis_recurring +#: view:account.analytic.account:0 +msgid "Recurring Invoices" +msgstr "Facturas recurrentes" + +#. module: account_analytic_analysis_recurring +#: field:account.analytic.account,recurring_interval:0 +msgid "Repeat Every" +msgstr "Repetir cada" + +#. module: account_analytic_analysis_recurring +#: help:account.analytic.account,recurring_interval:0 +msgid "Repeat every (Days/Week/Month/Year)" +msgstr "Repetir cada (días/semana/mes/año)" + +#. module: account_analytic_analysis_recurring +#: field:account.analytic.invoice.line,price_subtotal:0 +msgid "Sub Total" +msgstr "Subtotal" + +#. module: account_analytic_analysis_recurring +#: field:account.analytic.invoice.line,price_unit:0 +msgid "Unit Price" +msgstr "Precio unidad" + +#. module: account_analytic_analysis_recurring +#: field:account.analytic.invoice.line,uom_id:0 +msgid "Unit of Measure" +msgstr "Unidad de medida" + +#. module: account_analytic_analysis_recurring +#: selection:account.analytic.account,recurring_rule_type:0 +msgid "Week(s)" +msgstr "Semana(s)" + +#. module: account_analytic_analysis_recurring +#: selection:account.analytic.account,recurring_rule_type:0 +msgid "Year(s)" +msgstr "Año(s)" + +#. module: account_analytic_analysis_recurring +#: code:addons/account_analytic_analysis_recurring/account_analytic_analysis_recurring.py:154 +#, python-format +msgid "You must first select a Customer for Contract %s!" +msgstr "¡Seleccione un cliente para este contrato %s!" + +#. module: account_analytic_analysis_recurring +#: code:_description:0 +#: model:ir.model,name:account_analytic_analysis_recurring.model_account_analytic_invoice_line +#, python-format +msgid "account.analytic.invoice.line" +msgstr "account.analytic.invoice.line" + From 7e68d75184dda256698963134403de42729c97fb Mon Sep 17 00:00:00 2001 From: "Pedro M. Baeza" Date: Tue, 26 Aug 2014 02:07:20 +0200 Subject: [PATCH 06/15] [FIX] POT file [FIX] Access rules file --- contract/__openerp__.py | 10 +- .../account_analytic_analysis_recurring.pot | 129 ------------ .../account_analytic_analysis_recurring.pot | 190 ++++++++---------- contract/security/ir.model.access.csv | 4 + 4 files changed, 96 insertions(+), 237 deletions(-) delete mode 100644 contract/account_analytic_analysis_recurring.pot create mode 100644 contract/security/ir.model.access.csv diff --git a/contract/__openerp__.py b/contract/__openerp__.py index 3e323eb29..09a3cee2d 100644 --- a/contract/__openerp__.py +++ b/contract/__openerp__.py @@ -25,14 +25,14 @@ 'version': '0.1', 'category': 'Other', 'description': """ -This module add a new feature in contracts to manage recurring invoice -====================================================================== +This module adds a new feature in contracts to manage recurring invoicing +========================================================================= This is a backport of the new V8 feature available in trunk and saas. With the V8 release this module will be deprecated. -It also add a little feature, you can use #START# and #END# in the contract -line to automatically insert the dates of the invoiced period. +It also adds a little feature, you can use #START# and #END# in the contract +line description to automatically insert the dates of the invoiced period. Backport done By Yannick Buron. """, @@ -40,6 +40,7 @@ Backport done By Yannick Buron. 'website': 'http://openerp.com', 'depends': ['base', 'account_analytic_analysis'], 'data': [ + 'security/ir.model.access.csv', 'account_analytic_analysis_recurring_cron.xml', 'account_analytic_analysis_recurring_view.xml', ], @@ -48,4 +49,3 @@ Backport done By Yannick Buron. 'installable': True, 'images': [], } -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/contract/account_analytic_analysis_recurring.pot b/contract/account_analytic_analysis_recurring.pot deleted file mode 100644 index 7d2f21f1f..000000000 --- a/contract/account_analytic_analysis_recurring.pot +++ /dev/null @@ -1,129 +0,0 @@ -# Translation of OpenERP Server. -# This file contains the translation of the following modules: -# * account_analytic_analysis_recurring -# -msgid "" -msgstr "" -"Project-Id-Version: OpenERP Server 7.0\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2014-02-21 11:41+0000\n" -"PO-Revision-Date: 2014-02-21 11:41+0000\n" -"Last-Translator: <>\n" -"Language-Team: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Plural-Forms: \n" - -#. module: account_analytic_analysis_recurring -#: field:account.analytic.invoice.line,price_subtotal:0 -msgid "Sub Total" -msgstr "" - -#. module: account_analytic_analysis_recurring -#: field:account.analytic.account,recurring_rule_type:0 -msgid "Recurrency" -msgstr "" - -#. module: account_analytic_analysis_recurring -#: field:account.analytic.invoice.line,price_unit:0 -msgid "Unit Price" -msgstr "" - -#. module: account_analytic_analysis_recurring -#: view:account.analytic.account:0 -msgid ". create invoices" -msgstr "" - -#. module: account_analytic_analysis_recurring -#: view:account.analytic.account:0 -msgid "Account Analytic Lines" -msgstr "" - -#. module: account_analytic_analysis_recurring -#: field:account.analytic.account,recurring_invoice_line_ids:0 -msgid "Invoice Lines" -msgstr "" - -#. module: account_analytic_analysis_recurring -#: field:account.analytic.invoice.line,uom_id:0 -msgid "Unit of Measure" -msgstr "" - -#. module: account_analytic_analysis_recurring -#: selection:account.analytic.account,recurring_rule_type:0 -msgid "Day(s)" -msgstr "" - -#. module: account_analytic_analysis_recurring -#: help:account.analytic.account,recurring_rule_type:0 -msgid "Invoice automatically repeat at specified interval" -msgstr "" - -#. module: account_analytic_analysis_recurring -#: field:account.analytic.invoice.line,product_id:0 -msgid "Product" -msgstr "" - -#. module: account_analytic_analysis_recurring -#: field:account.analytic.invoice.line,name:0 -msgid "Description" -msgstr "" - -#. module: account_analytic_analysis_recurring -#: field:account.analytic.account,recurring_interval:0 -msgid "Repeat Every" -msgstr "" - -#. module: account_analytic_analysis_recurring -#: view:account.analytic.account:0 -msgid "Recurring Invoices" -msgstr "" - -#. module: account_analytic_analysis_recurring -#: field:account.analytic.account,recurring_invoices:0 -msgid "Generate recurring invoices automatically" -msgstr "" - -#. module: account_analytic_analysis_recurring -#: selection:account.analytic.account,recurring_rule_type:0 -msgid "Year(s)" -msgstr "" - -#. module: account_analytic_analysis_recurring -#: selection:account.analytic.account,recurring_rule_type:0 -msgid "Week(s)" -msgstr "" - -#. module: account_analytic_analysis_recurring -#: field:account.analytic.invoice.line,quantity:0 -msgid "Quantity" -msgstr "" - -#. module: account_analytic_analysis_recurring -#: model:ir.model,name:account_analytic_analysis_recurring.model_account_analytic_invoice_line -msgid "account.analytic.invoice.line" -msgstr "" - -#. module: account_analytic_analysis_recurring -#: field:account.analytic.account,recurring_next_date:0 -msgid "Date of Next Invoice" -msgstr "" - -#. module: account_analytic_analysis_recurring -#: field:account.analytic.invoice.line,analytic_account_id:0 -#: model:ir.model,name:account_analytic_analysis_recurring.model_account_analytic_account -msgid "Analytic Account" -msgstr "" - -#. module: account_analytic_analysis_recurring -#: selection:account.analytic.account,recurring_rule_type:0 -msgid "Month(s)" -msgstr "" - -#. module: account_analytic_analysis_recurring -#: help:account.analytic.account,recurring_interval:0 -msgid "Repeat every (Days/Week/Month/Year)" -msgstr "" - - diff --git a/contract/i18n/account_analytic_analysis_recurring.pot b/contract/i18n/account_analytic_analysis_recurring.pot index ce2499c51..7d2f21f1f 100644 --- a/contract/i18n/account_analytic_analysis_recurring.pot +++ b/contract/i18n/account_analytic_analysis_recurring.pot @@ -1,9 +1,34 @@ # Translation of OpenERP Server. # This file contains the translation of the following modules: -# * account_analytic_analysis_recurring +# * account_analytic_analysis_recurring # msgid "" msgstr "" +"Project-Id-Version: OpenERP Server 7.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2014-02-21 11:41+0000\n" +"PO-Revision-Date: 2014-02-21 11:41+0000\n" +"Last-Translator: <>\n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: account_analytic_analysis_recurring +#: field:account.analytic.invoice.line,price_subtotal:0 +msgid "Sub Total" +msgstr "" + +#. module: account_analytic_analysis_recurring +#: field:account.analytic.account,recurring_rule_type:0 +msgid "Recurrency" +msgstr "" + +#. module: account_analytic_analysis_recurring +#: field:account.analytic.invoice.line,price_unit:0 +msgid "Unit Price" +msgstr "" #. module: account_analytic_analysis_recurring #: view:account.analytic.account:0 @@ -15,107 +40,11 @@ msgstr "" msgid "Account Analytic Lines" msgstr "" -#. module: account_analytic_analysis_recurring -#: code:_description:0 -#: field:account.analytic.invoice.line,analytic_account_id:0 -#: model:ir.model,name:account_analytic_analysis_recurring.model_account_analytic_account -#, python-format -msgid "Analytic Account" -msgstr "" - -#. module: account_analytic_analysis_recurring -#: field:account.analytic.account,recurring_next_date:0 -msgid "Date of Next Invoice" -msgstr "" - -#. module: account_analytic_analysis_recurring -#: selection:account.analytic.account,recurring_rule_type:0 -msgid "Day(s)" -msgstr "" - -#. module: account_analytic_analysis_recurring -#: field:account.analytic.invoice.line,name:0 -msgid "Description" -msgstr "" - -#. module: account_analytic_analysis_recurring -#: code:addons/account_analytic_analysis_recurring/account_analytic_analysis_recurring.py:130 -#, python-format -msgid "Error!" -msgstr "" - -#. module: account_analytic_analysis_recurring -#: field:account.analytic.account,recurring_invoices:0 -msgid "Generate recurring invoices automatically" -msgstr "" - #. module: account_analytic_analysis_recurring #: field:account.analytic.account,recurring_invoice_line_ids:0 msgid "Invoice Lines" msgstr "" -#. module: account_analytic_analysis_recurring -#: help:account.analytic.account,recurring_rule_type:0 -msgid "Invoice automatically repeat at specified interval" -msgstr "" - -#. module: account_analytic_analysis_recurring -#: selection:account.analytic.account,recurring_rule_type:0 -msgid "Month(s)" -msgstr "" - -#. module: account_analytic_analysis_recurring -#: code:addons/account_analytic_analysis_recurring/account_analytic_analysis_recurring.py:125 -#, python-format -msgid "No Customer Defined!" -msgstr "" - -#. module: account_analytic_analysis_recurring -#: code:addons/account_analytic_analysis_recurring/account_analytic_analysis_recurring.py:131 -#, python-format -msgid "Please define a sale journal for the company \"%s\"." -msgstr "" - -#. module: account_analytic_analysis_recurring -#: field:account.analytic.invoice.line,product_id:0 -msgid "Product" -msgstr "" - -#. module: account_analytic_analysis_recurring -#: field:account.analytic.invoice.line,quantity:0 -msgid "Quantity" -msgstr "" - -#. module: account_analytic_analysis_recurring -#: field:account.analytic.account,recurring_rule_type:0 -msgid "Recurrency" -msgstr "" - -#. module: account_analytic_analysis_recurring -#: view:account.analytic.account:0 -msgid "Recurring Invoices" -msgstr "" - -#. module: account_analytic_analysis_recurring -#: field:account.analytic.account,recurring_interval:0 -msgid "Repeat Every" -msgstr "" - -#. module: account_analytic_analysis_recurring -#: help:account.analytic.account,recurring_interval:0 -msgid "Repeat every (Days/Week/Month/Year)" -msgstr "" - -#. module: account_analytic_analysis_recurring -#: field:account.analytic.invoice.line,price_subtotal:0 -msgid "Sub Total" -msgstr "" - -#. module: account_analytic_analysis_recurring -#: field:account.analytic.invoice.line,price_unit:0 -msgid "Unit Price" -msgstr "" - #. module: account_analytic_analysis_recurring #: field:account.analytic.invoice.line,uom_id:0 msgid "Unit of Measure" @@ -123,7 +52,37 @@ msgstr "" #. module: account_analytic_analysis_recurring #: selection:account.analytic.account,recurring_rule_type:0 -msgid "Week(s)" +msgid "Day(s)" +msgstr "" + +#. module: account_analytic_analysis_recurring +#: help:account.analytic.account,recurring_rule_type:0 +msgid "Invoice automatically repeat at specified interval" +msgstr "" + +#. module: account_analytic_analysis_recurring +#: field:account.analytic.invoice.line,product_id:0 +msgid "Product" +msgstr "" + +#. module: account_analytic_analysis_recurring +#: field:account.analytic.invoice.line,name:0 +msgid "Description" +msgstr "" + +#. module: account_analytic_analysis_recurring +#: field:account.analytic.account,recurring_interval:0 +msgid "Repeat Every" +msgstr "" + +#. module: account_analytic_analysis_recurring +#: view:account.analytic.account:0 +msgid "Recurring Invoices" +msgstr "" + +#. module: account_analytic_analysis_recurring +#: field:account.analytic.account,recurring_invoices:0 +msgid "Generate recurring invoices automatically" msgstr "" #. module: account_analytic_analysis_recurring @@ -132,14 +91,39 @@ msgid "Year(s)" msgstr "" #. module: account_analytic_analysis_recurring -#: code:addons/account_analytic_analysis_recurring/account_analytic_analysis_recurring.py:125 -#, python-format -msgid "You must first select a Customer for Contract %s!" +#: selection:account.analytic.account,recurring_rule_type:0 +msgid "Week(s)" +msgstr "" + +#. module: account_analytic_analysis_recurring +#: field:account.analytic.invoice.line,quantity:0 +msgid "Quantity" msgstr "" #. module: account_analytic_analysis_recurring -#: code:_description:0 #: model:ir.model,name:account_analytic_analysis_recurring.model_account_analytic_invoice_line -#, python-format msgid "account.analytic.invoice.line" msgstr "" + +#. module: account_analytic_analysis_recurring +#: field:account.analytic.account,recurring_next_date:0 +msgid "Date of Next Invoice" +msgstr "" + +#. module: account_analytic_analysis_recurring +#: field:account.analytic.invoice.line,analytic_account_id:0 +#: model:ir.model,name:account_analytic_analysis_recurring.model_account_analytic_account +msgid "Analytic Account" +msgstr "" + +#. module: account_analytic_analysis_recurring +#: selection:account.analytic.account,recurring_rule_type:0 +msgid "Month(s)" +msgstr "" + +#. module: account_analytic_analysis_recurring +#: help:account.analytic.account,recurring_interval:0 +msgid "Repeat every (Days/Week/Month/Year)" +msgstr "" + + diff --git a/contract/security/ir.model.access.csv b/contract/security/ir.model.access.csv new file mode 100644 index 000000000..fb584e025 --- /dev/null +++ b/contract/security/ir.model.access.csv @@ -0,0 +1,4 @@ +"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink" +"account_analytic_invoice_line_manager","Recurring manager","model_account_analytic_invoice_line","project.group_project_manager",1,1,1,1 +"account_analytic_invoice_line_user","Recurring user","model_account_analytic_invoice_line","project.group_project_user",1,0,0,0 + From b6cb18df08a7dfa23a9d61e0f29ae48e7b6ca22c Mon Sep 17 00:00:00 2001 From: "Pedro M. Baeza" Date: Wed, 3 Sep 2014 02:57:24 +0200 Subject: [PATCH 07/15] [FIX] account_analytic_analysis_recurring: Currency for created invoices. --- .../account_analytic_analysis_recurring.py | 21 +++++++------------ 1 file changed, 7 insertions(+), 14 deletions(-) diff --git a/contract/account_analytic_analysis_recurring.py b/contract/account_analytic_analysis_recurring.py index f6f0d71ec..dfc25e8ed 100644 --- a/contract/account_analytic_analysis_recurring.py +++ b/contract/account_analytic_analysis_recurring.py @@ -141,8 +141,8 @@ class account_analytic_account(osv.osv): return value def _prepare_invoice(self, cr, uid, contract, context=None): - context = context or {} - + if context is None: + context = {} inv_obj = self.pool.get('account.invoice') journal_obj = self.pool.get('account.journal') fpos_obj = self.pool.get('account.fiscal.position') @@ -153,8 +153,8 @@ class account_analytic_account(osv.osv): _('No Customer Defined!'), _("You must first select a Customer for Contract %s!") % contract.name) - - fpos = contract.partner_id.property_account_position or False + partner = contract.partner_id + fpos = partner.property_account_position or False journal_ids = journal_obj.search( cr, uid, [('type', '=', 'sale'), @@ -165,15 +165,13 @@ class account_analytic_account(osv.osv): _('Error!'), _('Please define a sale journal for the company "%s".') % (contract.company_id.name or '', )) - partner_payment_term = contract.partner_id.property_payment_term.id - inv_data = { 'reference': contract.code or False, - 'account_id': contract.partner_id.property_account_receivable.id, + 'account_id': partner.property_account_receivable.id, 'type': 'out_invoice', - 'partner_id': contract.partner_id.id, - 'currency_id': contract.partner_id.property_product_pricelist.id, + 'partner_id': partner.id, + 'currency_id': partner.property_product_pricelist.currency_id.id, 'journal_id': len(journal_ids) and journal_ids[0] or False, 'date_invoice': contract.recurring_next_date, 'origin': contract.name, @@ -182,18 +180,14 @@ class account_analytic_account(osv.osv): 'company_id': contract.company_id.id or False, } invoice_id = inv_obj.create(cr, uid, inv_data, context=context) - for line in contract.recurring_invoice_line_ids: - res = line.product_id account_id = res.property_account_income.id if not account_id: account_id = res.categ_id.property_account_income_categ.id account_id = fpos_obj.map_account(cr, uid, fpos, account_id) - taxes = res.taxes_id or False tax_id = fpos_obj.map_tax(cr, uid, fpos, taxes) - if 'old_date' in context: lang_ids = lang_obj.search( cr, uid, [('code', '=', contract.partner_id.lang)], @@ -204,7 +198,6 @@ class account_analytic_account(osv.osv): '#START#', context['old_date'].strftime(format)) line.name = line.name.replace( '#END#', context['next_date'].strftime(format)) - invoice_line_vals = { 'name': line.name, 'account_id': account_id, From fc8afd563c6746637c444a5f380022268e4c9715 Mon Sep 17 00:00:00 2001 From: "Pedro M. Baeza" Date: Mon, 15 Sep 2014 18:20:53 +0200 Subject: [PATCH 08/15] [FIX] account_analytic_analysis_recurring: #START# and #END# set correctly [IMP] Some conventions --- .../account_analytic_analysis_recurring.py | 42 +++++++++---------- 1 file changed, 20 insertions(+), 22 deletions(-) diff --git a/contract/account_analytic_analysis_recurring.py b/contract/account_analytic_analysis_recurring.py index dfc25e8ed..59d3ba824 100644 --- a/contract/account_analytic_analysis_recurring.py +++ b/contract/account_analytic_analysis_recurring.py @@ -23,15 +23,14 @@ import datetime import logging import time -from openerp.osv import osv, fields +from openerp.osv import orm, fields from openerp.tools.translate import _ - from openerp.addons.decimal_precision import decimal_precision as dp _logger = logging.getLogger(__name__) -class account_analytic_invoice_line(osv.osv): +class AccountAnalyticInvoiceLine(orm.Model): _name = "account.analytic.invoice.line" def _amount_line( @@ -104,7 +103,7 @@ class account_analytic_invoice_line(osv.osv): return res_final -class account_analytic_account(osv.osv): +class AccountAnalyticAccount(orm.Model): _name = "account.analytic.account" _inherit = "account.analytic.account" @@ -132,6 +131,13 @@ class account_analytic_account(osv.osv): 'recurring_rule_type': 'monthly' } + def copy(self, cr, uid, id, default=None, context=None): + # Reset next invoice date + default['recurring_next_date'] = \ + self._defaults['recurring_next_date']() + return super(AccountAnalyticAccount, self).copy( + cr, uid, id, default=default, context=context) + def onchange_recurring_invoices( self, cr, uid, ids, recurring_invoices, date_start=False, context=None): @@ -147,9 +153,8 @@ class account_analytic_account(osv.osv): journal_obj = self.pool.get('account.journal') fpos_obj = self.pool.get('account.fiscal.position') lang_obj = self.pool.get('res.lang') - if not contract.partner_id: - raise osv.except_osv( + raise orm.except_orm( _('No Customer Defined!'), _("You must first select a Customer for Contract %s!") % contract.name) @@ -161,7 +166,7 @@ class account_analytic_account(osv.osv): ('company_id', '=', contract.company_id.id or False)], limit=1) if not journal_ids: - raise osv.except_osv( + raise orm.except_orm( _('Error!'), _('Please define a sale journal for the company "%s".') % (contract.company_id.name or '', )) @@ -209,42 +214,35 @@ class account_analytic_account(osv.osv): 'invoice_id': invoice_id, 'invoice_line_tax_id': [(6, 0, tax_id)], } - self.pool.get('account.invoice.line').create( + self.pool['account.invoice.line'].create( cr, uid, invoice_line_vals, context=context) - inv_obj.button_compute(cr, uid, [invoice_id], context=context) return invoice_id def recurring_create_invoice(self, cr, uid, automatic=False, context=None): - context = context or {} + if context is None: + context = {} current_date = time.strftime('%Y-%m-%d') - contract_ids = self.search( cr, uid, [('recurring_next_date', '<=', current_date), ('state', '=', 'open'), ('recurring_invoices', '=', True)]) for contract in self.browse(cr, uid, contract_ids, context=context): - next_date = datetime.datetime.strptime( contract.recurring_next_date or current_date, "%Y-%m-%d") interval = contract.recurring_interval + old_date = next_date if contract.recurring_rule_type == 'daily': - old_date = next_date-relativedelta(days=+interval) - new_date = next_date+relativedelta(days=+interval) + new_date = next_date + relativedelta(days=+interval) elif contract.recurring_rule_type == 'weekly': - old_date = next_date-relativedelta(weeks=+interval) - new_date = next_date+relativedelta(weeks=+interval) + new_date = next_date + relativedelta(weeks=+interval) else: - old_date = next_date+relativedelta(months=+interval) - new_date = next_date+relativedelta(months=+interval) - + new_date = next_date + relativedelta(months=+interval) context['old_date'] = old_date - context['next_date'] = datetime.datetime.strptime( - contract.recurring_next_date or current_date, "%Y-%m-%d") + context['next_date'] = new_date self._prepare_invoice( cr, uid, contract, context=context) - self.write( cr, uid, [contract.id], {'recurring_next_date': new_date.strftime('%Y-%m-%d')}, From 4b73c6f5f5ac05f16064ff6b631d57c656cf6d06 Mon Sep 17 00:00:00 2001 From: "Pedro M. Baeza" Date: Sat, 27 Sep 2014 13:02:32 +0200 Subject: [PATCH 09/15] [FIX] account_analytic_analysis_recurring: Fix ACL --- contract/security/ir.model.access.csv | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/contract/security/ir.model.access.csv b/contract/security/ir.model.access.csv index fb584e025..902c5d592 100644 --- a/contract/security/ir.model.access.csv +++ b/contract/security/ir.model.access.csv @@ -1,4 +1,4 @@ "id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink" -"account_analytic_invoice_line_manager","Recurring manager","model_account_analytic_invoice_line","project.group_project_manager",1,1,1,1 -"account_analytic_invoice_line_user","Recurring user","model_account_analytic_invoice_line","project.group_project_user",1,0,0,0 +"account_analytic_invoice_line_manager","Recurring manager","model_account_analytic_invoice_line","base.group_sale_manager",1,1,1,1 +"account_analytic_invoice_line_user","Recurring user","model_account_analytic_invoice_line","base.group_sale_salesman",1,0,0,0 From 57791c2d4ea2bd10d8aa8c97f4428bb554978695 Mon Sep 17 00:00:00 2001 From: Federico Cruz Date: Thu, 23 Oct 2014 19:59:12 -0500 Subject: [PATCH 10/15] Set correct company on invoices when working on multicompany environment Now when working on multy company environmets the server action creates invioices with accounts belong to correct company based on contract company. --- .../account_analytic_analysis_recurring.py | 41 ++++++++++++++----- 1 file changed, 31 insertions(+), 10 deletions(-) diff --git a/contract/account_analytic_analysis_recurring.py b/contract/account_analytic_analysis_recurring.py index dfc25e8ed..e05c8f7f4 100644 --- a/contract/account_analytic_analysis_recurring.py +++ b/contract/account_analytic_analysis_recurring.py @@ -93,7 +93,7 @@ class account_analytic_invoice_line(osv.osv): 'uom_id': uom_id or res.uom_id.id or False, 'price_unit': res.list_price or 0.0}) if res.description: - result['name'] += '\n'+res.description + result['name'] += '\n' + res.description res_final = {'value': result} if result['uom_id'] != res.uom_id.id: @@ -164,7 +164,7 @@ class account_analytic_account(osv.osv): raise osv.except_osv( _('Error!'), _('Please define a sale journal for the company "%s".') % - (contract.company_id.name or '', )) + (contract.company_id.name or '',)) partner_payment_term = contract.partner_id.property_payment_term.id inv_data = { 'reference': contract.code or False, @@ -230,20 +230,41 @@ class account_analytic_account(osv.osv): contract.recurring_next_date or current_date, "%Y-%m-%d") interval = contract.recurring_interval if contract.recurring_rule_type == 'daily': - old_date = next_date-relativedelta(days=+interval) - new_date = next_date+relativedelta(days=+interval) + old_date = next_date - relativedelta(days=+interval) + new_date = next_date + relativedelta(days=+interval) elif contract.recurring_rule_type == 'weekly': - old_date = next_date-relativedelta(weeks=+interval) - new_date = next_date+relativedelta(weeks=+interval) + old_date = next_date - relativedelta(weeks=+interval) + new_date = next_date + relativedelta(weeks=+interval) else: - old_date = next_date+relativedelta(months=+interval) - new_date = next_date+relativedelta(months=+interval) + old_date = next_date + relativedelta(months=+interval) + new_date = next_date + relativedelta(months=+interval) context['old_date'] = old_date context['next_date'] = datetime.datetime.strptime( contract.recurring_next_date or current_date, "%Y-%m-%d") - self._prepare_invoice( - cr, uid, contract, context=context) + # Force company for correct evaluate domain access rules + context['force_company'] = contract.company_id.id + + # Create new cursor for handle multi company environments + from openerp import pooler + db, pool = pooler.get_db_and_pool(cr.dbname) + cursor = db.cursor() + try: + this = pool.get('account.analytic.account') + # Need to reload contract on new cursor for prevent + # ORM optimizations use same company for load all + # partner properties + contract = this.browse( + cursor, uid, contract.id, context=context + ) + this._prepare_invoice( + cursor, uid, contract, context=context + ) + cursor.commit() # commit results + except Exception: + cursor.rollback() # error, rollback everything + finally: + cursor.close() # always close cursor self.write( cr, uid, [contract.id], From f25bd906bf57c2df59d094c5bc918fcf2555b1ff Mon Sep 17 00:00:00 2001 From: Federico Cruz Date: Tue, 28 Oct 2014 19:10:40 -0600 Subject: [PATCH 11/15] Set correct company on invoices when working on multicompany environment In the last commit we used a new cursor for this problem, but in this time we make a browse for each contract like Pedro Baeza proposed --- .../account_analytic_analysis_recurring.py | 30 +++++-------------- 1 file changed, 7 insertions(+), 23 deletions(-) diff --git a/contract/account_analytic_analysis_recurring.py b/contract/account_analytic_analysis_recurring.py index 23e528335..fc1958038 100644 --- a/contract/account_analytic_analysis_recurring.py +++ b/contract/account_analytic_analysis_recurring.py @@ -243,30 +243,14 @@ class AccountAnalyticAccount(orm.Model): context['next_date'] = new_date # Force company for correct evaluate domain access rules context['force_company'] = contract.company_id.id - - # Create new cursor for handle multi company environments - from openerp import pooler - db, pool = pooler.get_db_and_pool(cr.dbname) - cursor = db.cursor() - try: - this = pool.get('account.analytic.account') - # Need to reload contract on new cursor for prevent - # ORM optimizations use same company for load all - # partner properties - contract = this.browse( - cursor, uid, contract.id, context=context - ) - this._prepare_invoice( - cursor, uid, contract, context=context - ) - cursor.commit() # commit results - except Exception: - cursor.rollback() # error, rollback everything - finally: - cursor.close() # always close cursor - + # Re-read contract with correct company + contract = self.browse(cr, uid, contract.id, context=context) + self._prepare_invoice( + cr, uid, contract, context=context + ) self.write( cr, uid, [contract.id], {'recurring_next_date': new_date.strftime('%Y-%m-%d')}, - context=context) + context=context + ) return True From 3b0ed9dd2156a23010232d7495b278bb31f2d28d Mon Sep 17 00:00:00 2001 From: moylop260 Date: Thu, 13 Nov 2014 21:42:35 -0600 Subject: [PATCH 12/15] [REF] auto-fix conventions --- contract/__init__.py | 2 +- contract/account_analytic_analysis_recurring.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/contract/__init__.py b/contract/__init__.py index 7088b5aa8..41ecc2add 100644 --- a/contract/__init__.py +++ b/contract/__init__.py @@ -19,4 +19,4 @@ # ############################################################################## -import account_analytic_analysis_recurring +from . import account_analytic_analysis_recurring diff --git a/contract/account_analytic_analysis_recurring.py b/contract/account_analytic_analysis_recurring.py index 59d3ba824..6d87916ba 100644 --- a/contract/account_analytic_analysis_recurring.py +++ b/contract/account_analytic_analysis_recurring.py @@ -92,7 +92,7 @@ class AccountAnalyticInvoiceLine(orm.Model): 'uom_id': uom_id or res.uom_id.id or False, 'price_unit': res.list_price or 0.0}) if res.description: - result['name'] += '\n'+res.description + result['name'] += '\n' + res.description res_final = {'value': result} if result['uom_id'] != res.uom_id.id: From f9bc249b7a77744a0102cb4915a28c9094a149a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=94=D0=BC=D0=B8=D1=82=D1=80=D0=BE=20=D0=9A=D0=B0=D1=82?= =?UTF-8?q?=D1=8E=D1=85=D0=B0?= Date: Wed, 14 Jan 2015 18:23:21 +0200 Subject: [PATCH 13/15] Partch for #55 (missing dependency hr-timesheet) Also fixed bug on loading of 'account_analytic_analysis_recurring' module and pylint fixes in project_sla.m2m --- contract/__openerp__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contract/__openerp__.py b/contract/__openerp__.py index 09a3cee2d..cbea33c28 100644 --- a/contract/__openerp__.py +++ b/contract/__openerp__.py @@ -44,7 +44,7 @@ Backport done By Yannick Buron. 'account_analytic_analysis_recurring_cron.xml', 'account_analytic_analysis_recurring_view.xml', ], - 'demo': [''], + 'demo': [], 'test': [], 'installable': True, 'images': [], From 1afffca5f22bb0f582ad4dcef1709c6c4000ad70 Mon Sep 17 00:00:00 2001 From: "Pedro M. Baeza" Date: Thu, 12 Feb 2015 16:30:41 +0100 Subject: [PATCH 14/15] [IMP] account_analytic_analysis_recurring: Hook method for preparing invoice lines --- .../account_analytic_analysis_recurring.py | 72 ++++++++++--------- 1 file changed, 39 insertions(+), 33 deletions(-) diff --git a/contract/account_analytic_analysis_recurring.py b/contract/account_analytic_analysis_recurring.py index fc1958038..e5f2a99ca 100644 --- a/contract/account_analytic_analysis_recurring.py +++ b/contract/account_analytic_analysis_recurring.py @@ -146,13 +146,45 @@ class AccountAnalyticAccount(orm.Model): value = {'value': {'recurring_next_date': date_start}} return value + def _prepare_invoice_line(self, cr, uid, line, invoice_id, context=None): + fpos_obj = self.pool['account.fiscal.position'] + lang_obj = self.pool['res.lang'] + product = line.product_id + account_id = product.property_account_income.id + if not account_id: + account_id = product.categ_id.property_account_income_categ.id + contract = line.analytic_account_id + fpos = contract.partner_id.property_account_position or False + account_id = fpos_obj.map_account(cr, uid, fpos, account_id) + taxes = product.taxes_id or False + tax_id = fpos_obj.map_tax(cr, uid, fpos, taxes) + if 'old_date' in context: + lang_ids = lang_obj.search( + cr, uid, [('code', '=', contract.partner_id.lang)], + context=context) + format = lang_obj.browse( + cr, uid, lang_ids, context=context)[0].date_format + line.name = line.name.replace( + '#START#', context['old_date'].strftime(format)) + line.name = line.name.replace( + '#END#', context['next_date'].strftime(format)) + return { + 'name': line.name, + 'account_id': account_id, + 'account_analytic_id': contract.id, + 'price_unit': line.price_unit or 0.0, + 'quantity': line.quantity, + 'uos_id': line.uom_id.id or False, + 'product_id': line.product_id.id or False, + 'invoice_id': invoice_id, + 'invoice_line_tax_id': [(6, 0, tax_id)], + } + def _prepare_invoice(self, cr, uid, contract, context=None): if context is None: context = {} - inv_obj = self.pool.get('account.invoice') - journal_obj = self.pool.get('account.journal') - fpos_obj = self.pool.get('account.fiscal.position') - lang_obj = self.pool.get('res.lang') + inv_obj = self.pool['account.invoice'] + journal_obj = self.pool['account.journal'] if not contract.partner_id: raise orm.except_orm( _('No Customer Defined!'), @@ -170,7 +202,7 @@ class AccountAnalyticAccount(orm.Model): _('Error!'), _('Please define a sale journal for the company "%s".') % (contract.company_id.name or '',)) - partner_payment_term = contract.partner_id.property_payment_term.id + partner_payment_term = partner.property_payment_term.id inv_data = { 'reference': contract.code or False, 'account_id': partner.property_account_receivable.id, @@ -186,34 +218,8 @@ class AccountAnalyticAccount(orm.Model): } invoice_id = inv_obj.create(cr, uid, inv_data, context=context) for line in contract.recurring_invoice_line_ids: - res = line.product_id - account_id = res.property_account_income.id - if not account_id: - account_id = res.categ_id.property_account_income_categ.id - account_id = fpos_obj.map_account(cr, uid, fpos, account_id) - taxes = res.taxes_id or False - tax_id = fpos_obj.map_tax(cr, uid, fpos, taxes) - if 'old_date' in context: - lang_ids = lang_obj.search( - cr, uid, [('code', '=', contract.partner_id.lang)], - context=context) - format = lang_obj.browse( - cr, uid, lang_ids, context=context)[0].date_format - line.name = line.name.replace( - '#START#', context['old_date'].strftime(format)) - line.name = line.name.replace( - '#END#', context['next_date'].strftime(format)) - invoice_line_vals = { - 'name': line.name, - 'account_id': account_id, - 'account_analytic_id': contract.id, - 'price_unit': line.price_unit or 0.0, - 'quantity': line.quantity, - 'uos_id': line.uom_id.id or False, - 'product_id': line.product_id.id or False, - 'invoice_id': invoice_id, - 'invoice_line_tax_id': [(6, 0, tax_id)], - } + invoice_line_vals = self._prepare_invoice_line( + cr, uid, line, invoice_id, context=context) self.pool['account.invoice.line'].create( cr, uid, invoice_line_vals, context=context) inv_obj.button_compute(cr, uid, [invoice_id], context=context) From cb7a9f902e41ce662759b9d718097f48264f57af Mon Sep 17 00:00:00 2001 From: Alexandre Fayolle Date: Mon, 2 Mar 2015 17:27:05 +0100 Subject: [PATCH 15/15] Add OCA as author of OCA addons In order to get visibility on https://www.odoo.com/apps the OCA board has decided to add the OCA as author of all the addons maintained as part of the association. --- contract/__openerp__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contract/__openerp__.py b/contract/__openerp__.py index cbea33c28..bd6c976b6 100644 --- a/contract/__openerp__.py +++ b/contract/__openerp__.py @@ -36,7 +36,7 @@ line description to automatically insert the dates of the invoiced period. Backport done By Yannick Buron. """, - 'author': 'OpenERP SA', + 'author': "OpenERP SA,Odoo Community Association (OCA)", 'website': 'http://openerp.com', 'depends': ['base', 'account_analytic_analysis'], 'data': [