Merge PR #1154 into 16.0

Signed-off-by pedrobaeza
This commit is contained in:
OCA-git-bot
2024-12-04 20:27:36 +00:00
9 changed files with 260 additions and 466 deletions

View File

@@ -63,8 +63,8 @@ Usage
* the recurrence parameters: interval (days, weeks, months, months last day or years), * the recurrence parameters: interval (days, weeks, months, months last day or years),
start date, date of next invoice (automatically computed, can be modified) and end date (optional) start date, date of next invoice (automatically computed, can be modified) and end date (optional)
* auto-price, for having a price automatically obtained from the price list * auto-price, for having a price automatically obtained from the price list
* #START# or #END# in the description field to display the start/end date of * #START# - #END# or #INVOICEMONTHNAME# in the description field to display
the invoiced period in the invoice line description the start/end date or the start month of the invoiced period in the invoice line description
* pre-paid (invoice at period start) or post-paid (invoice at start of next period) * pre-paid (invoice at period start) or post-paid (invoice at start of next period)
#. The "Generate Recurring Invoices from Contracts" cron runs daily to generate the invoices. #. The "Generate Recurring Invoices from Contracts" cron runs daily to generate the invoices.

View File

@@ -106,6 +106,23 @@ msgstr ""
msgid "<strong>#END#</strong>: End date of the invoiced period" msgid "<strong>#END#</strong>: End date of the invoiced period"
msgstr "" msgstr ""
#. module: contract
#: model_terms:ir.ui.view,arch_db:contract.contract_contract_form_view
msgid ""
"<strong>#INVOICEMONTHNAME#</strong>\n"
" : Invoice month name\n"
" of\n"
" the\n"
" invoiced period"
msgstr ""
#. module: contract
#: model_terms:ir.ui.view,arch_db:contract.contract_template_form_view
msgid ""
"<strong>#INVOICEMONTHNAME#</strong>: Invoice month name of the invoiced "
"period"
msgstr ""
#. module: contract #. module: contract
#: model_terms:ir.ui.view,arch_db:contract.contract_contract_form_view #: model_terms:ir.ui.view,arch_db:contract.contract_contract_form_view
msgid "" msgid ""
@@ -313,6 +330,13 @@ msgstr ""
msgid "Analytic Precision" msgid "Analytic Precision"
msgstr "" msgstr ""
#. module: contract
#. odoo-python
#: code:addons/contract/models/contract_line.py:0
#, python-format
msgid "April"
msgstr ""
#. module: contract #. module: contract
#: model_terms:ir.ui.view,arch_db:contract.contract_contract_form_view #: model_terms:ir.ui.view,arch_db:contract.contract_contract_form_view
#: model_terms:ir.ui.view,arch_db:contract.contract_contract_search_view #: model_terms:ir.ui.view,arch_db:contract.contract_contract_search_view
@@ -345,6 +369,13 @@ msgstr ""
msgid "Attachment Count" msgid "Attachment Count"
msgstr "" msgstr ""
#. module: contract
#. odoo-python
#: code:addons/contract/models/contract_line.py:0
#, python-format
msgid "August"
msgstr ""
#. module: contract #. module: contract
#: model:ir.model.fields,field_description:contract.field_contract_abstract_contract_line__is_auto_renew #: model:ir.model.fields,field_description:contract.field_contract_abstract_contract_line__is_auto_renew
#: model:ir.model.fields,field_description:contract.field_contract_line__is_auto_renew #: model:ir.model.fields,field_description:contract.field_contract_line__is_auto_renew
@@ -930,6 +961,13 @@ msgstr ""
msgid "Day(s)" msgid "Day(s)"
msgstr "" msgstr ""
#. module: contract
#. odoo-python
#: code:addons/contract/models/contract_line.py:0
#, python-format
msgid "December"
msgstr ""
#. module: contract #. module: contract
#: model:ir.model.fields,help:contract.field_contract_abstract_contract_line__note_invoicing_mode #: model:ir.model.fields,help:contract.field_contract_abstract_contract_line__note_invoicing_mode
#: model:ir.model.fields,help:contract.field_contract_line__note_invoicing_mode #: model:ir.model.fields,help:contract.field_contract_line__note_invoicing_mode
@@ -1012,6 +1050,13 @@ msgid ""
"%(ue)s" "%(ue)s"
msgstr "" msgstr ""
#. module: contract
#. odoo-python
#: code:addons/contract/models/contract_line.py:0
#, python-format
msgid "February"
msgstr ""
#. module: contract #. module: contract
#: model_terms:ir.ui.view,arch_db:contract.contract_contract_search_view #: model_terms:ir.ui.view,arch_db:contract.contract_contract_search_view
msgid "Finished" msgid "Finished"
@@ -1240,6 +1285,13 @@ msgstr ""
msgid "Is suspension without end date" msgid "Is suspension without end date"
msgstr "" msgstr ""
#. module: contract
#. odoo-python
#: code:addons/contract/models/contract_line.py:0
#, python-format
msgid "January"
msgstr ""
#. module: contract #. module: contract
#: model:ir.model.fields,field_description:contract.field_contract_abstract_contract__journal_id #: model:ir.model.fields,field_description:contract.field_contract_abstract_contract__journal_id
#: model:ir.model.fields,field_description:contract.field_contract_contract__journal_id #: model:ir.model.fields,field_description:contract.field_contract_contract__journal_id
@@ -1258,6 +1310,20 @@ msgstr ""
msgid "Journal Item" msgid "Journal Item"
msgstr "" msgstr ""
#. module: contract
#. odoo-python
#: code:addons/contract/models/contract_line.py:0
#, python-format
msgid "July"
msgstr ""
#. module: contract
#. odoo-python
#: code:addons/contract/models/contract_line.py:0
#, python-format
msgid "June"
msgstr ""
#. module: contract #. module: contract
#: model:ir.model.fields,field_description:contract.field_contract_abstract_contract_line__last_date_invoiced #: model:ir.model.fields,field_description:contract.field_contract_abstract_contract_line__last_date_invoiced
#: model:ir.model.fields,field_description:contract.field_contract_contract__last_date_invoiced #: model:ir.model.fields,field_description:contract.field_contract_contract__last_date_invoiced
@@ -1343,6 +1409,13 @@ msgstr ""
msgid "Manually Invoice Sale Contracts" msgid "Manually Invoice Sale Contracts"
msgstr "" msgstr ""
#. module: contract
#. odoo-python
#: code:addons/contract/models/contract_line.py:0
#, python-format
msgid "March"
msgstr ""
#. module: contract #. module: contract
#: model:ir.model.fields,help:contract.field_contract_abstract_contract__line_recurrence #: model:ir.model.fields,help:contract.field_contract_abstract_contract__line_recurrence
#: model:ir.model.fields,help:contract.field_contract_contract__line_recurrence #: model:ir.model.fields,help:contract.field_contract_contract__line_recurrence
@@ -1352,6 +1425,13 @@ msgid ""
"all together for the whole contract." "all together for the whole contract."
msgstr "" msgstr ""
#. module: contract
#. odoo-python
#: code:addons/contract/models/contract_line.py:0
#, python-format
msgid "May"
msgstr ""
#. module: contract #. module: contract
#: model:ir.model.fields,field_description:contract.field_contract_contract__message_has_error #: model:ir.model.fields,field_description:contract.field_contract_contract__message_has_error
msgid "Message Delivery error" msgid "Message Delivery error"
@@ -1475,6 +1555,13 @@ msgstr ""
msgid "Notes" msgid "Notes"
msgstr "" msgstr ""
#. module: contract
#. odoo-python
#: code:addons/contract/models/contract_line.py:0
#, python-format
msgid "November"
msgstr ""
#. module: contract #. module: contract
#: model:ir.model.fields,field_description:contract.field_contract_contract__message_needaction_counter #: model:ir.model.fields,field_description:contract.field_contract_contract__message_needaction_counter
msgid "Number of Actions" msgid "Number of Actions"
@@ -1509,6 +1596,13 @@ msgstr ""
msgid "Number of messages with delivery error" msgid "Number of messages with delivery error"
msgstr "" msgstr ""
#. module: contract
#. odoo-python
#: code:addons/contract/models/contract_line.py:0
#, python-format
msgid "October"
msgstr ""
#. module: contract #. module: contract
#: model:ir.model.fields,field_description:contract.field_account_bank_statement_line__old_contract_id #: model:ir.model.fields,field_description:contract.field_account_bank_statement_line__old_contract_id
#: model:ir.model.fields,field_description:contract.field_account_move__old_contract_id #: model:ir.model.fields,field_description:contract.field_account_move__old_contract_id
@@ -1780,6 +1874,13 @@ msgstr ""
msgid "Sent" msgid "Sent"
msgstr "" msgstr ""
#. module: contract
#. odoo-python
#: code:addons/contract/models/contract_line.py:0
#, python-format
msgid "September"
msgstr ""
#. module: contract #. module: contract
#: model:ir.model.fields,field_description:contract.field_contract_abstract_contract_line__sequence #: model:ir.model.fields,field_description:contract.field_contract_abstract_contract_line__sequence
#: model:ir.model.fields,field_description:contract.field_contract_line__sequence #: model:ir.model.fields,field_description:contract.field_contract_line__sequence

View File

@@ -231,6 +231,29 @@ msgstr ""
msgid "<strong>#END#</strong>: End date of the invoiced period" msgid "<strong>#END#</strong>: End date of the invoiced period"
msgstr "<strong>#END#</strong>: Fecha fin del periodo facturado" msgstr "<strong>#END#</strong>: Fecha fin del periodo facturado"
#. module: contract
#: model_terms:ir.ui.view,arch_db:contract.contract_contract_form_view
msgid ""
"<strong>#INVOICEMONTHNAME#</strong>\n"
" : Invoice month name\n"
" of\n"
" the\n"
" invoiced period"
msgstr ""
"<strong>#INVOICEMONTHNAME#</strong>\n"
" : Nombe del mes\n"
" del\n"
" periodo facturado"
#. module: contract
#: model_terms:ir.ui.view,arch_db:contract.contract_template_form_view
msgid ""
"<strong>#INVOICEMONTHNAME#</strong>: Invoice month name of the invoiced "
"period"
msgstr ""
"<strong>#INVOICEMONTHNAME#</strong>: FechaNombre del mes del periodo "
"facturado"
#. module: contract #. module: contract
#: model_terms:ir.ui.view,arch_db:contract.contract_contract_form_view #: model_terms:ir.ui.view,arch_db:contract.contract_contract_form_view
msgid "" msgid ""
@@ -444,6 +467,13 @@ msgstr "Búsqueda de distribución analítica"
msgid "Analytic Precision" msgid "Analytic Precision"
msgstr "Precisión analítica" msgstr "Precisión analítica"
#. module: contract
#. odoo-python
#: code:addons/contract/models/contract_line.py:0
#, python-format
msgid "April"
msgstr "Abril"
#. module: contract #. module: contract
#: model_terms:ir.ui.view,arch_db:contract.contract_contract_form_view #: model_terms:ir.ui.view,arch_db:contract.contract_contract_form_view
#: model_terms:ir.ui.view,arch_db:contract.contract_contract_search_view #: model_terms:ir.ui.view,arch_db:contract.contract_contract_search_view
@@ -476,6 +506,13 @@ msgstr "Socio asociado"
msgid "Attachment Count" msgid "Attachment Count"
msgstr "Nº de archivos adjuntos" msgstr "Nº de archivos adjuntos"
#. module: contract
#. odoo-python
#: code:addons/contract/models/contract_line.py:0
#, python-format
msgid "August"
msgstr "Agosto"
#. module: contract #. module: contract
#: model:ir.model.fields,field_description:contract.field_contract_abstract_contract_line__is_auto_renew #: model:ir.model.fields,field_description:contract.field_contract_abstract_contract_line__is_auto_renew
#: model:ir.model.fields,field_description:contract.field_contract_line__is_auto_renew #: model:ir.model.fields,field_description:contract.field_contract_line__is_auto_renew
@@ -1092,6 +1129,13 @@ msgstr "Fecha de siguiente factura"
msgid "Day(s)" msgid "Day(s)"
msgstr "Día(s)" msgstr "Día(s)"
#. module: contract
#. odoo-python
#: code:addons/contract/models/contract_line.py:0
#, python-format
msgid "December"
msgstr "Diciembre"
#. module: contract #. module: contract
#: model:ir.model.fields,help:contract.field_contract_abstract_contract_line__note_invoicing_mode #: model:ir.model.fields,help:contract.field_contract_abstract_contract_line__note_invoicing_mode
#: model:ir.model.fields,help:contract.field_contract_line__note_invoicing_mode #: model:ir.model.fields,help:contract.field_contract_line__note_invoicing_mode
@@ -1182,6 +1226,13 @@ msgstr ""
"Fallo al procesar el contrato %(name)s [id: %(id)s]:\n" "Fallo al procesar el contrato %(name)s [id: %(id)s]:\n"
"%(ue)s" "%(ue)s"
#. module: contract
#. odoo-python
#: code:addons/contract/models/contract_line.py:0
#, python-format
msgid "February"
msgstr "Febrero"
#. module: contract #. module: contract
#: model_terms:ir.ui.view,arch_db:contract.contract_contract_search_view #: model_terms:ir.ui.view,arch_db:contract.contract_contract_search_view
msgid "Finished" msgid "Finished"
@@ -1418,6 +1469,13 @@ msgstr "Es nota recurrente"
msgid "Is suspension without end date" msgid "Is suspension without end date"
msgstr "Es suspensión sin fecha de finalización" msgstr "Es suspensión sin fecha de finalización"
#. module: contract
#. odoo-python
#: code:addons/contract/models/contract_line.py:0
#, python-format
msgid "January"
msgstr "Enero"
#. module: contract #. module: contract
#: model:ir.model.fields,field_description:contract.field_contract_abstract_contract__journal_id #: model:ir.model.fields,field_description:contract.field_contract_abstract_contract__journal_id
#: model:ir.model.fields,field_description:contract.field_contract_contract__journal_id #: model:ir.model.fields,field_description:contract.field_contract_contract__journal_id
@@ -1436,6 +1494,20 @@ msgstr "Entrada diaria"
msgid "Journal Item" msgid "Journal Item"
msgstr "Apunte contable" msgstr "Apunte contable"
#. module: contract
#. odoo-python
#: code:addons/contract/models/contract_line.py:0
#, python-format
msgid "July"
msgstr "Julio"
#. module: contract
#. odoo-python
#: code:addons/contract/models/contract_line.py:0
#, python-format
msgid "June"
msgstr "Junio"
#. module: contract #. module: contract
#: model:ir.model.fields,field_description:contract.field_contract_abstract_contract_line__last_date_invoiced #: model:ir.model.fields,field_description:contract.field_contract_abstract_contract_line__last_date_invoiced
#: model:ir.model.fields,field_description:contract.field_contract_contract__last_date_invoiced #: model:ir.model.fields,field_description:contract.field_contract_contract__last_date_invoiced
@@ -1522,6 +1594,13 @@ msgstr "Facturar manualmente contratos de compra"
msgid "Manually Invoice Sale Contracts" msgid "Manually Invoice Sale Contracts"
msgstr "Facturar manualmente contratos de venta" msgstr "Facturar manualmente contratos de venta"
#. module: contract
#. odoo-python
#: code:addons/contract/models/contract_line.py:0
#, python-format
msgid "March"
msgstr "Marzo"
#. module: contract #. module: contract
#: model:ir.model.fields,help:contract.field_contract_abstract_contract__line_recurrence #: model:ir.model.fields,help:contract.field_contract_abstract_contract__line_recurrence
#: model:ir.model.fields,help:contract.field_contract_contract__line_recurrence #: model:ir.model.fields,help:contract.field_contract_contract__line_recurrence
@@ -1533,6 +1612,13 @@ msgstr ""
"Marque esta casilla si desea controlar la recurrencia a nivel de línea en " "Marque esta casilla si desea controlar la recurrencia a nivel de línea en "
"lugar de todos juntos para todo el contrato." "lugar de todos juntos para todo el contrato."
#. module: contract
#. odoo-python
#: code:addons/contract/models/contract_line.py:0
#, python-format
msgid "May"
msgstr "Mayo"
#. module: contract #. module: contract
#: model:ir.model.fields,field_description:contract.field_contract_contract__message_has_error #: model:ir.model.fields,field_description:contract.field_contract_contract__message_has_error
msgid "Message Delivery error" msgid "Message Delivery error"
@@ -1656,6 +1742,13 @@ msgstr "Modo de facturación de la nota"
msgid "Notes" msgid "Notes"
msgstr "Notas" msgstr "Notas"
#. module: contract
#. odoo-python
#: code:addons/contract/models/contract_line.py:0
#, python-format
msgid "November"
msgstr "Noviembre"
#. module: contract #. module: contract
#: model:ir.model.fields,field_description:contract.field_contract_contract__message_needaction_counter #: model:ir.model.fields,field_description:contract.field_contract_contract__message_needaction_counter
msgid "Number of Actions" msgid "Number of Actions"
@@ -1692,6 +1785,13 @@ msgstr "Número de mensajes que requieren una acción"
msgid "Number of messages with delivery error" msgid "Number of messages with delivery error"
msgstr "Número de mensajes con error de entrega" msgstr "Número de mensajes con error de entrega"
#. module: contract
#. odoo-python
#: code:addons/contract/models/contract_line.py:0
#, python-format
msgid "October"
msgstr "Octubre"
#. module: contract #. module: contract
#: model:ir.model.fields,field_description:contract.field_account_bank_statement_line__old_contract_id #: model:ir.model.fields,field_description:contract.field_account_bank_statement_line__old_contract_id
#: model:ir.model.fields,field_description:contract.field_account_move__old_contract_id #: model:ir.model.fields,field_description:contract.field_account_move__old_contract_id
@@ -1964,6 +2064,13 @@ msgstr "Enviar por correo electrónico"
msgid "Sent" msgid "Sent"
msgstr "Enviado" msgstr "Enviado"
#. module: contract
#. odoo-python
#: code:addons/contract/models/contract_line.py:0
#, python-format
msgid "September"
msgstr "Septiembre"
#. module: contract #. module: contract
#: model:ir.model.fields,field_description:contract.field_contract_abstract_contract_line__sequence #: model:ir.model.fields,field_description:contract.field_contract_abstract_contract_line__sequence
#: model:ir.model.fields,field_description:contract.field_contract_line__sequence #: model:ir.model.fields,field_description:contract.field_contract_line__sequence
@@ -2433,455 +2540,3 @@ msgid ""
msgstr "" msgstr ""
"{{ object.company_id.name }} Contrato (Ref {{ object.name or 'n/a' }}) - " "{{ object.company_id.name }} Contrato (Ref {{ object.name or 'n/a' }}) - "
"Modificaciones" "Modificaciones"
#~ msgid "Analytic account"
#~ msgstr "Cuenta analítica"
#~ msgid "SMS Delivery error"
#~ msgstr "Error de entrega de SMS"
#~ msgid "Number of messages which requires an action"
#~ msgstr "Número de mensajes que requieren una acción"
#~ msgid ""
#~ "<div style=\"font-family: 'Lucida Grande', Ubuntu, Arial, Verdana, sans-"
#~ "serif; font-size: 12px; color: rgb(34, 34, 34); background-color: #FFF; "
#~ "\">\n"
#~ " <p>Hello <t t-out=\"object.partner_id.name or '' \"/>,</"
#~ "p>\n"
#~ " <p>A new contract has been created: </p>\n"
#~ "\n"
#~ " <p style=\"border-left: 1px solid #8e0000; margin-left: "
#~ "30px;\">\n"
#~ " &amp;nbsp;&amp;nbsp;<strong>REFERENCES</strong><br/>\n"
#~ " &amp;nbsp;&amp;nbsp;Contract: <strong t-out=\"object."
#~ "name\"/><br/>\n"
#~ " <t t-if=\"object.date_start\">\n"
#~ " &amp;nbsp;&amp;nbsp;Contract Date Start: <t t-out="
#~ "\"object.date_start or ''\"/><br/>\n"
#~ " </t>\n"
#~ "\n"
#~ " <t t-if=\"object.user_id\">\n"
#~ " <t t-if=\"object.user_id.email\">\n"
#~ " &amp;nbsp;&amp;nbsp;Your Contact: <a t-att-"
#~ "href=\"'mailto:%s?subject=Contract %s' % (object.user_id.email, object."
#~ "name)\" t-out=\"object.user_id.name\"/>\n"
#~ " </t>\n"
#~ " <t t-else=\"\">\n"
#~ " &amp;nbsp;&amp;nbsp;Your Contact: <t t-out="
#~ "\"object.user_id.name\"/>\n"
#~ " </t>\n"
#~ " </t>\n"
#~ " </p>\n"
#~ "\n"
#~ " <br/>\n"
#~ " <p>If you have any questions, do not hesitate to contact "
#~ "us.</p>\n"
#~ " <p>Thank you for choosing <t t-out=\"object.company_id."
#~ "name or 'us'\"/>!</p>\n"
#~ " <br/>\n"
#~ " <br/>\n"
#~ " <div style=\"width: 375px; margin: 0px; padding: 0px; "
#~ "background-color: #8E0000; border-top-left-radius: 5px 5px; border-top-"
#~ "right-radius: 5px 5px; background-repeat: repeat no-repeat;\">\n"
#~ " <h3 style=\"margin: 0px; padding: 2px 14px; font-"
#~ "size: 12px; color: #DDD;\">\n"
#~ " <strong style=\"text-transform:uppercase;\" t-out="
#~ "\"object.company_id.name\"/></h3>\n"
#~ " </div>\n"
#~ " <div style=\"width: 347px; margin: 0px; padding: 5px "
#~ "14px; line-height: 16px; background-color: #F2F2F2;\">\n"
#~ " <span style=\"color: #222; margin-bottom: 5px; "
#~ "display: block; \">\n"
#~ " <address t-field=\"object.company_id.sudo()."
#~ "partner_id\" t-options=\"{&quot;widget&quot;: &quot;contact&quot;, &quot;"
#~ "fields&quot;: [&quot;name&quot;, &quot;address&quot;], &quot;"
#~ "no_marker&quot;: True}\"/>\n"
#~ " </span>\n"
#~ " <t t-if=\"object.company_id.phone\">\n"
#~ " <div style=\"margin-top: 0px; margin-right: 0px; "
#~ "margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: "
#~ "0px; padding-bottom: 0px; padding-left: 0px; \">\n"
#~ " Phone: <t t-out=\"object.company_id.phone\"/"
#~ ">\n"
#~ " </div>\n"
#~ " </t>\n"
#~ " <t t-if=\"object.company_id.website\">\n"
#~ " <div>\n"
#~ " Web: <a t-att-href=\"object.company_id.website"
#~ "\" t-out=\"object.company_id.website\"/>\n"
#~ " </div>\n"
#~ " </t>\n"
#~ " </div>\n"
#~ " <br/>\n"
#~ " <a t-att-href=\"'%s/my/contracts/%s?access_token=%s' % "
#~ "(object.get_base_url(), object.id, object.access_token)\" target=\"_blank"
#~ "\" style=\"background-color:#875A7B;padding: 8px 16px 8px 16px; text-"
#~ "decoration: none; color: #fff; border-radius: 5px; font-size:13px;\">View "
#~ "contract</a>\n"
#~ " </div>\n"
#~ " "
#~ msgstr ""
#~ "<div style=\"font-family: 'Lucida Grande', Ubuntu, Arial, Verdana, sans-"
#~ "serif; font-size: 12px; color: rgb(34, 34, 34); background-color: #FFF; "
#~ "\">\n"
#~ " <p>Hello <t t-out=\"object.partner_id.name or '' \"/>,</"
#~ "p>\n"
#~ " <p>Se ha creado un nuevo contrato: </p>\n"
#~ "\n"
#~ " <p style=\"border-left: 1px solid #8e0000; margin-left: "
#~ "30px;\">\n"
#~ " &amp;nbsp;&amp;nbsp;<strong>REFERENCES</strong><br/>\n"
#~ " &amp;nbsp;&amp;nbsp;Contract: <strong t-out=\"object."
#~ "name\"/><br/>\n"
#~ " <t t-if=\"object.date_start\">\n"
#~ " &amp;nbsp;&amp;nbsp;Fecha de inicio del contrato: "
#~ "<t t-out=\"object.date_start or ''\"/><br/>\n"
#~ " </t>\n"
#~ "\n"
#~ " <t t-if=\"object.user_id\">\n"
#~ " <t t-if=\"object.user_id.email\">\n"
#~ " &amp;nbsp;&amp;nbsp;Su contacto: <a t-att-"
#~ "href=\"'mailto:%s?subject=Contrato %s' % (object.user_id.email, object."
#~ "name)\" t-out=\"object.user_id.name\"/>\n"
#~ " </t>\n"
#~ " <t t-else=\"\">\n"
#~ " &amp;nbsp;&amp;nbsp;Su contacto: <t t-out="
#~ "\"object.user_id.name\"/>\n"
#~ " </t>\n"
#~ " </t>\n"
#~ " </p>\n"
#~ "\n"
#~ " <br/>\n"
#~ " <p>No dude en ponerse en contacto con nosotros para "
#~ "cualquier aclaración.</p>\n"
#~ " <p>Gracias por escoger <t t-out=\"object.company_id.name "
#~ "or 'us'\"/>!</p>\n"
#~ " <br/>\n"
#~ " <br/>\n"
#~ " <div style=\"width: 375px; margin: 0px; padding: 0px; "
#~ "background-color: #8E0000; border-top-left-radius: 5px 5px; border-top-"
#~ "right-radius: 5px 5px; background-repeat: repeat no-repeat;\">\n"
#~ " <h3 style=\"margin: 0px; padding: 2px 14px; font-"
#~ "size: 12px; color: #DDD;\">\n"
#~ " <strong style=\"text-transform:uppercase;\" t-out="
#~ "\"object.company_id.name\"/></h3>\n"
#~ " </div>\n"
#~ " <div style=\"width: 347px; margin: 0px; padding: 5px "
#~ "14px; line-height: 16px; background-color: #F2F2F2;\">\n"
#~ " <span style=\"color: #222; margin-bottom: 5px; "
#~ "display: block; \">\n"
#~ " <address t-field=\"object.company_id.sudo()."
#~ "partner_id\" t-options=\"{&quot;widget&quot;: &quot;contact&quot;, &quot;"
#~ "fields&quot;: [&quot;name&quot;, &quot;address&quot;], &quot;"
#~ "no_marker&quot;: True}\"/>\n"
#~ " </span>\n"
#~ " <t t-if=\"object.company_id.phone\">\n"
#~ " <div style=\"margin-top: 0px; margin-right: 0px; "
#~ "margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: "
#~ "0px; padding-bottom: 0px; padding-left: 0px; \">\n"
#~ " Phone: <t t-out=\"object.company_id.phone\"/"
#~ ">\n"
#~ " </div>\n"
#~ " </t>\n"
#~ " <t t-if=\"object.company_id.website\">\n"
#~ " <div>\n"
#~ " Web: <a t-att-href=\"object.company_id.website"
#~ "\" t-out=\"object.company_id.website\"/>\n"
#~ " </div>\n"
#~ " </t>\n"
#~ " </div>\n"
#~ " <br/>\n"
#~ " <a t-att-href=\"'%s/my/contracts/%s?access_token=%s' % "
#~ "(object.get_base_url(), object.id, object.access_token)\" target=\"_blank"
#~ "\" style=\"background-color:#875A7B;padding: 8px 16px 8px 16px; text-"
#~ "decoration: none; color: #fff; border-radius: 5px; font-size:13px;\">View "
#~ "contract</a>\n"
#~ " </div>\n"
#~ " "
#~ msgid "Analytic Tags"
#~ msgstr "Etiquetas Analíticas"
#~ msgid "Number of unread messages"
#~ msgstr "Número de mensajes no leídos"
#~ msgid "Unread Messages"
#~ msgstr "Mensajes no leídos"
#~ msgid "Unread Messages Counter"
#~ msgstr "Número de mensajes no leídos"
#~ msgid ""
#~ "\n"
#~ " <p>Hello</p>\n"
#~ " <p>We have modifications on the contract that we want to "
#~ "notify you.</p>\n"
#~ " "
#~ msgstr ""
#~ "\n"
#~ " <p>Hola</p>\n"
#~ " <p>Tenemos modificaciones en el contrato que queremos "
#~ "notificarle.</p>\n"
#~ " "
#~ msgid ""
#~ "\n"
#~ "<div style=\"font-family: 'Lucida Grande', Ubuntu, Arial, Verdana, sans-"
#~ "serif; font-size: 12px; color: rgb(34, 34, 34); background-color: #FFF; "
#~ "\">\n"
#~ " <p>Hello ${object.partner_id.name or ''},</p>\n"
#~ " <p>A new contract has been created: </p>\n"
#~ "\n"
#~ " <p style=\"border-left: 1px solid #8e0000; margin-left: 30px;\">\n"
#~ " &nbsp;&nbsp;<strong>REFERENCES</strong><br />\n"
#~ " &nbsp;&nbsp;Contract: <strong>${object.name}</strong><br />\n"
#~ " % if object.date_start:\n"
#~ " &nbsp;&nbsp;Contract Date Start: ${object.date_start or ''}<br />\n"
#~ " % endif\n"
#~ "\n"
#~ " % if object.user_id:\n"
#~ " % if object.user_id.email:\n"
#~ " &nbsp;&nbsp;Your Contact: <a href=\"mailto:${object.user_id.email "
#~ "or ''}?subject=Contract%20${object.name}\">${object.user_id.name}</a>\n"
#~ " % else:\n"
#~ " &nbsp;&nbsp;Your Contact: ${object.user_id.name}\n"
#~ " % endif\n"
#~ " % endif\n"
#~ " </p>\n"
#~ "\n"
#~ " <br/>\n"
#~ " <p>If you have any questions, do not hesitate to contact us.</p>\n"
#~ " <p>Thank you for choosing ${object.company_id.name or 'us'}!</p>\n"
#~ " <br/>\n"
#~ " <br/>\n"
#~ " <div style=\"width: 375px; margin: 0px; padding: 0px; background-"
#~ "color: #8E0000; border-top-left-radius: 5px 5px; border-top-right-radius: "
#~ "5px 5px; background-repeat: repeat no-repeat;\">\n"
#~ " <h3 style=\"margin: 0px; padding: 2px 14px; font-size: 12px; "
#~ "color: #DDD;\">\n"
#~ " <strong style=\"text-transform:uppercase;\">${object."
#~ "company_id.name}</strong></h3>\n"
#~ " </div>\n"
#~ " <div style=\"width: 347px; margin: 0px; padding: 5px 14px; line-"
#~ "height: 16px; background-color: #F2F2F2;\">\n"
#~ " <span style=\"color: #222; margin-bottom: 5px; display: block; "
#~ "\">\n"
#~ " ${object.company_id.partner_id.sudo()."
#~ "with_context(show_address=True, html_format=True).name_get()[0][1] | "
#~ "safe}\n"
#~ " </span>\n"
#~ " % if object.company_id.phone:\n"
#~ " <div style=\"margin-top: 0px; margin-right: 0px; margin-"
#~ "bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; "
#~ "padding-bottom: 0px; padding-left: 0px; \">\n"
#~ " Phone: ${object.company_id.phone}\n"
#~ " </div>\n"
#~ " % endif\n"
#~ " % if object.company_id.website:\n"
#~ " <div>\n"
#~ " Web: <a href=\"${object.company_id.website}\">${object."
#~ "company_id.website}</a>\n"
#~ " </div>\n"
#~ " %endif\n"
#~ " <p></p>\n"
#~ " </div>\n"
#~ " <p></p>\n"
#~ " <a href=\"${object.get_base_url()}/my/contracts/${object.id}?"
#~ "access_token=${object.access_token}\" target=\"_blank\" style="
#~ "\"background-color:#875A7B;padding: 8px 16px 8px 16px; text-decoration: "
#~ "none; color: #fff; border-radius: 5px; font-size:13px;\">View contract</"
#~ "a>\n"
#~ "</div>\n"
#~ " "
#~ msgstr ""
#~ "\n"
#~ "<div style=\"font-family: 'Lucida Grande', Ubuntu, Arial, Verdana, sans-"
#~ "serif; font-size: 12px; color: rgb(34, 34, 34); background-color: #FFF; "
#~ "\">\n"
#~ " <p>Hola ${object.partner_id.name or ''},</p>\n"
#~ " <p>Se ha creado un nuevo contrato: </p>\n"
#~ "\n"
#~ " <p style=\"border-left: 1px solid #8e0000; margin-left: 30px;\">\n"
#~ " &nbsp;&nbsp;<strong>REFERENCIAS</strong><br />\n"
#~ " &nbsp;&nbsp;Contrato: <strong>${object.name}</strong><br />\n"
#~ " % if object.date_start:\n"
#~ " &nbsp;&nbsp;Fecha inicio contrato: ${object.date_start or ''}<br /"
#~ ">\n"
#~ " % endif\n"
#~ "\n"
#~ " % if object.user_id:\n"
#~ " % if object.user_id.email:\n"
#~ " &nbsp;&nbsp;Su contacto: <a href=\"mailto:${object.user_id.email "
#~ "or ''}?subject=Contract%20${object.name}\">${object.user_id.name}</a>\n"
#~ " % else:\n"
#~ " &nbsp;&nbsp;Su contacto: ${object.user_id.name}\n"
#~ " % endif\n"
#~ " % endif\n"
#~ " </p>\n"
#~ "\n"
#~ " <br/>\n"
#~ " <p>Si tiene alguna pregunta, no dude en contactarnos.</p>\n"
#~ " <p>Gracias por elegir a ${object.company_id.name or 'nosotros'}!</p>\n"
#~ " <br/>\n"
#~ " <br/>\n"
#~ " <div style=\"width: 375px; margin: 0px; padding: 0px; background-"
#~ "color: #8E0000; border-top-left-radius: 5px 5px; border-top-right-radius: "
#~ "5px 5px; background-repeat: repeat no-repeat;\">\n"
#~ " <h3 style=\"margin: 0px; padding: 2px 14px; font-size: 12px; "
#~ "color: #DDD;\">\n"
#~ " <strong style=\"text-transform:uppercase;\">${object."
#~ "company_id.name}</strong></h3>\n"
#~ " </div>\n"
#~ " <div style=\"width: 347px; margin: 0px; padding: 5px 14px; line-"
#~ "height: 16px; background-color: #F2F2F2;\">\n"
#~ " <span style=\"color: #222; margin-bottom: 5px; display: block; "
#~ "\">\n"
#~ " ${object.company_id.partner_id.sudo()."
#~ "with_context(show_address=True, html_format=True).name_get()[0][1] | "
#~ "safe}\n"
#~ " </span>\n"
#~ " % if object.company_id.phone:\n"
#~ " <div style=\"margin-top: 0px; margin-right: 0px; margin-"
#~ "bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; "
#~ "padding-bottom: 0px; padding-left: 0px; \">\n"
#~ " Teléfono: ${object.company_id.phone}\n"
#~ " </div>\n"
#~ " % endif\n"
#~ " % if object.company_id.website:\n"
#~ " <div>\n"
#~ " Web: <a href=\"${object.company_id.website}\">${object."
#~ "company_id.website}</a>\n"
#~ " </div>\n"
#~ " %endif\n"
#~ " <p></p>\n"
#~ " </div>\n"
#~ " <p></p>\n"
#~ " <a href=\"${object.get_base_url()}/my/contracts/${object.id}?"
#~ "access_token=${object.access_token}\" target=\"_blank\" style="
#~ "\"background-color:#875A7B;padding: 8px 16px 8px 16px; text-decoration: "
#~ "none; color: #fff; border-radius: 5px; font-size:13px;\">Ver contrato</"
#~ "a>\n"
#~ "</div>\n"
#~ " "
#~ msgid "${object.company_id.name} Contract (Ref ${object.name or 'n/a'})"
#~ msgstr "${object.company_id.name} Contrato (Ref ${object.name or 'n/a'})"
#~ msgid ""
#~ "${object.company_id.name} Contract (Ref ${object.name or 'n/a'}) - "
#~ "Modifications"
#~ msgstr ""
#~ "${object.company_id.name} Contrato (Ref ${object.name or 'n/a'}) - "
#~ "Modificaciones"
#~ msgid "Contract line Un-canceled: %s<br/>- "
#~ msgstr "Línea de contrato no cancelada: %s<br/>- "
#~ msgid "Contract line canceled: %s<br/>- "
#~ msgstr "Línea de contrato cancelada: %s<br/>- "
#~ msgid ""
#~ "Contract line for <strong>{product}</strong>\n"
#~ " stopped: <br/>\n"
#~ " - <strong>End</strong>: {old_end} -- "
#~ "{new_end}\n"
#~ " "
#~ msgstr ""
#~ "Línea de contrato para <strong>{product}</strong>\n"
#~ " detenida: <br/>\n"
#~ " - <strong>Fin</strong>: {old_end} -- "
#~ "{new_end}\n"
#~ " "
#~ msgid ""
#~ "Contract line for <strong>{product}</strong>\n"
#~ " planned a successor: <br/>\n"
#~ " - <strong>Start</strong>: {new_date_start}\n"
#~ " <br/>\n"
#~ " - <strong>End</strong>: {new_date_end}\n"
#~ " "
#~ msgstr ""
#~ "Línea de contrato para <strong>{product}</strong>\n"
#~ " planeó un sucesor: <br/>\n"
#~ " - <strong>Inicio</strong>: {new_date_start}\n"
#~ " <br/>\n"
#~ " - <strong>Fin</strong>: {new_date_end}\n"
#~ " "
#~ msgid ""
#~ "Contract line for <strong>{product}</strong>\n"
#~ " renewed: <br/>\n"
#~ " - <strong>Start</strong>: {new_date_start}\n"
#~ " <br/>\n"
#~ " - <strong>End</strong>: {new_date_end}\n"
#~ " "
#~ msgstr ""
#~ "Línea de contrato para <strong>{product}</strong>\n"
#~ " renovado: <br/>\n"
#~ " - <strong>Inicio</strong>: {new_date_start}\n"
#~ " <br/>\n"
#~ " - <strong>Fin</strong>: {new_date_end}\n"
#~ " "
#~ msgid ""
#~ "Contract line for <strong>{product}</strong>\n"
#~ " suspended: <br/>\n"
#~ " - <strong>Suspension Start</strong>: {new_date_start}\n"
#~ " <br/>\n"
#~ " - <strong>Suspension End</strong>: {new_date_end}\n"
#~ " "
#~ msgstr ""
#~ "Línea de contrato para <strong>{product}</strong>\n"
#~ " suspendida: <br/>\n"
#~ " - <strong>Inicio Suspensión</strong>: {new_date_start}\n"
#~ " <br/>\n"
#~ " - <strong>Fin Suspensión</strong>: {new_date_end}\n"
#~ " "
#~ msgid ""
#~ "Contract manually invoiced: <a href=\"#\" data-oe-model=\"%s\" data-oe-id="
#~ "\"%s\">Invoice</a>"
#~ msgstr ""
#~ "Contratos facturados manualmente: <a href=\"#\" data-oe-model=\"%s\" data-"
#~ "oe-id=\"%s\">Factura</a>"
#~ msgid "Followers (Channels)"
#~ msgstr "Seguimiento (Canales)"
#~ msgid "Manual renew needed"
#~ msgstr "Renovación manual necesaria"
#~ msgid "Please define a %s journal for the company '%s'."
#~ msgstr "Por favor defina un diario de %s para la compañía '%s'."
#~ msgid "Termination notice date"
#~ msgstr "Fecha de aviso de terminación"
#~ msgid ""
#~ "<span attrs=\"{'invisible': [('contract_to_invoice_count', '&gt;', "
#~ "1)]}\">\n"
#~ " contract to invoice\n"
#~ " </span>\n"
#~ " <span attrs=\"{'invisible': "
#~ "[('contract_to_invoice_count', '&lt;', 1)]}\">\n"
#~ " contracts to invoice\n"
#~ " </span>"
#~ msgstr ""
#~ "<span attrs=\"{'invisible': [('contract_to_invoice_count', '&gt;', "
#~ "1)]}\">\n"
#~ " contrato a facturar\n"
#~ " </span>\n"
#~ " <span attrs=\"{'invisible': "
#~ "[('contract_to_invoice_count', '&lt;', 1)]}\">\n"
#~ " contracts to invoice\n"
#~ " </span>"
#~ msgid "Journal Entries"
#~ msgstr "Asientos contables"
#~ msgid "Last date invoice"
#~ msgstr "Última fecha de factura"
#~ msgid "Contract Order -"
#~ msgstr "Pedido de contrato -"

View File

@@ -596,6 +596,23 @@ class ContractLine(models.Model):
) )
return first_date_invoiced, last_date_invoiced, recurring_next_date return first_date_invoiced, last_date_invoiced, recurring_next_date
def _translate_marker_month_name(self, month_name):
months = {
"January": _("January"),
"February": _("February"),
"March": _("March"),
"April": _("April"),
"May": _("May"),
"June": _("June"),
"July": _("July"),
"August": _("August"),
"September": _("September"),
"October": _("October"),
"November": _("November"),
"December": _("December"),
}
return months[month_name]
def _insert_markers(self, first_date_invoiced, last_date_invoiced): def _insert_markers(self, first_date_invoiced, last_date_invoiced):
self.ensure_one() self.ensure_one()
lang_obj = self.env["res.lang"] lang_obj = self.env["res.lang"]
@@ -604,6 +621,12 @@ class ContractLine(models.Model):
name = self.name name = self.name
name = name.replace("#START#", first_date_invoiced.strftime(date_format)) name = name.replace("#START#", first_date_invoiced.strftime(date_format))
name = name.replace("#END#", last_date_invoiced.strftime(date_format)) name = name.replace("#END#", last_date_invoiced.strftime(date_format))
name = name.replace(
"#INVOICEMONTHNAME#",
self.with_context(lang=lang.code)._translate_marker_month_name(
first_date_invoiced.strftime("%B")
),
)
return name return name
def _update_recurring_next_date(self): def _update_recurring_next_date(self):

View File

@@ -10,8 +10,8 @@
* the recurrence parameters: interval (days, weeks, months, months last day or years), * the recurrence parameters: interval (days, weeks, months, months last day or years),
start date, date of next invoice (automatically computed, can be modified) and end date (optional) start date, date of next invoice (automatically computed, can be modified) and end date (optional)
* auto-price, for having a price automatically obtained from the price list * auto-price, for having a price automatically obtained from the price list
* #START# or #END# in the description field to display the start/end date of * #START# - #END# or #INVOICEMONTHNAME# in the description field to display
the invoiced period in the invoice line description the start/end date or the start month of the invoiced period in the invoice line description
* pre-paid (invoice at period start) or post-paid (invoice at start of next period) * pre-paid (invoice at period start) or post-paid (invoice at start of next period)
#. The "Generate Recurring Invoices from Contracts" cron runs daily to generate the invoices. #. The "Generate Recurring Invoices from Contracts" cron runs daily to generate the invoices.

View File

@@ -8,11 +8,10 @@
/* /*
:Author: David Goodger (goodger@python.org) :Author: David Goodger (goodger@python.org)
:Id: $Id: html4css1.css 9511 2024-01-13 09:50:07Z milde $ :Id: $Id: html4css1.css 8954 2022-01-20 10:10:25Z milde $
:Copyright: This stylesheet has been placed in the public domain. :Copyright: This stylesheet has been placed in the public domain.
Default cascading style sheet for the HTML output of Docutils. Default cascading style sheet for the HTML output of Docutils.
Despite the name, some widely supported CSS2 features are used.
See https://docutils.sourceforge.io/docs/howto/html-stylesheets.html for how to See https://docutils.sourceforge.io/docs/howto/html-stylesheets.html for how to
customize this style sheet. customize this style sheet.
@@ -275,7 +274,7 @@ pre.literal-block, pre.doctest-block, pre.math, pre.code {
margin-left: 2em ; margin-left: 2em ;
margin-right: 2em } margin-right: 2em }
pre.code .ln { color: gray; } /* line numbers */ pre.code .ln { color: grey; } /* line numbers */
pre.code, code { background-color: #eeeeee } pre.code, code { background-color: #eeeeee }
pre.code .comment, code .comment { color: #5C6576 } pre.code .comment, code .comment { color: #5C6576 }
pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold } pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold }
@@ -301,7 +300,7 @@ span.option {
span.pre { span.pre {
white-space: pre } white-space: pre }
span.problematic, pre.problematic { span.problematic {
color: red } color: red }
span.section-subtitle { span.section-subtitle {
@@ -409,8 +408,8 @@ user access rights.</p>
<li>the recurrence parameters: interval (days, weeks, months, months last day or years), <li>the recurrence parameters: interval (days, weeks, months, months last day or years),
start date, date of next invoice (automatically computed, can be modified) and end date (optional)</li> start date, date of next invoice (automatically computed, can be modified) and end date (optional)</li>
<li>auto-price, for having a price automatically obtained from the price list</li> <li>auto-price, for having a price automatically obtained from the price list</li>
<li>#START# or #END# in the description field to display the start/end date of <li>#START# - #END# or #INVOICEMONTHNAME# in the description field to display
the invoiced period in the invoice line description</li> the start/end date or the start month of the invoiced period in the invoice line description</li>
<li>pre-paid (invoice at period start) or post-paid (invoice at start of next period)</li> <li>pre-paid (invoice at period start) or post-paid (invoice at start of next period)</li>
</ul> </ul>
</li> </li>
@@ -497,9 +496,7 @@ If you spotted it first, help us to smash it by providing a detailed and welcome
<div class="section" id="maintainers"> <div class="section" id="maintainers">
<h2><a class="toc-backref" href="#toc-entry-8">Maintainers</a></h2> <h2><a class="toc-backref" href="#toc-entry-8">Maintainers</a></h2>
<p>This module is maintained by the OCA.</p> <p>This module is maintained by the OCA.</p>
<a class="reference external image-reference" href="https://odoo-community.org"> <a class="reference external image-reference" href="https://odoo-community.org"><img alt="Odoo Community Association" src="https://odoo-community.org/logo.png" /></a>
<img alt="Odoo Community Association" src="https://odoo-community.org/logo.png" />
</a>
<p>OCA, or the Odoo Community Association, is a nonprofit organization whose <p>OCA, or the Odoo Community Association, is a nonprofit organization whose
mission is to support the collaborative development of Odoo features and mission is to support the collaborative development of Odoo features and
promote its widespread use.</p> promote its widespread use.</p>

View File

@@ -8,6 +8,7 @@ from collections import namedtuple
from datetime import timedelta from datetime import timedelta
from dateutil.relativedelta import relativedelta from dateutil.relativedelta import relativedelta
from freezegun import freeze_time
from odoo import fields from odoo import fields
from odoo.exceptions import UserError, ValidationError from odoo.exceptions import UserError, ValidationError
@@ -141,7 +142,7 @@ class TestContractBase(common.TransactionCase):
0, 0,
{ {
"product_id": False, "product_id": False,
"name": "Header for Services", "name": "Header for #INVOICEMONTHNAME# Services",
"display_type": "line_section", "display_type": "line_section",
}, },
), ),
@@ -2395,3 +2396,11 @@ class TestContract(TestContractBase):
action = self.contract.action_preview() action = self.contract.action_preview()
self.assertIn("/my/contracts/", action["url"]) self.assertIn("/my/contracts/", action["url"])
self.assertIn("access_token=", action["url"]) self.assertIn("access_token=", action["url"])
@freeze_time("2023-05-01")
def test_check_month_name_marker(self):
"""Set fixed date to check test correctly."""
self.contract3.contract_line_ids.date_start = fields.Date.today()
self.contract3.contract_line_ids.recurring_next_date = fields.Date.today()
invoice_id = self.contract3.recurring_create_invoice()
self.assertEqual(invoice_id.invoice_line_ids[0].name, "Header for May Services")

View File

@@ -452,6 +452,13 @@
the the
invoiced period invoiced period
</p> </p>
<p colspan="2">
<strong>#INVOICEMONTHNAME#</strong>
: Invoice month name
of
the
invoiced period
</p>
</group> </group>
</page> </page>
</notebook> </notebook>

View File

@@ -74,6 +74,8 @@
<p> <strong <p> <strong
>#START#</strong>: Start date of the invoiced period</p> >#START#</strong>: Start date of the invoiced period</p>
<p> <strong>#END#</strong>: End date of the invoiced period</p> <p> <strong>#END#</strong>: End date of the invoiced period</p>
<p> <strong
>#INVOICEMONTHNAME#</strong>: Invoice month name of the invoiced period</p>
</div> </div>
</group> </group>
</form> </form>