diff --git a/contract/__init__.py b/contract/__init__.py new file mode 100644 index 000000000..41ecc2add --- /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 . +# +############################################################################## + +from . import account_analytic_analysis_recurring diff --git a/contract/__openerp__.py b/contract/__openerp__.py new file mode 100644 index 000000000..bd6c976b6 --- /dev/null +++ b/contract/__openerp__.py @@ -0,0 +1,51 @@ +# -*- 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 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 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. +""", + 'author': "OpenERP SA,Odoo Community Association (OCA)", + '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', + ], + 'demo': [], + 'test': [], + 'installable': True, + 'images': [], +} diff --git a/contract/account_analytic_analysis_recurring.py b/contract/account_analytic_analysis_recurring.py new file mode 100644 index 000000000..e5f2a99ca --- /dev/null +++ b/contract/account_analytic_analysis_recurring.py @@ -0,0 +1,262 @@ +# -*- 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 orm, fields +from openerp.tools.translate import _ +from openerp.addons.decimal_precision import decimal_precision as dp + +_logger = logging.getLogger(__name__) + + +class AccountAnalyticInvoiceLine(orm.Model): + _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: + 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 AccountAnalyticAccount(orm.Model): + _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 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): + value = {} + if date_start and recurring_invoices: + 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['account.invoice'] + journal_obj = self.pool['account.journal'] + if not contract.partner_id: + raise orm.except_orm( + _('No Customer Defined!'), + _("You must first select a Customer for Contract %s!") % + contract.name) + partner = contract.partner_id + fpos = partner.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 orm.except_orm( + _('Error!'), + _('Please define a sale journal for the company "%s".') % + (contract.company_id.name or '',)) + partner_payment_term = partner.property_payment_term.id + inv_data = { + 'reference': contract.code or False, + 'account_id': partner.property_account_receivable.id, + 'type': 'out_invoice', + '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, + '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: + 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) + return invoice_id + + def recurring_create_invoice(self, cr, uid, automatic=False, context=None): + 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': + new_date = next_date + relativedelta(days=+interval) + elif contract.recurring_rule_type == 'weekly': + new_date = next_date + relativedelta(weeks=+interval) + else: + new_date = next_date + relativedelta(months=+interval) + context['old_date'] = old_date + context['next_date'] = new_date + # Force company for correct evaluate domain access rules + context['force_company'] = contract.company_id.id + # 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 + ) + 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 + + + + + +
+ +
+ + +
+
+
+ +
+
diff --git a/contract/i18n/account_analytic_analysis_recurring.pot b/contract/i18n/account_analytic_analysis_recurring.pot new file mode 100644 index 000000000..7d2f21f1f --- /dev/null +++ b/contract/i18n/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 "" + + 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" + 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" + diff --git a/contract/security/ir.model.access.csv b/contract/security/ir.model.access.csv new file mode 100644 index 000000000..902c5d592 --- /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","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 +