Browse Source
Merge pull request #24 from pedrobaeza/8.0-contract_recurring_invoicing_marker
Merge pull request #24 from pedrobaeza/8.0-contract_recurring_invoicing_marker
[ADD] contract_recurring_invoicing_markerpull/28/head
Pedro M. Baeza
9 years ago
11 changed files with 602 additions and 0 deletions
-
79contract_recurring_invoicing_marker/README.rst
-
5contract_recurring_invoicing_marker/__init__.py
-
20contract_recurring_invoicing_marker/__openerp__.py
-
47contract_recurring_invoicing_marker/i18n/es.po
-
5contract_recurring_invoicing_marker/models/__init__.py
-
46contract_recurring_invoicing_marker/models/account_analytic_account.py
-
BINcontract_recurring_invoicing_marker/static/description/icon.png
-
320contract_recurring_invoicing_marker/static/description/icon.svg
-
5contract_recurring_invoicing_marker/tests/__init__.py
-
55contract_recurring_invoicing_marker/tests/test_contract_recurring_invoicing_marker.py
-
20contract_recurring_invoicing_marker/views/account_analytic_account_view.xml
@ -0,0 +1,79 @@ |
|||||
|
.. image:: https://img.shields.io/badge/licence-AGPL--3-blue.svg |
||||
|
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html |
||||
|
:alt: License: AGPL-3 |
||||
|
|
||||
|
======================================= |
||||
|
Markers for contract recurring invoices |
||||
|
======================================= |
||||
|
|
||||
|
This module allows to include some markers on the lines of your recurring |
||||
|
invoices definition inside the contract so that the generated invoice lines |
||||
|
will contain a dynamic text depending on these markers. |
||||
|
|
||||
|
These markers are the supported ones: |
||||
|
|
||||
|
* #START#: Start date of the invoiced period. |
||||
|
* #END# End date of the invoiced period. |
||||
|
|
||||
|
Usage |
||||
|
===== |
||||
|
|
||||
|
On a contract (*Sales > Sales > Contracts*), mark "Generate recurring invoices |
||||
|
automatically" for enabling the creation of recurring invoices. |
||||
|
|
||||
|
In the "Invoice Lines" section, you can add lines with products. In the |
||||
|
*Description* field, you can now add any of the markers mentioned before |
||||
|
between the rest of the text. |
||||
|
|
||||
|
When you invoice this contract (automatically or manually), your invoice |
||||
|
will contain the corresponding text that replaces the marker. |
||||
|
|
||||
|
.. image:: https://odoo-community.org/website/image/ir.attachment/5784_f2813bd/datas |
||||
|
:alt: Try me on Runbot |
||||
|
:target: https://runbot.odoo-community.org/runbot/110/8.0 |
||||
|
|
||||
|
Known issues / Roadmap |
||||
|
====================== |
||||
|
|
||||
|
* Add more markers, like #START_MONTH# or #END_MONTH#. |
||||
|
|
||||
|
Bug Tracker |
||||
|
=========== |
||||
|
|
||||
|
Bugs are tracked on `GitHub Issues <https://github.com/OCA/ |
||||
|
contract/issues>`_. |
||||
|
In case of trouble, please check there if your issue has already been reported. |
||||
|
If you spotted it first, help us smashing it by providing a detailed and welcomed feedback `here <https://github.com/OCA/ |
||||
|
contract/issues/new?body=module:%20 |
||||
|
contract_recurring_invoicing_markers%0Aversion:%20 |
||||
|
8.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_. |
||||
|
|
||||
|
Credits |
||||
|
======= |
||||
|
|
||||
|
Contributors |
||||
|
------------ |
||||
|
|
||||
|
* Pedro M. Baeza <pedro.baeza@serviciosbaeza.com> |
||||
|
|
||||
|
Icon |
||||
|
---- |
||||
|
|
||||
|
* https://openclipart.org/detail/125071/pie-graph |
||||
|
* Subicon made by `Freepik <http://www.flaticon.com/authors/freepik>_ from |
||||
|
www.flaticon.com |
||||
|
|
||||
|
Maintainer |
||||
|
---------- |
||||
|
|
||||
|
.. image:: https://odoo-community.org/logo.png |
||||
|
:alt: Odoo Community Association |
||||
|
:target: https://odoo-community.org |
||||
|
|
||||
|
This module is maintained by the OCA. |
||||
|
|
||||
|
OCA, or the Odoo Community Association, is a nonprofit organization whose |
||||
|
mission is to support the collaborative development of Odoo features and |
||||
|
promote its widespread use. |
||||
|
|
||||
|
To contribute to this module, please visit http://odoo-community.org. |
@ -0,0 +1,5 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
# (c) 2016 Serv. Tecnol. Avanzados - Pedro M. Baeza |
||||
|
# License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0.html |
||||
|
|
||||
|
from . import models |
@ -0,0 +1,20 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
# © 2016 Serv. Tecnol. Avanzados - Pedro M. Baeza |
||||
|
# License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0.html |
||||
|
|
||||
|
{ |
||||
|
'name': 'Markers for contract recurring invoices', |
||||
|
'version': '8.0.1.0.0', |
||||
|
'category': 'Contract Management', |
||||
|
'author': 'Serv. Tecnol. Avanzados - Pedro M. Baeza, ' |
||||
|
'Odoo Community Association (OCA)', |
||||
|
'website': 'http://www.serviciosbaeza.com', |
||||
|
'depends': [ |
||||
|
'account_analytic_analysis', |
||||
|
], |
||||
|
'license': 'AGPL-3', |
||||
|
'data': [ |
||||
|
'views/account_analytic_account_view.xml', |
||||
|
], |
||||
|
'installable': True, |
||||
|
} |
@ -0,0 +1,47 @@ |
|||||
|
# Translation of Odoo Server. |
||||
|
# This file contains the translation of the following modules: |
||||
|
# * contract_recurring_invoicing_marker |
||||
|
# |
||||
|
msgid "" |
||||
|
msgstr "" |
||||
|
"Project-Id-Version: Odoo Server 8.0\n" |
||||
|
"Report-Msgid-Bugs-To: \n" |
||||
|
"POT-Creation-Date: 2016-02-22 17:47+0000\n" |
||||
|
"PO-Revision-Date: 2016-02-22 17:47+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: contract_recurring_invoicing_marker |
||||
|
#: view:account.analytic.account:contract_recurring_invoicing_marker.account_analytic_account_form_form |
||||
|
msgid "#END#" |
||||
|
msgstr "#END#" |
||||
|
|
||||
|
#. module: contract_recurring_invoicing_marker |
||||
|
#: view:account.analytic.account:contract_recurring_invoicing_marker.account_analytic_account_form_form |
||||
|
msgid "#START#" |
||||
|
msgstr "#START#" |
||||
|
|
||||
|
#. module: contract_recurring_invoicing_marker |
||||
|
#: view:account.analytic.account:contract_recurring_invoicing_marker.account_analytic_account_form_form |
||||
|
msgid ": End date of the invoiced period" |
||||
|
msgstr ": Fecha final del periodo facturado" |
||||
|
|
||||
|
#. module: contract_recurring_invoicing_marker |
||||
|
#: view:account.analytic.account:contract_recurring_invoicing_marker.account_analytic_account_form_form |
||||
|
msgid ": Start date of the invoiced period" |
||||
|
msgstr ": Fecha inicial del periodo facturado" |
||||
|
|
||||
|
#. module: contract_recurring_invoicing_marker |
||||
|
#: model:ir.model,name:contract_recurring_invoicing_marker.model_account_analytic_account |
||||
|
msgid "Analytic Account" |
||||
|
msgstr "Cuenta analítica" |
||||
|
|
||||
|
#. module: contract_recurring_invoicing_marker |
||||
|
#: view:account.analytic.account:contract_recurring_invoicing_marker.account_analytic_account_form_form |
||||
|
msgid "Legend (for the markers inside invoice lines description)" |
||||
|
msgstr "Leyenda (para los marcadores dentro de la descripción de las líneas de factura)" |
||||
|
|
@ -0,0 +1,5 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
# (c) 2016 Serv. Tecnol. Avanzados - Pedro M. Baeza |
||||
|
# License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0.html |
||||
|
|
||||
|
from . import account_analytic_account |
@ -0,0 +1,46 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
# (c) 2016 Serv. Tecnol. Avanzados - Pedro M. Baeza |
||||
|
# License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0.html |
||||
|
|
||||
|
from openerp import api, fields, models |
||||
|
from dateutil.relativedelta import relativedelta |
||||
|
|
||||
|
|
||||
|
class AccountAnalyticAccount(models.Model): |
||||
|
_inherit = "account.analytic.account" |
||||
|
|
||||
|
@api.model |
||||
|
def _prepare_invoice(self, contract): |
||||
|
next_date = fields.Date.from_string( |
||||
|
contract.recurring_next_date or fields.Date.today()) |
||||
|
interval = contract.recurring_interval |
||||
|
old_date = next_date |
||||
|
if contract.recurring_rule_type == 'daily': |
||||
|
new_date = next_date + relativedelta(days=interval - 1) |
||||
|
elif contract.recurring_rule_type == 'weekly': |
||||
|
new_date = next_date + relativedelta(weeks=interval, days=-1) |
||||
|
else: |
||||
|
new_date = next_date + relativedelta(months=interval, days=-1) |
||||
|
obj = self.with_context(old_date=old_date, next_date=new_date) |
||||
|
return super(AccountAnalyticAccount, obj)._prepare_invoice(contract) |
||||
|
|
||||
|
@api.model |
||||
|
def _insert_markers(self, line, date_start, date_end, date_format): |
||||
|
line = line.replace('#START#', date_start.strftime(date_format)) |
||||
|
line = line.replace('#END#', date_end.strftime(date_format)) |
||||
|
return line |
||||
|
|
||||
|
@api.model |
||||
|
def _prepare_invoice_line(self, line, invoice_id): |
||||
|
res = super(AccountAnalyticAccount, self)._prepare_invoice_line( |
||||
|
line, invoice_id) |
||||
|
if 'old_date' in self.env.context and 'next_date' in self.env.context: |
||||
|
lang_obj = self.env['res.lang'] |
||||
|
contract = line.analytic_account_id |
||||
|
lang = lang_obj.search( |
||||
|
[('code', '=', contract.partner_id.lang)]) |
||||
|
date_format = lang.date_format or '%m/%d/%Y' |
||||
|
res['name'] = self._insert_markers( |
||||
|
res['name'], self.env.context['old_date'], |
||||
|
self.env.context['next_date'], date_format) |
||||
|
return res |
After Width: 128 | Height: 128 | Size: 6.2 KiB |
@ -0,0 +1,320 @@ |
|||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?> |
||||
|
<!-- Created with Inkscape (http://www.inkscape.org/) --> |
||||
|
|
||||
|
<svg |
||||
|
xmlns:dc="http://purl.org/dc/elements/1.1/" |
||||
|
xmlns:cc="http://creativecommons.org/ns#" |
||||
|
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" |
||||
|
xmlns:svg="http://www.w3.org/2000/svg" |
||||
|
xmlns="http://www.w3.org/2000/svg" |
||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" |
||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" |
||||
|
id="svg2" |
||||
|
sodipodi:docname="icon.svg" |
||||
|
viewBox="0 0 128 128" |
||||
|
version="1.1" |
||||
|
inkscape:version="0.48.4 r9939" |
||||
|
width="128" |
||||
|
height="128" |
||||
|
inkscape:export-filename="icon.png" |
||||
|
inkscape:export-xdpi="90" |
||||
|
inkscape:export-ydpi="90"> |
||||
|
<defs |
||||
|
id="defs4"> |
||||
|
<linearGradient |
||||
|
id="linearGradient4306"> |
||||
|
<stop |
||||
|
id="stop4308" |
||||
|
style="stop-color:#dedc37" |
||||
|
offset="0" /> |
||||
|
<stop |
||||
|
id="stop4310" |
||||
|
style="stop-color:#f8fa8d" |
||||
|
offset="1" /> |
||||
|
</linearGradient> |
||||
|
<linearGradient |
||||
|
id="linearGradient3727"> |
||||
|
<stop |
||||
|
id="stop3729" |
||||
|
style="stop-color:#f3f360" |
||||
|
offset="0" /> |
||||
|
<stop |
||||
|
id="stop3731" |
||||
|
style="stop-color:#cbc630" |
||||
|
offset="1" /> |
||||
|
</linearGradient> |
||||
|
<linearGradient |
||||
|
id="linearGradient3717"> |
||||
|
<stop |
||||
|
id="stop3719" |
||||
|
style="stop-color:#e4e240" |
||||
|
offset="0" /> |
||||
|
<stop |
||||
|
id="stop3725" |
||||
|
style="stop-color:#d4d237" |
||||
|
offset=".47047" /> |
||||
|
<stop |
||||
|
id="stop3721" |
||||
|
style="stop-color:#f8f44e" |
||||
|
offset="1" /> |
||||
|
</linearGradient> |
||||
|
<linearGradient |
||||
|
id="linearGradient3590"> |
||||
|
<stop |
||||
|
id="stop3592" |
||||
|
style="stop-color:#b8b852" |
||||
|
offset="0" /> |
||||
|
<stop |
||||
|
id="stop3594" |
||||
|
style="stop-color:#dbd649" |
||||
|
offset="1" /> |
||||
|
</linearGradient> |
||||
|
<filter |
||||
|
inkscape:menu-tooltip="In and out glow with a possible offset and colorizable flood" |
||||
|
inkscape:menu="Shadows and Glows" |
||||
|
inkscape:label="Cutout Glow" |
||||
|
style="color-interpolation-filters:sRGB;" |
||||
|
id="filter3869"> |
||||
|
<feOffset |
||||
|
dy="3" |
||||
|
dx="3" |
||||
|
id="feOffset3871" /> |
||||
|
<feGaussianBlur |
||||
|
stdDeviation="3" |
||||
|
result="blur" |
||||
|
id="feGaussianBlur3873" /> |
||||
|
<feFlood |
||||
|
flood-color="rgb(0,0,0)" |
||||
|
flood-opacity="1" |
||||
|
result="flood" |
||||
|
id="feFlood3875" /> |
||||
|
<feComposite |
||||
|
in="flood" |
||||
|
in2="SourceGraphic" |
||||
|
operator="in" |
||||
|
result="composite" |
||||
|
id="feComposite3877" /> |
||||
|
<feBlend |
||||
|
in="blur" |
||||
|
in2="composite" |
||||
|
mode="normal" |
||||
|
id="feBlend3879" /> |
||||
|
</filter> |
||||
|
</defs> |
||||
|
<sodipodi:namedview |
||||
|
id="base" |
||||
|
bordercolor="#666666" |
||||
|
inkscape:pageshadow="2" |
||||
|
inkscape:window-y="24" |
||||
|
pagecolor="#ffffff" |
||||
|
inkscape:window-height="1176" |
||||
|
inkscape:window-maximized="1" |
||||
|
inkscape:zoom="4.9954589" |
||||
|
inkscape:window-x="59" |
||||
|
showgrid="false" |
||||
|
borderopacity="1.0" |
||||
|
inkscape:current-layer="layer1" |
||||
|
inkscape:cx="73.86699" |
||||
|
inkscape:cy="46.4832" |
||||
|
showguides="true" |
||||
|
inkscape:guide-bbox="true" |
||||
|
inkscape:window-width="1861" |
||||
|
inkscape:pageopacity="0.0" |
||||
|
inkscape:document-units="px" /> |
||||
|
<g |
||||
|
id="layer1" |
||||
|
inkscape:label="Layer 1" |
||||
|
inkscape:groupmode="layer" |
||||
|
transform="translate(-319.71,-475.23)"> |
||||
|
<g |
||||
|
id="g3620" |
||||
|
transform="matrix(2.2116072,0,0,2.2116072,-246.9006,-632.55508)"> |
||||
|
<path |
||||
|
style="fill:#ffffff" |
||||
|
sodipodi:nodetypes="sssssssss" |
||||
|
inkscape:connector-curvature="0" |
||||
|
d="m 298.70134,500.89595 -38.10593,0 c -2.4922,0 -4.39684,1.9053 -4.39684,4.39684 l 0,38.10527 c 0,2.4922 1.90464,4.39749 4.39684,4.39749 l 38.10593,0 c 2.49154,0 4.39683,-1.90529 4.39683,-4.39749 l 0,-38.10527 c 0,-2.49154 -1.90529,-4.39684 -4.39683,-4.39684 z" |
||||
|
id="path3618" /> |
||||
|
<path |
||||
|
id="path3497" |
||||
|
d="m 298.70134,500.89595 -38.10593,0 c -2.4922,0 -4.39684,1.9053 -4.39684,4.39684 l 0,38.10527 c 0,2.4922 1.90464,4.39749 4.39684,4.39749 l 38.10593,0 c 2.49154,0 4.39683,-1.90529 4.39683,-4.39749 l 0,-38.10527 c 0,-2.49154 -1.90529,-4.39684 -4.39683,-4.39684 z m 1.4643,42.50211 c 0,0.88068 -0.58624,1.46561 -1.4643,1.46561 l -38.10593,0 c -0.87937,0 -1.46561,-0.58624 -1.46561,-1.46561 l 0,-38.10527 c 0,-0.88002 0.58624,-1.46561 1.46561,-1.46561 l 38.10593,0 c 0.88002,0 1.4643,0.58624 1.4643,1.46561 l 0,38.10527 z" |
||||
|
inkscape:connector-curvature="0" /> |
||||
|
<path |
||||
|
id="path3499" |
||||
|
d="m 291.81296,519.06955 0.14787,-0.73216 c 0.14721,-0.43968 -0.14787,-0.87936 -0.58625,-1.02527 -0.43968,-0.14722 -0.88002,0.14722 -1.02593,0.58625 l -0.14721,0.73215 c -0.87937,-0.14656 -1.61218,0 -1.75874,0.43968 l -3.51812,13.33642 4.54274,1.17184 3.51682,-13.33642 c 0.14721,-0.29378 -0.29247,-0.87937 -1.17118,-1.17249 z" |
||||
|
inkscape:connector-curvature="0" /> |
||||
|
<path |
||||
|
id="path3501" |
||||
|
d="m 294.01138,520.09548 c -0.14787,0 -0.441,0.14721 -0.441,0.29246 l -1.75873,6.59526 0.7328,0.14722 1.75874,-6.59526 c 0.001,-0.14656 0.001,-0.43968 -0.29181,-0.43968 z" |
||||
|
inkscape:connector-curvature="0" /> |
||||
|
<path |
||||
|
id="path3503" |
||||
|
d="m 286.24363,536.80411 c 0,0 1.17249,-1.02593 2.05251,-1.90529 l -2.93057,-0.73346 c 0.29116,1.17314 0.87806,2.63875 0.87806,2.63875 z" |
||||
|
inkscape:connector-curvature="0" /> |
||||
|
<path |
||||
|
id="path3505" |
||||
|
d="m 285.36361,536.07065 -0.29247,0 c -0.73281,0 -1.46496,0.14722 -4.39749,0.14722 -0.29247,0 -0.58625,-0.14722 -0.88003,-0.43969 -0.43902,-0.29312 -0.7328,-0.58624 -1.31905,-0.58624 l 0,0 c -0.43968,0 -0.88002,0.29247 -1.90529,0.73215 -0.43969,0.29312 -1.17249,0.58625 -1.46562,0.73346 0,-0.14787 0,-0.58624 0.14657,-0.73346 0.14721,-0.58624 0.14721,-1.17183 0,-1.4643 -0.14657,-0.14722 -0.29247,-0.14722 -0.43969,-0.14722 l 0,0 c -0.87937,0 -1.75873,1.02528 -2.78466,1.90464 -0.58494,0.5869 -1.31775,1.31906 -1.61087,1.31906 l 0,0 c -0.29312,-0.43969 0.73281,-2.4922 1.02593,-3.3696 0.58625,-1.46562 0.87937,-1.75874 0.43969,-2.05252 -0.14722,-0.14721 -0.29313,-0.14721 -0.73281,0 -0.58625,0.43969 -1.31905,1.02462 -1.9053,1.75874 -1.31905,1.17183 -2.6381,2.49285 -3.66403,2.05186 -0.14721,-0.14657 -0.43968,0 -0.58624,0.14917 -0.14657,0.14722 0,0.43969 0.14721,0.5856 1.46496,0.73215 2.93057,-0.73347 4.54275,-2.19777 0.43968,-0.29247 0.7328,-0.73215 1.17249,-1.02462 -0.14657,0.14656 -0.14657,0.29247 -0.29313,0.43968 -0.87936,1.9053 -1.46495,3.3696 -1.02527,4.10307 0.14656,0.14721 0.29312,0.29115 0.58624,0.29115 l 0,0 c 0.58625,0 1.31971,-0.73215 2.19842,-1.61151 0.73281,-0.73347 1.46562,-1.46562 2.05186,-1.61283 0,0.14721 0,0.43968 -0.14656,0.73346 -0.14722,0.58624 -0.14722,1.17183 0,1.46561 0.14591,0.14329 0.29247,0.29051 0.43903,0.29051 0.43968,0 1.02593,-0.29247 1.9053,-0.87937 0.43968,-0.29378 1.31905,-0.73346 1.46561,-0.73346 l 0,0 c 0.29247,0 0.58624,0.14721 0.87937,0.43968 0.29312,0.29378 0.7328,0.58625 1.31905,0.58625 3.07713,0 3.66534,0 4.54274,-0.14657 l 0.29312,0 c 0.14657,0 0.29247,-0.14721 0.29247,-0.44099 6.6e-4,-0.29116 0.29378,-0.29116 6.6e-4,-0.29116 z" |
||||
|
inkscape:connector-curvature="0" /> |
||||
|
<rect |
||||
|
id="rect3507" |
||||
|
height="2.9312253" |
||||
|
width="29.312252" |
||||
|
y="510.569" |
||||
|
x="264.99225" /> |
||||
|
<rect |
||||
|
id="rect3509" |
||||
|
height="2.9305711" |
||||
|
width="18.467373" |
||||
|
y="516.43146" |
||||
|
x="264.99225" /> |
||||
|
<rect |
||||
|
id="rect3511" |
||||
|
height="2.9312253" |
||||
|
width="18.467373" |
||||
|
y="523.75952" |
||||
|
x="264.99225" /> |
||||
|
</g> |
||||
|
<g |
||||
|
id="g3513" |
||||
|
transform="matrix(0.65429135,0,0,0.65429135,252.06849,472.60499)" /> |
||||
|
<g |
||||
|
id="g3515" |
||||
|
transform="matrix(0.65429135,0,0,0.65429135,252.06849,472.60499)" /> |
||||
|
<g |
||||
|
id="g3517" |
||||
|
transform="matrix(0.65429135,0,0,0.65429135,252.06849,472.60499)" /> |
||||
|
<g |
||||
|
id="g3519" |
||||
|
transform="matrix(0.65429135,0,0,0.65429135,252.06849,472.60499)" /> |
||||
|
<g |
||||
|
id="g3521" |
||||
|
transform="matrix(0.65429135,0,0,0.65429135,252.06849,472.60499)" /> |
||||
|
<g |
||||
|
id="g3523" |
||||
|
transform="matrix(0.65429135,0,0,0.65429135,252.06849,472.60499)" /> |
||||
|
<g |
||||
|
id="g3525" |
||||
|
transform="matrix(0.65429135,0,0,0.65429135,252.06849,472.60499)" /> |
||||
|
<g |
||||
|
id="g3527" |
||||
|
transform="matrix(0.65429135,0,0,0.65429135,252.06849,472.60499)" /> |
||||
|
<g |
||||
|
id="g3529" |
||||
|
transform="matrix(0.65429135,0,0,0.65429135,252.06849,472.60499)" /> |
||||
|
<g |
||||
|
id="g3531" |
||||
|
transform="matrix(0.65429135,0,0,0.65429135,252.06849,472.60499)" /> |
||||
|
<g |
||||
|
id="g3533" |
||||
|
transform="matrix(0.65429135,0,0,0.65429135,252.06849,472.60499)" /> |
||||
|
<g |
||||
|
id="g3535" |
||||
|
transform="matrix(0.65429135,0,0,0.65429135,252.06849,472.60499)" /> |
||||
|
<g |
||||
|
id="g3537" |
||||
|
transform="matrix(0.65429135,0,0,0.65429135,252.06849,472.60499)" /> |
||||
|
<g |
||||
|
id="g3539" |
||||
|
transform="matrix(0.65429135,0,0,0.65429135,252.06849,472.60499)" /> |
||||
|
<g |
||||
|
id="g3541" |
||||
|
transform="matrix(0.65429135,0,0,0.65429135,252.06849,472.60499)" /> |
||||
|
<g |
||||
|
style="font-size:16px;font-style:normal;font-weight:bold;text-align:center;line-height:92.00000167%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#cccccc;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans Bold" |
||||
|
id="text3060"> |
||||
|
<path |
||||
|
d="m 373.03812,577.02563 -0.75,3.00782 2.0625,0 0.75781,-3.00782 1.72656,0 -0.75781,3.00782 2.16406,0 0,1.66406 -2.57812,0 -0.53907,2.14062 2.21875,0 0,1.67969 -2.625,0 -0.75,2.99219 -1.72656,0 0.75,-2.99219 -2.0625,0 -0.75,2.99219 -1.74219,0 0.75,-2.99219 -2.17968,0 0,-1.67969 2.5625,0 0.54687,-2.14062 -2.21094,0 0,-1.66406 2.64063,0 0.75,-3.00782 1.74219,0 m 0.88281,4.67188 -2.0625,0 -0.54688,2.14062 2.0625,0 0.54688,-2.14062" |
||||
|
style="" |
||||
|
id="path3839" /> |
||||
|
<path |
||||
|
d="m 388.91312,577.21313 0,2.46875 c -0.64064,-0.28644 -1.26564,-0.50259 -1.875,-0.64843 -0.60939,-0.14583 -1.18491,-0.21874 -1.72657,-0.21875 -0.71875,10e-6 -1.25,0.099 -1.59375,0.29687 -0.34375,0.19793 -0.51562,0.50522 -0.51562,0.92188 0,0.31251 0.11458,0.5573 0.34375,0.73437 0.23437,0.17188 0.65624,0.32032 1.26562,0.44531 l 1.28125,0.25782 c 1.29687,0.26042 2.21874,0.65625 2.76563,1.1875 0.54686,0.53125 0.8203,1.28646 0.82031,2.26562 -1e-5,1.28646 -0.38282,2.2448 -1.14844,2.875 -0.76042,0.625 -1.92448,0.9375 -3.49218,0.9375 -0.73959,0 -1.48178,-0.0703 -2.22657,-0.21094 -0.74479,-0.14062 -1.48958,-0.34895 -2.23437,-0.625 l 0,-2.53906 c 0.74479,0.39584 1.46354,0.69532 2.15625,0.89844 0.69791,0.19792 1.36979,0.29688 2.01562,0.29687 0.65625,10e-6 1.15885,-0.10937 1.50782,-0.32812 0.34895,-0.21875 0.52343,-0.53125 0.52343,-0.9375 0,-0.36458 -0.1198,-0.64583 -0.35937,-0.84375 -0.23438,-0.19791 -0.70574,-0.375 -1.41406,-0.53125 l -1.16407,-0.25781 c -1.16667,-0.25 -2.02083,-0.64843 -2.5625,-1.19532 -0.53646,-0.54686 -0.80468,-1.28384 -0.80468,-2.21093 0,-1.16145 0.37499,-2.05468 1.125,-2.67969 0.74999,-0.62499 1.82812,-0.93749 3.23437,-0.9375 0.64062,1e-5 1.29947,0.0495 1.97656,0.14844 0.67708,0.0938 1.3776,0.23699 2.10157,0.42968" |
||||
|
style="" |
||||
|
id="path3841" /> |
||||
|
<path |
||||
|
d="m 390.93655,576.84595 10.75,0 0,2.27343 -3.86718,0 0,9.39063 -3.00782,0 0,-9.39063 -3.875,0 0,-2.27343" |
||||
|
style="" |
||||
|
id="path3843" /> |
||||
|
<path |
||||
|
d="m 409.06155,586.38501 -4.70312,0 -0.74219,2.125 -3.02344,0 4.32032,-11.66406 3.58593,0 4.32032,11.66406 -3.02344,0 -0.73438,-2.125 m -3.95312,-2.16406 3.19531,0 -1.59375,-4.64063 -1.60156,4.64063" |
||||
|
style="" |
||||
|
id="path3845" /> |
||||
|
<path |
||||
|
d="m 418.63187,582.01782 c 0.6302,10e-6 1.08072,-0.11718 1.35156,-0.35156 0.27603,-0.23437 0.41405,-0.61978 0.41406,-1.15625 -1e-5,-0.53124 -0.13803,-0.91145 -0.41406,-1.14063 -0.27084,-0.22915 -0.72136,-0.34374 -1.35156,-0.34375 l -1.26563,0 0,2.99219 1.26563,0 m -1.26563,2.07813 0,4.41406 -3.00781,0 0,-11.66406 4.59375,0 c 1.53645,10e-6 2.66145,0.25782 3.375,0.77343 0.71874,0.51564 1.07811,1.33074 1.07812,2.44532 -1e-5,0.77084 -0.18751,1.40365 -0.5625,1.89843 -0.3698,0.4948 -0.92969,0.85939 -1.67968,1.09375 0.41145,0.0938 0.77863,0.3073 1.10156,0.64063 0.32811,0.32813 0.65884,0.82813 0.99219,1.5 l 1.63281,3.3125 -3.20313,0 -1.42187,-2.89844 c -0.28647,-0.58333 -0.57813,-0.98176 -0.875,-1.19531 -0.29167,-0.21354 -0.6823,-0.32031 -1.17188,-0.32031 l -0.85156,0" |
||||
|
style="" |
||||
|
id="path3847" /> |
||||
|
<path |
||||
|
d="m 424.56155,576.84595 10.75,0 0,2.27343 -3.86718,0 0,9.39063 -3.00782,0 0,-9.39063 -3.875,0 0,-2.27343" |
||||
|
style="" |
||||
|
id="path3849" /> |
||||
|
<path |
||||
|
d="m 442.50687,577.02563 -0.75,3.00782 2.0625,0 0.75781,-3.00782 1.72656,0 -0.75781,3.00782 2.16406,0 0,1.66406 -2.57812,0 -0.53907,2.14062 2.21875,0 0,1.67969 -2.625,0 -0.75,2.99219 -1.72656,0 0.75,-2.99219 -2.0625,0 -0.75,2.99219 -1.74219,0 0.75,-2.99219 -2.17968,0 0,-1.67969 2.5625,0 0.54687,-2.14062 -2.21094,0 0,-1.66406 2.64063,0 0.75,-3.00782 1.74219,0 m 0.88281,4.67188 -2.0625,0 -0.54688,2.14062 2.0625,0 0.54688,-2.14062" |
||||
|
style="" |
||||
|
id="path3851" /> |
||||
|
<path |
||||
|
d="m 382.25687,591.74564 -0.75,3.00781 2.0625,0 0.75781,-3.00781 1.72656,0 -0.75781,3.00781 2.16406,0 0,1.66406 -2.57812,0 -0.53907,2.14063 2.21875,0 0,1.67968 -2.625,0 -0.75,2.99219 -1.72656,0 0.75,-2.99219 -2.0625,0 -0.75,2.99219 -1.74219,0 0.75,-2.99219 -2.17968,0 0,-1.67968 2.5625,0 0.54687,-2.14063 -2.21094,0 0,-1.66406 2.64063,0 0.75,-3.00781 1.74219,0 m 0.88281,4.67187 -2.0625,0 -0.54688,2.14063 2.0625,0 0.54688,-2.14063" |
||||
|
style="" |
||||
|
id="path3853" /> |
||||
|
<path |
||||
|
d="m 390.01468,591.56595 8.11719,0 0,2.27344 -5.10938,0 0,2.17187 4.80469,0 0,2.27344 -4.80469,0 0,2.67187 5.28125,0 0,2.27344 -8.28906,0 0,-11.66406" |
||||
|
style="" |
||||
|
id="path3855" /> |
||||
|
<path |
||||
|
d="m 400.95218,591.56595 3.35937,0 4.24219,8 0,-8 2.85156,0 0,11.66406 -3.35937,0 -4.24219,-8 0,8 -2.85156,0 0,-11.66406" |
||||
|
style="" |
||||
|
id="path3857" /> |
||||
|
<path |
||||
|
d="m 417.36624,593.83939 0,7.11718 1.07813,0 c 1.22916,0 2.16666,-0.30468 2.8125,-0.91406 0.65103,-0.60937 0.97655,-1.49479 0.97656,-2.65625 -10e-6,-1.15624 -0.32293,-2.03645 -0.96875,-2.64062 -0.64584,-0.60416 -1.58595,-0.90625 -2.82031,-0.90625 l -1.07813,0 m -3.00781,-2.27344 3.17187,0 c 1.77083,10e-6 3.08854,0.12761 3.95313,0.38281 0.86978,0.25001 1.61457,0.67709 2.23437,1.28125 0.54687,0.52605 0.95312,1.13282 1.21875,1.82031 0.26562,0.68751 0.39843,1.46616 0.39844,2.33594 -1e-5,0.88021 -0.13282,1.66667 -0.39844,2.35938 -0.26563,0.6875 -0.67188,1.29427 -1.21875,1.82031 -0.62501,0.60417 -1.37501,1.03385 -2.25,1.28906 -0.875,0.25 -2.1875,0.375 -3.9375,0.375 l -3.17187,0 0,-11.66406" |
||||
|
style="" |
||||
|
id="path3859" /> |
||||
|
<path |
||||
|
d="m 433.28812,591.74564 -0.75,3.00781 2.0625,0 0.75781,-3.00781 1.72656,0 -0.75781,3.00781 2.16406,0 0,1.66406 -2.57812,0 -0.53907,2.14063 2.21875,0 0,1.67968 -2.625,0 -0.75,2.99219 -1.72656,0 0.75,-2.99219 -2.0625,0 -0.75,2.99219 -1.74219,0 0.75,-2.99219 -2.17968,0 0,-1.67968 2.5625,0 0.54687,-2.14063 -2.21094,0 0,-1.66406 2.64063,0 0.75,-3.00781 1.74219,0 m 0.88281,4.67187 -2.0625,0 -0.54688,2.14063 2.0625,0 0.54688,-2.14063" |
||||
|
style="" |
||||
|
id="path3861" /> |
||||
|
</g> |
||||
|
</g> |
||||
|
<metadata |
||||
|
id="metadata499"> |
||||
|
<rdf:RDF> |
||||
|
<cc:Work> |
||||
|
<dc:format>image/svg+xml</dc:format> |
||||
|
<dc:type |
||||
|
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> |
||||
|
<cc:license |
||||
|
rdf:resource="http://creativecommons.org/publicdomain/zero/1.0/" /> |
||||
|
<dc:publisher> |
||||
|
<cc:Agent |
||||
|
rdf:about="http://openclipart.org/"> |
||||
|
<dc:title>Openclipart</dc:title> |
||||
|
</cc:Agent> |
||||
|
</dc:publisher> |
||||
|
<dc:title>Pile of Golden Coins</dc:title> |
||||
|
<dc:date>2010-04-09T03:27:45</dc:date> |
||||
|
<dc:description>A pile of hypothetical golden coins, drawn in Inkscape.</dc:description> |
||||
|
<dc:source>https://openclipart.org/detail/43969/pile-of-golden-coins-by-j_alves</dc:source> |
||||
|
<dc:creator> |
||||
|
<cc:Agent> |
||||
|
<dc:title>J_Alves</dc:title> |
||||
|
</cc:Agent> |
||||
|
</dc:creator> |
||||
|
<dc:subject> |
||||
|
<rdf:Bag> |
||||
|
<rdf:li>coin</rdf:li> |
||||
|
<rdf:li>currency</rdf:li> |
||||
|
<rdf:li>gold</rdf:li> |
||||
|
<rdf:li>money</rdf:li> |
||||
|
<rdf:li>thaler</rdf:li> |
||||
|
</rdf:Bag> |
||||
|
</dc:subject> |
||||
|
</cc:Work> |
||||
|
<cc:License |
||||
|
rdf:about="http://creativecommons.org/publicdomain/zero/1.0/"> |
||||
|
<cc:permits |
||||
|
rdf:resource="http://creativecommons.org/ns#Reproduction" /> |
||||
|
<cc:permits |
||||
|
rdf:resource="http://creativecommons.org/ns#Distribution" /> |
||||
|
<cc:permits |
||||
|
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" /> |
||||
|
</cc:License> |
||||
|
</rdf:RDF> |
||||
|
</metadata> |
||||
|
</svg> |
@ -0,0 +1,5 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
# (c) 2016 Serv. Tecnol. Avanzados - Pedro M. Baeza |
||||
|
# License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0.html |
||||
|
|
||||
|
from . import test_contract_recurring_invoicing_marker |
@ -0,0 +1,55 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
# (c) 2016 Serv. Tecnol. Avanzados - Pedro M. Baeza |
||||
|
# License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0.html |
||||
|
|
||||
|
import openerp.tests.common as common |
||||
|
|
||||
|
|
||||
|
class TestContractRecurringInvoicingMarker(common.TransactionCase): |
||||
|
|
||||
|
def setUp(self): |
||||
|
super(TestContractRecurringInvoicingMarker, self).setUp() |
||||
|
self.partner = self.env['res.partner'].create({ |
||||
|
'name': 'Test', |
||||
|
'lang': 'en_US', |
||||
|
}) |
||||
|
self.product = self.env.ref('product.product_product_consultant') |
||||
|
self.uom = self.env.ref('product.product_uom_hour') |
||||
|
self.contract = self.env['account.analytic.account'].create({ |
||||
|
'name': 'Test contract', |
||||
|
'partner_id': self.partner.id, |
||||
|
'type': 'contract', |
||||
|
'recurring_invoices': 1, |
||||
|
'recurring_next_date': '2016-01-01', |
||||
|
'recurring_rule_type': 'monthly', |
||||
|
'recurring_interval': 1, |
||||
|
'recurring_invoice_line_ids': [ |
||||
|
(0, 0, {'quantity': 2.0, |
||||
|
'price_unit': 100.0, |
||||
|
'name': '#START# - #END#', |
||||
|
'product_id': self.product.id, |
||||
|
'uom_id': self.uom.id})], |
||||
|
}) |
||||
|
|
||||
|
def test_monthly_invoice_with_marker(self): |
||||
|
self.contract.recurring_create_invoice() |
||||
|
invoice = self.env['account.invoice'].search( |
||||
|
[('partner_id', '=', self.partner.id)]) |
||||
|
self.assertEqual( |
||||
|
invoice.invoice_line[0].name, u'01/01/2016 - 01/31/2016') |
||||
|
|
||||
|
def test_daily_invoice_with_marker(self): |
||||
|
self.contract.recurring_rule_type = 'daily' |
||||
|
self.contract.recurring_create_invoice() |
||||
|
invoice = self.env['account.invoice'].search( |
||||
|
[('partner_id', '=', self.partner.id)]) |
||||
|
self.assertEqual( |
||||
|
invoice.invoice_line[0].name, u'01/01/2016 - 01/01/2016') |
||||
|
|
||||
|
def test_weekly_invoice_with_marker(self): |
||||
|
self.contract.recurring_rule_type = 'weekly' |
||||
|
self.contract.recurring_create_invoice() |
||||
|
invoice = self.env['account.invoice'].search( |
||||
|
[('partner_id', '=', self.partner.id)]) |
||||
|
self.assertEqual( |
||||
|
invoice.invoice_line[0].name, u'01/01/2016 - 01/07/2016') |
@ -0,0 +1,20 @@ |
|||||
|
<?xml version="1.0" encoding="utf-8"?> |
||||
|
<openerp> |
||||
|
<data> |
||||
|
|
||||
|
<record id="account_analytic_account_form_form" model="ir.ui.view"> |
||||
|
<field name="name">Contract form (with markers)</field> |
||||
|
<field name="model">account.analytic.account</field> |
||||
|
<field name="inherit_id" ref="account_analytic_analysis.account_analytic_account_form_form"/> |
||||
|
<field name="arch" type="xml"> |
||||
|
<field name="recurring_invoice_line_ids" position="after"> |
||||
|
<group string="Legend (for the markers inside invoice lines description)" name="group_legend"> |
||||
|
<p colspan="2"> <strong>#START#</strong>: Start date of the invoiced period</p> |
||||
|
<p colspan="2"> <strong>#END#</strong>: End date of the invoiced period</p> |
||||
|
</group> |
||||
|
</field> |
||||
|
</field> |
||||
|
</record> |
||||
|
|
||||
|
</data> |
||||
|
</openerp> |
Write
Preview
Loading…
Cancel
Save
Reference in new issue