diff --git a/NEWS.rst b/NEWS.rst index efe989234664650a92eb957b135088821213267e_TkVXUy5yc3Q=..44c22574708d0fd9a5189f02a3f5d595d558b2db_TkVXUy5yc3Q= 100644 --- a/NEWS.rst +++ b/NEWS.rst @@ -2,6 +2,11 @@ Changelog ========= +16.0.1.3.0 +---------- + +Update change set ab0e2f73d041: Add invoice template as standard + 16.0.1.2.3 ---------- diff --git a/__manifest__.py b/__manifest__.py index efe989234664650a92eb957b135088821213267e_X19tYW5pZmVzdF9fLnB5..44c22574708d0fd9a5189f02a3f5d595d558b2db_X19tYW5pZmVzdF9fLnB5 100644 --- a/__manifest__.py +++ b/__manifest__.py @@ -21,7 +21,7 @@ { "name": "Redner", "license": "AGPL-3", - "version": "16.0.1.2.3", + "version": "16.0.1.3.0", "category": "Reporting", "author": "XCG Consulting", "website": "https://orbeet.io/", diff --git a/data/ir_actions_report_demo.xml b/data/ir_actions_report_demo.xml new file mode 100644 index 0000000000000000000000000000000000000000..44c22574708d0fd9a5189f02a3f5d595d558b2db_ZGF0YS9pcl9hY3Rpb25zX3JlcG9ydF9kZW1vLnhtbA== --- /dev/null +++ b/data/ir_actions_report_demo.xml @@ -0,0 +1,76 @@ +<?xml version="1.0" encoding="utf-8" ?> +<odoo noupdate="1"> + <!-- Function for making report template --> + <function model="ir.actions.report" name="_redner_demo_invoice_having_report"> + <value + eval="[ + ref('redner.redner_avoir_substitution'), + ref('redner.redner_avoir_logo_body_substitution'), + ref('redner.redner_avoir_logo_mime_type_substitution'), + ref('redner.redner_bic_societe_substitution'), + ref('redner.redner_condition_paiement_substitution'), + ref('redner.redner_facture_substitution'), + ref('redner.redner_facture_logo_body_substitution'), + ref('redner.redner_facture_logo_mime_type_substitution'), + ref('redner.redner_iban_societe_substitution'), + ref('redner.redner_invoice_line_ids_substitution'), + ref('redner.redner_invoice_line_ids_article_substitution'), + ref('redner.redner_invoice_line_ids_prixunitaire_substitution'), + ref('redner.redner_invoice_line_ids_quantity_substitution'), + ref('redner.redner_invoice_line_ids_totalht_substitution'), + ref('redner.redner_montant_ht_substitution'), + ref('redner.redner_montant_total_substitution'), + ref('redner.redner_montant_tva_substitution'), + ref('redner.redner_nom_banque_societe_substitution'), + ref('redner.redner_invoiceduedate_substitution'), + ref('redner.redner_logo_substitution'), + ref('redner.redner_num_AVOIR_substitution'), + ref('redner.redner_transaction_date_substitution'), + ref('redner.redner_date_invoice_substitution'), + ref('redner.redner_invoiceduedate_2_substitution'), + ref('redner.redner_logo_2_substitution'), + ref('redner.redner_num_facture_substitution'), + ref('redner.redner_codepostal_societe_substitution'), + ref('redner.redner_codepostalclient_substitution'), + ref('redner.redner_courriel_societe_substitution'), + ref('redner.redner_nomclient_substitution'), + ref('redner.redner_rue1_societe_substitution'), + ref('redner.redner_rue1client_substitution'), + ref('redner.redner_rue2_societe_substitution'), + ref('redner.redner_avoir_rue2_societe_rue2_societe_substitution'), + ref('redner.redner_rue2client_substitution'), + ref('redner.redner_avoir_rue2client_rue2client_substitution'), + ref('redner.redner_siret_societe_substitution'), + ref('redner.redner_tva_societe_substitution'), + ref('redner.redner_ville_societe_substitution'), + ref('redner.redner_villeclient_substitution'), + ref('redner.redner_codepostal_societe_2_substitution'), + ref('redner.redner_codepostalclient_2_substitution'), + ref('redner.redner_courriel_societe_2_substitution'), + ref('redner.redner_nomclient_2_substitution'), + ref('redner.redner_rue1_societe_2_substitution'), + ref('redner.redner_rue1client_2_substitution'), + ref('redner.redner_rue2_societe_2_substitution'), + ref('redner.redner_facture_rue2_societe_rue2_societe_substitution'), + ref('redner.redner_rue2client_2_substitution'), + ref('redner.redner_facture_rue2client_rue2client_substitution'), + ref('redner.redner_siret_societe_2_substitution'), + ref('redner.redner_tva_societe_2_substitution'), + ref('redner.redner_ville_societe_2_substitution'), + ref('redner.redner_villeclient_2_substitution'), + ref('redner.redner_invoice_line_ids_remise_substitution'), + ref('redner.redner_invoice_line_ids_unite_substitution'), + ref('redner.redner_lignes_tva_substitution'), + ref('redner.redner_lignes_tva_taxe_origine_substitution'), + ref('redner.redner_lignes_tva_amount_tax_ligne_substitution'), + ref('redner.redner_lignes_tva_base_taxe_substitution'), + ref('redner.redner_lignes_tva_montant_taxe_substitution'), + ref('redner.redner_ref_client_substitution'), + ref('redner.redner_invoice_line_ids_section_name_substitution'), + ref('redner.redner_invoice_line_ids_section_substitution'), + ref('redner.redner_invoice_line_ids_note_name_substitution'), + ref('redner.redner_invoice_line_ids_note_substitution'), + ref('redner.redner_invoice_line_ids_not_section_substitution'),]" + /> + </function> +</odoo> diff --git a/data/redner_demo.xml b/data/redner_demo.xml new file mode 100644 index 0000000000000000000000000000000000000000..44c22574708d0fd9a5189f02a3f5d595d558b2db_ZGF0YS9yZWRuZXJfZGVtby54bWw= --- /dev/null +++ b/data/redner_demo.xml @@ -0,0 +1,461 @@ +<?xml version="1.0" encoding="utf-8" ?> +<odoo noupdate="1"> + <!-- Making redner template without using redner --> + <record id="redner_invoice_having" model="redner.template"> + <field name="name">facture_avoir_v9_test_130620241317.odt</field> + <field name="language"> + application/vnd.oasis.opendocument.text|od+mustache + </field> + <field + name="template_data" + type="base64" + file="redner/static/odt/facture_avoir_v9.odt" + /> + <!-- Redner data record should not use Redner by default, + required configurations will be handled manually --> + <field name="use_redner">False</field> + </record> + + <!-- Substitutions from redner template --> + <record id="redner_avoir_substitution" model="redner.substitution"> + <field name="keyword">avoir</field> + <field name="converter">mail_template</field> + <field name="value">{{ object.move_type=='out_refund' }}</field> + </record> + + <record id="redner_avoir_logo_body_substitution" model="redner.substitution"> + <field name="keyword">avoir.logo.body</field> + </record> + + <record id="redner_avoir_logo_mime_type_substitution" model="redner.substitution"> + <field name="keyword">avoir.logo.mime-type</field> + </record> + + <record id="redner_bic_societe_substitution" model="redner.substitution"> + <field name="keyword">bic_societe</field> + <field name="converter">mail_template</field> + <field name="value"> + {{ object.company_id.partner_id.bank_ids[0].bank_id.bic }} + </field> + </record> + + <record id="redner_condition_paiement_substitution" model="redner.substitution"> + <field name="keyword">condition_paiement</field> + <field name="converter">field</field> + <field name="value">partner_id.property_payment_term_id.name</field> + </record> + + <record id="redner_facture_substitution" model="redner.substitution"> + <field name="keyword">facture</field> + <field name="converter">mail_template</field> + <field name="value">{{ object.move_type=='out_invoice' }}</field> + </record> + + <record id="redner_facture_logo_body_substitution" model="redner.substitution"> + <field name="keyword">facture.logo.body</field> + </record> + + <record id="redner_facture_logo_mime_type_substitution" model="redner.substitution"> + <field name="keyword">facture.logo.mime-type</field> + </record> + + <record id="redner_iban_societe_substitution" model="redner.substitution"> + <field name="keyword">iban_societe</field> + <field name="converter">mail_template</field> + <field name="value"> + {{ object.company_id.partner_id.bank_ids[0].acc_number }} + </field> + </record> + + <record id="redner_invoice_line_ids_substitution" model="redner.substitution"> + <field name="keyword">invoice_line_ids</field> + <field name="converter">relation-to-many</field> + <field name="value">invoice_line_ids</field> + </record> + + <record + id="redner_invoice_line_ids_article_substitution" + model="redner.substitution" + > + <field name="keyword">invoice_line_ids.article</field> + <field name="converter">field</field> + <field name="value">name</field> + </record> + + <record + id="redner_invoice_line_ids_prixunitaire_substitution" + model="redner.substitution" + > + <field name="keyword">invoice_line_ids.prixunitaire</field> + <field name="converter">field</field> + <field name="value">price_unit</field> + </record> + + <record + id="redner_invoice_line_ids_quantity_substitution" + model="redner.substitution" + > + <field name="keyword">invoice_line_ids.quantity</field> + <field name="converter">field</field> + <field name="value">quantity</field> + </record> + + <record + id="redner_invoice_line_ids_totalht_substitution" + model="redner.substitution" + > + <field name="keyword">invoice_line_ids.totalht</field> + <field name="converter">field</field> + <field name="value">price_subtotal</field> + </record> + + <record id="redner_montant_ht_substitution" model="redner.substitution"> + <field name="keyword">montant_ht</field> + <field name="converter">field</field> + <field name="value">amount_untaxed</field> + </record> + + <record id="redner_montant_total_substitution" model="redner.substitution"> + <field name="keyword">montant_total</field> + <field name="converter">field</field> + <field name="value">amount_total</field> + </record> + + <record id="redner_montant_tva_substitution" model="redner.substitution"> + <field name="keyword">montant_tva</field> + <field name="converter">field</field> + <field name="value">amount_tax</field> + </record> + + <record id="redner_nom_banque_societe_substitution" model="redner.substitution"> + <field name="keyword">nom_banque_societe</field> + <field name="converter">mail_template</field> + <field name="value"> + {{ object.company_id.partner_id.bank_ids[0].bank_id.name }} + </field> + </record> + + <record id="redner_invoiceduedate_substitution" model="redner.substitution"> + <field name="keyword">invoiceduedate</field> + <field name="converter">mail_template</field> + <field name="value">{{ object.invoice_date_due }}</field> + </record> + + <record id="redner_logo_substitution" model="redner.substitution"> + <field name="keyword">logo</field> + <field name="converter">image-file</field> + <field name="value">company_id.logo</field> + </record> + + <record id="redner_num_AVOIR_substitution" model="redner.substitution"> + <field name="keyword">num_AVOIR</field> + <field name="converter">field</field> + <field name="value">name</field> + </record> + + <record id="redner_transaction_date_substitution" model="redner.substitution"> + <field name="keyword">transaction_date</field> + <field name="converter">mail_template</field> + <field name="value">{{ object.invoice_date }}</field> + </record> + + <record id="redner_date_invoice_substitution" model="redner.substitution"> + <field name="keyword">date_invoice</field> + <field name="converter">mail_template</field> + <field name="value">{{ object.invoice_date }}</field> + </record> + + <record id="redner_invoiceduedate_2_substitution" model="redner.substitution"> + <field name="keyword">invoiceduedate</field> + <field name="converter">mail_template</field> + <field name="value">{{ object.invoice_date_due }}</field> + </record> + + <record id="redner_logo_2_substitution" model="redner.substitution"> + <field name="keyword">logo</field> + <field name="converter">image-file</field> + <field name="value">company_id.logo</field> + </record> + + <record id="redner_num_facture_substitution" model="redner.substitution"> + <field name="keyword">num_facture</field> + <field name="converter">field</field> + <field name="value">name</field> + </record> + + <record id="redner_codepostal_societe_substitution" model="redner.substitution"> + <field name="keyword">codepostal_societe</field> + <field name="converter">field</field> + <field name="value">company_id.zip</field> + </record> + + <record id="redner_codepostalclient_substitution" model="redner.substitution"> + <field name="keyword">codepostalclient</field> + <field name="converter">field</field> + <field name="value">partner_id.zip</field> + </record> + + <record id="redner_courriel_societe_substitution" model="redner.substitution"> + <field name="keyword">courriel_societe</field> + <field name="converter">field</field> + <field name="value">company_id.email</field> + </record> + + <record id="redner_nomclient_substitution" model="redner.substitution"> + <field name="keyword">nomclient</field> + <field name="converter">field</field> + <field name="value">partner_id.name</field> + </record> + + <record id="redner_rue1_societe_substitution" model="redner.substitution"> + <field name="keyword">rue1_societe</field> + <field name="converter">field</field> + <field name="value">company_id.street</field> + </record> + + <record id="redner_rue1client_substitution" model="redner.substitution"> + <field name="keyword">rue1client</field> + <field name="converter">field</field> + <field name="value">partner_id.street</field> + </record> + + <record id="redner_rue2_societe_substitution" model="redner.substitution"> + <field name="keyword">rue2_societe</field> + <field name="converter">field</field> + <field name="value">company_id.street2</field> + </record> + + <record + id="redner_avoir_rue2_societe_rue2_societe_substitution" + model="redner.substitution" + > + <field name="keyword">avoir.rue2_societe.rue2_societe</field> + </record> + + <record id="redner_rue2client_substitution" model="redner.substitution"> + <field name="keyword">rue2client</field> + <field name="converter">field</field> + <field name="value">partner_id.street2</field> + </record> + + <record + id="redner_avoir_rue2client_rue2client_substitution" + model="redner.substitution" + > + <field name="keyword">avoir.rue2client.rue2client</field> + </record> + + <record id="redner_siret_societe_substitution" model="redner.substitution"> + <field name="keyword">siret_societe</field> + <field name="converter">field</field> + <field name="value">company_id.siret</field> + </record> + + <record id="redner_tva_societe_substitution" model="redner.substitution"> + <field name="keyword">tva_societe</field> + <field name="converter">field</field> + <field name="value">company_id.vat</field> + </record> + + <record id="redner_ville_societe_substitution" model="redner.substitution"> + <field name="keyword">ville_societe</field> + <field name="converter">field</field> + <field name="value">company_id.city</field> + </record> + + <record id="redner_villeclient_substitution" model="redner.substitution"> + <field name="keyword">villeclient</field> + <field name="converter">field</field> + <field name="value">partner_id.city</field> + </record> + + <record id="redner_codepostal_societe_2_substitution" model="redner.substitution"> + <field name="keyword">codepostal_societe</field> + <field name="converter">field</field> + <field name="value">company_id.zip</field> + </record> + + <record id="redner_codepostalclient_2_substitution" model="redner.substitution"> + <field name="keyword">codepostalclient</field> + <field name="converter">field</field> + <field name="value">partner_id.zip</field> + </record> + + <record id="redner_courriel_societe_2_substitution" model="redner.substitution"> + <field name="keyword">courriel_societe</field> + <field name="converter">field</field> + <field name="value">company_id.email</field> + </record> + + <record id="redner_nomclient_2_substitution" model="redner.substitution"> + <field name="keyword">nomclient</field> + <field name="converter">field</field> + <field name="value">partner_id.name</field> + </record> + + <record id="redner_rue1_societe_2_substitution" model="redner.substitution"> + <field name="keyword">rue1_societe</field> + <field name="converter">field</field> + <field name="value">company_id.street</field> + </record> + + <record id="redner_rue1client_2_substitution" model="redner.substitution"> + <field name="keyword">rue1client</field> + <field name="converter">field</field> + <field name="value">partner_id.street</field> + </record> + + <record id="redner_rue2_societe_2_substitution" model="redner.substitution"> + <field name="keyword">rue2_societe</field> + <field name="converter">field</field> + <field name="value">company_id.street2</field> + </record> + + <record + id="redner_facture_rue2_societe_rue2_societe_substitution" + model="redner.substitution" + > + <field name="keyword">facture.rue2_societe.rue2_societe</field> + </record> + + <record id="redner_rue2client_2_substitution" model="redner.substitution"> + <field name="keyword">rue2client</field> + <field name="converter">field</field> + <field name="value">partner_id.street2</field> + </record> + + <record + id="redner_facture_rue2client_rue2client_substitution" + model="redner.substitution" + > + <field name="keyword">facture.rue2client.rue2client</field> + </record> + + <record id="redner_siret_societe_2_substitution" model="redner.substitution"> + <field name="keyword">siret_societe</field> + <field name="converter">field</field> + <field name="value">company_id.siret</field> + </record> + + <record id="redner_tva_societe_2_substitution" model="redner.substitution"> + <field name="keyword">tva_societe</field> + <field name="converter">field</field> + <field name="value">company_id.vat</field> + </record> + + <record id="redner_ville_societe_2_substitution" model="redner.substitution"> + <field name="keyword">ville_societe</field> + <field name="converter">field</field> + <field name="value">company_id.city</field> + </record> + + <record id="redner_villeclient_2_substitution" model="redner.substitution"> + <field name="keyword">villeclient</field> + <field name="converter">field</field> + <field name="value">partner_id.city</field> + </record> + + <record + id="redner_invoice_line_ids_remise_substitution" + model="redner.substitution" + > + <field name="keyword">invoice_line_ids.remise</field> + <field name="converter">field</field> + <field name="value">discount</field> + </record> + + <record id="redner_invoice_line_ids_unite_substitution" model="redner.substitution"> + <field name="keyword">invoice_line_ids.unite</field> + <field name="converter">mail_template</field> + <field name="value"> + {{ object.product_uom_id.name if object.product_uom_id else "" }} + </field> + </record> + + <record id="redner_lignes_tva_substitution" model="redner.substitution"> + <field name="keyword">lignes_tva</field> + <field name="converter">relation-to-many</field> + <field name="value">line_ids</field> + </record> + + <record + id="redner_lignes_tva_taxe_origine_substitution" + model="redner.substitution" + > + <field name="keyword">lignes_tva.taxe_origine</field> + <field name="converter">mail_template</field> + <field name="value">{{ bool(object.tax_line_id) }}</field> + </record> + + <record + id="redner_lignes_tva_amount_tax_ligne_substitution" + model="redner.substitution" + > + <field name="keyword">lignes_tva.amount_tax_ligne</field> + <field name="converter">mail_template</field> + <field name="value">{{object.tax_line_id.tax_group_id.name}}</field> + </record> + + <record id="redner_lignes_tva_base_taxe_substitution" model="redner.substitution"> + <field name="keyword">lignes_tva.base_taxe</field> + <field name="converter">field</field> + <field name="value">tax_base_amount</field> + </record> + + <record + id="redner_lignes_tva_montant_taxe_substitution" + model="redner.substitution" + > + <field name="keyword">lignes_tva.montant_taxe</field> + <field name="converter">field</field> + <field name="value">credit</field> + </record> + + <record id="redner_ref_client_substitution" model="redner.substitution"> + <field name="keyword">ref_client</field> + <field name="converter">field</field> + <field name="value">ref</field> + </record> + + <record + id="redner_invoice_line_ids_section_name_substitution" + model="redner.substitution" + > + <field name="keyword">invoice_line_ids.section_name</field> + <field name="converter">mail_template</field> + <field name="value">{{ object.name }}</field> + </record> + + <record + id="redner_invoice_line_ids_section_substitution" + model="redner.substitution" + > + <field name="keyword">invoice_line_ids.section</field> + <field name="converter">mail_template</field> + <field name="value">{{ object.display_type=='line_section' }}</field> + </record> + + <record + id="redner_invoice_line_ids_note_name_substitution" + model="redner.substitution" + > + <field name="keyword">invoice_line_ids.note_name</field> + <field name="converter">mail_template</field> + <field name="value">{{ object.name }}</field> + </record> + + <record id="redner_invoice_line_ids_note_substitution" model="redner.substitution"> + <field name="keyword">invoice_line_ids.note</field> + <field name="converter">mail_template</field> + <field name="value">{{ object.display_type=='line_note' }}</field> + </record> + + <record + id="redner_invoice_line_ids_not_section_substitution" + model="redner.substitution" + > + <field name="keyword">invoice_line_ids.not_section</field> + <field name="converter">mail_template</field> + <field name="value">{{ object.display_type=='product' }}</field> + </record> +</odoo> diff --git a/i18n/fr.po b/i18n/fr.po index efe989234664650a92eb957b135088821213267e_aTE4bi9mci5wbw==..44c22574708d0fd9a5189f02a3f5d595d558b2db_aTE4bi9mci5wbw== 100644 --- a/i18n/fr.po +++ b/i18n/fr.po @@ -1,4 +1,4 @@ # Translation of Odoo Server. # This file contains the translation of the following modules: -# * redner +# * redner # Vincent Hatakeyama <vincent.hatakeyama@xcg-consulting.fr>, 2021. @@ -4,5 +4,6 @@ # Vincent Hatakeyama <vincent.hatakeyama@xcg-consulting.fr>, 2021. +# Houzéfa Abbasbhay <houzefa.abba@xcg-consulting.fr>, 2021. msgid "" msgstr "" "Project-Id-Version: Odoo Server 16.0\n" "Report-Msgid-Bugs-To: \n" @@ -5,13 +6,13 @@ msgid "" msgstr "" "Project-Id-Version: Odoo Server 16.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-02-03 16:15+0000\n" -"PO-Revision-Date: 2023-02-03 17:15+0100\n" -"Last-Translator: Houzéfa Abbasbhay <houzefa.abba@xcg-consulting.fr>\n" -"Language-Team: XCG Consulting\n" +"POT-Creation-Date: 2024-06-13 17:24+0000\n" +"PO-Revision-Date: 2024-06-13 17:37+0000\n" +"Last-Translator: Arona Ben Cherif Diatta <aronabencherif.diatta@xcg.africa>\n" +"Language-Team: \n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" @@ -13,9 +14,9 @@ "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" -"X-Generator: Poedit 2.0.6\n" +"X-Generator: Poedit 3.4.3\n" #. module: redner #. odoo-python @@ -56,6 +57,8 @@ "Cannot find redner config url. Please add it in odoo.conf or in ir." "config_parameter" msgstr "" +"Impossible de trouver l'url de configuration de redner. Veuillez l'ajouter " +"dans odoo.conf ou dans ir.config_parameter" #. module: redner #: model:ir.model.fields,help:redner.field_redner_template__body @@ -111,7 +114,7 @@ #. module: redner #: model:ir.model.fields,field_description:redner.field_redner_substitution__value msgid "Expression" -msgstr "Expression" +msgstr "" #. module: redner #. odoo-python @@ -145,10 +148,10 @@ #. module: redner #: model:ir.model.fields.selection,name:redner.selection__redner_template__language__text/html|mustache msgid "HTML + mustache" -msgstr "HTML + mustache" +msgstr "" #. module: redner #: model:ir.model.fields,field_description:redner.field_redner_report__id #: model:ir.model.fields,field_description:redner.field_redner_substitution__id #: model:ir.model.fields,field_description:redner.field_redner_template__id msgid "ID" @@ -149,10 +152,10 @@ #. module: redner #: model:ir.model.fields,field_description:redner.field_redner_report__id #: model:ir.model.fields,field_description:redner.field_redner_substitution__id #: model:ir.model.fields,field_description:redner.field_redner_template__id msgid "ID" -msgstr "ID" +msgstr "" #. module: redner #: model:ir.model.fields,help:redner.field_redner_template__active @@ -166,8 +169,9 @@ #: model:ir.model.fields,help:redner.field_ir_actions_report__redner_multi_in_one msgid "" "If you execute a report on several records, by default Odoo will generate a " -"ZIP file that contains as many files as selected records. If you enable this " -"option, Odoo will generate instead a single report for the selected records." +"ZIP file that contains as many files as selected records. If you enable " +"this option, Odoo will generate instead a single report for the selected " +"records." msgstr "" "Si vous exécutez un rapport sur plusieurs enregistrements, par défaut, Odoo " "générera un fichier ZIP qui contiendra autant de fichiers que " @@ -185,6 +189,11 @@ msgstr "" #. module: redner +#: model:ir.model.fields,help:redner.field_redner_template__use_redner +msgid "Indicate whether this redner template is synchronized with redner" +msgstr "Indique si ce modèle redner est synchronisé avec redner" + +#. module: redner #: model:ir.model.fields,field_description:redner.field_redner_report__ir_actions_report_id msgid "Ir Actions Report" msgstr "" @@ -244,7 +253,7 @@ #. module: redner #: model:ir.model.fields.selection,name:redner.selection__redner_template__language__text/mjml|mustache msgid "MJML + mustache" -msgstr "MJML + mustache" +msgstr "" #. module: redner #: model:ir.model.fields,field_description:redner.field_ir_actions_report__redner_multi_in_one @@ -279,7 +288,7 @@ #. module: redner #: model:ir.ui.menu,name:redner.redner_menu msgid "Redner" -msgstr "Redner" +msgstr "" #. module: redner #: model:ir.model.fields,field_description:redner.field_redner_template__redner_id @@ -333,7 +342,7 @@ #. module: redner #: model:ir.model,name:redner.model_ir_actions_report msgid "Report Action" -msgstr "" +msgstr "Signaler l'action" #. module: redner #: model:ir.model,name:redner.model_redner_report @@ -343,7 +352,7 @@ #. module: redner #: model:ir.model.fields,field_description:redner.field_ir_actions_report__report_type msgid "Report Type" -msgstr "" +msgstr "Type de rapport" #. module: redner #: model:ir.actions.server,name:redner.send_to_rednerd_server_action @@ -358,8 +367,8 @@ #. module: redner #: model:ir.model.fields,field_description:redner.field_redner_template__slug msgid "Slug" -msgstr "Slug" +msgstr "" #. module: redner #: model:ir.model.fields,field_description:redner.field_ir_actions_report__substitution_ids msgid "Substitution" @@ -362,11 +371,11 @@ #. module: redner #: model:ir.model.fields,field_description:redner.field_ir_actions_report__substitution_ids msgid "Substitution" -msgstr "Substitution" +msgstr "" #. module: redner #: model:ir.model.fields,field_description:redner.field_mail_template__redner_substitution_ids #: model_terms:ir.ui.view,arch_db:redner.redner_report_view #: model_terms:ir.ui.view,arch_db:redner.view_email_template_form msgid "Substitutions" @@ -367,10 +376,15 @@ #. module: redner #: model:ir.model.fields,field_description:redner.field_mail_template__redner_substitution_ids #: model_terms:ir.ui.view,arch_db:redner.redner_report_view #: model_terms:ir.ui.view,arch_db:redner.view_email_template_form msgid "Substitutions" -msgstr "Substitutions" +msgstr "" + +#. module: redner +#: model_terms:ir.ui.view,arch_db:redner.redner_template_view_form +msgid "Synchronize with Redner" +msgstr "" #. module: redner #: model_terms:ir.ui.view,arch_db:redner.redner_template_view_form @@ -383,6 +397,13 @@ msgstr "Modèle Libreoffice" #. module: redner +#. odoo-python +#: code:addons/redner/models/redner_template.py:0 +#, python-format +msgid "Template has already been synced with redner !" +msgstr "Le modèle a déjà été synchronisé avec redner !" + +#. module: redner #: model:ir.model.fields,field_description:redner.field_redner_template__body msgid "Template remote Id" msgstr "" @@ -393,6 +414,11 @@ msgstr "Nom de la variable du modèle" #. module: redner +#: model_terms:ir.ui.view,arch_db:redner.redner_template_view_form +msgid "Template will be synchronized with redner. Continue?" +msgstr "Template will be synchronisez with redner. Continue?" + +#. module: redner #: model:ir.ui.menu,name:redner.redner_template_menu msgid "Templates" msgstr "Modèles" @@ -416,6 +442,10 @@ "browser PDF means the report will be rendered using Wkhtmltopdf and " "downloaded by the user." msgstr "" +"Le type du rapport qui sera rendu, chacun ayant sa propre méthode de rendu. " +"HTML signifie que le rapport sera ouvert directement dans votre navigateur. " +"PDF signifie que le rapport sera rendu à l'aide de Wkhtmltopdf et " +"téléchargé par l'utilisateur." #. module: redner #: model:ir.model.fields,help:redner.field_redner_template__name @@ -430,5 +460,10 @@ msgstr "Erreur redner : %r" #. module: redner +#: model:ir.model.fields,field_description:redner.field_redner_template__use_redner +msgid "Use redner" +msgstr "Utilise redner" + +#. module: redner #: model:ir.model.fields,field_description:redner.field_redner_substitution__keyword msgid "Variable" @@ -433,6 +468,6 @@ #: model:ir.model.fields,field_description:redner.field_redner_substitution__keyword msgid "Variable" -msgstr "Variable" +msgstr "" #. module: redner #: model:ir.model.fields,field_description:redner.field_redner_template__detected_keywords @@ -436,4 +471,5 @@ #. module: redner #: model:ir.model.fields,field_description:redner.field_redner_template__detected_keywords +#: model_terms:ir.ui.view,arch_db:redner.redner_template_view_form msgid "Variables" @@ -439,5 +475,5 @@ msgid "Variables" -msgstr "Variables" +msgstr "" #. module: redner #. odoo-python @@ -461,7 +497,7 @@ #. module: redner #: model:ir.model.fields.selection,name:redner.selection__ir_actions_report__report_type__redner msgid "redner" -msgstr "redner" +msgstr "" #. module: redner #: model:ir.model.fields,help:redner.field_redner_template__is_mjml @@ -471,4 +507,4 @@ #. module: redner #: model:ir.model.fields,help:redner.field_redner_template__language msgid "templating language" -msgstr "langage du modèle" +msgstr "langage du modèle" \ No newline at end of file diff --git a/models/ir_actions_report.py b/models/ir_actions_report.py index efe989234664650a92eb957b135088821213267e_bW9kZWxzL2lyX2FjdGlvbnNfcmVwb3J0LnB5..44c22574708d0fd9a5189f02a3f5d595d558b2db_bW9kZWxzL2lyX2FjdGlvbnNfcmVwb3J0LnB5 100644 --- a/models/ir_actions_report.py +++ b/models/ir_actions_report.py @@ -1,7 +1,7 @@ ############################################################################## # # Redner Odoo module -# Copyright © 2016 XCG Consulting <https://xcg-consulting.fr> +# Copyright © 2016, 2024 XCG Consulting <https://xcg-consulting.fr> # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as @@ -247,3 +247,22 @@ attachment_vals["name"], ) return buffer + + @api.model + def _redner_demo_invoice_having_report(self, substitutions_list): + # Check if account module is installed + check_account_module = self.env["ir.module.module"].search( + [("name", "=", "account")] + ) + if check_account_module and check_account_module.state == "installed": + self.create( + { + "name": "Facture_Avoir", + "model": "account.move", + "report_type": "redner", + "report_name": "account_move", + "redner_filetype": "pdf", + "redner_tmpl_id": self.env.ref("redner.redner_invoice_having").id, + "substitution_ids": [(6, 0, substitutions_list)], + } + ) diff --git a/models/redner_template.py b/models/redner_template.py index efe989234664650a92eb957b135088821213267e_bW9kZWxzL3JlZG5lcl90ZW1wbGF0ZS5weQ==..44c22574708d0fd9a5189f02a3f5d595d558b2db_bW9kZWxzL3JlZG5lcl90ZW1wbGF0ZS5weQ== 100644 --- a/models/redner_template.py +++ b/models/redner_template.py @@ -1,7 +1,7 @@ ############################################################################## # # Redner Odoo module -# Copyright © 2016 XCG Consulting <https://xcg-consulting.fr> +# Copyright © 2016, 2024 XCG Consulting <https://xcg-consulting.fr> # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as @@ -37,6 +37,13 @@ _name = "redner.template" _description = "Redner Template" + use_redner = fields.Boolean( + string="Use redner", + default=True, + help="Indicate whether this redner template is synchronized with redner", + readonly=True, + ) + name = fields.Char( string="Name", required=True, @@ -128,6 +135,8 @@ else (vals.get("body"), "text") ) + if not vals.get("use_redner"): + return super().create(vals_list) # We depend on the API for consistency here # So raised error should not result with a created template vals["redner_id"] = self.redner.templates.account_template_add( @@ -196,6 +205,37 @@ return super().unlink() + def synchronize_template_with_redner(self): + """This method is used to join a template without + redner with redner""" + self.ensure_one() + + if not self.use_redner: + produces, language = self.language.split("|") + # Check if template data is of type bytes before decoding + if isinstance(self.template_data or "", bytes): + template_data = self.template_data.decode() # utf-8 by default + body, body_format = ( + (template_data or "", "base64") + if language == "od+mustache" + else (self.body, "text") + ) + + # We depend on the API for consistency here + # So raised error should not result with a created template + + redner_id = self.redner.templates.account_template_add( + language=language, + body=body, + name=self.name, + produces=produces, + body_format=body_format, + version=fields.Datetime.to_string(fields.Datetime.now()), + ) + self.write({"redner_id": redner_id, "use_redner": True}) + else: + raise ValidationError(_("Template has already been synced with redner !")) + def copy(self, default=None): self.ensure_one() default = dict(default or {}, name=_("%s (copy)") % self.name) diff --git a/tests/common.py b/tests/common.py index efe989234664650a92eb957b135088821213267e_dGVzdHMvY29tbW9uLnB5..44c22574708d0fd9a5189f02a3f5d595d558b2db_dGVzdHMvY29tbW9uLnB5 100644 --- a/tests/common.py +++ b/tests/common.py @@ -1,7 +1,7 @@ ############################################################################## # # Redner Odoo module -# Copyright © 2023 XCG Consulting <https://xcg-consulting.fr> +# Copyright © 2023, 2024 XCG Consulting <https://xcg-consulting.fr> # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as @@ -43,3 +43,19 @@ values = self.env["redner.template"].default_get(["language"]) values.update({"name": "test-name", "body": "hello {{ login }}"}) return self.env["redner.template"].create(values) + + @mock.patch("requests.sessions.Session.post") + def _create_redner_template_without_redner(self, requests_post_mock): + """Create a redner template without redner used in tests.""" + requests_post_mock.return_value = mock.Mock( + status_code=200, json=lambda: {"name": "test-redner-id"} + ) + values = self.env["redner.template"].default_get(["language"]) + values.update( + { + "name": "test-name_without-redner", + "use_redner": False, + "body": "hello {{ login }}", + } + ) + return self.env["redner.template"].create(values) diff --git a/tests/test_redner_template.py b/tests/test_redner_template.py index efe989234664650a92eb957b135088821213267e_dGVzdHMvdGVzdF9yZWRuZXJfdGVtcGxhdGUucHk=..44c22574708d0fd9a5189f02a3f5d595d558b2db_dGVzdHMvdGVzdF9yZWRuZXJfdGVtcGxhdGUucHk= 100644 --- a/tests/test_redner_template.py +++ b/tests/test_redner_template.py @@ -1,7 +1,7 @@ ############################################################################## # # Redner Odoo module -# Copyright © 2023 XCG Consulting <https://xcg-consulting.fr> +# Copyright © 2023, 2024 XCG Consulting <https://xcg-consulting.fr> # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as @@ -24,6 +24,8 @@ from .common import TestCommon +from odoo.exceptions import ValidationError + TEMPLATE_URL = "https://test-redner-url/api/v1/template/test-account" @@ -82,3 +84,31 @@ timeout=20, ) requests_put_mock.reset_mock() + + def test_synchronization_with_redner(self): + redner_template = self._create_redner_template_without_redner() + + self.assertFalse( + redner_template.use_redner, "Value of 'Use redner' has changed" + ) + self.assertFalse( + redner_template.redner_id, "Template is created without redner" + ) + + self.assetFalse( + redner_template.detected_keywords, "Template is created without keywords" + ) + + redner_template.synchronize_template_with_redner() # Join a template with redner + + self.assertTrue( + redner_template.use_redner, "Value of 'Use redner' equals True after join" + ) + self.assertTrue(redner_template.redner_id, "Template is updated with redner") + + self.assetFalse( + redner_template.detected_keywords, "Template is updated with keywords" + ) + + with self.assertRaises(ValidationError), self.cr.savepoint(): + redner_template.synchronize_template_with_redner() # Template has already been synced with redner diff --git a/views/redner_template.xml b/views/redner_template.xml index efe989234664650a92eb957b135088821213267e_dmlld3MvcmVkbmVyX3RlbXBsYXRlLnhtbA==..44c22574708d0fd9a5189f02a3f5d595d558b2db_dmlld3MvcmVkbmVyX3RlbXBsYXRlLnhtbA== 100644 --- a/views/redner_template.xml +++ b/views/redner_template.xml @@ -94,6 +94,16 @@ <group> <field name="locale_id" /> </group> + <group class="d-flex align-items-start"> + <field name="use_redner" /> + <button + attrs="{'invisible': [('use_redner', '=', True)]}" + confirm="Template will be synchronized with redner. Continue?" + name="synchronize_template_with_redner" + string="Synchronize with Redner" + type="object" + /> + </group> </page> </notebook> </sheet>