mirror of
https://github.com/OCA/rma.git
synced 2025-02-16 17:11:47 +02:00
[MIG] rma: Migration to 18.0
Changes done: - Purge translations - Remove migration scripts - Change translations (_) to self.env._ - Change check_access_rights() method to has_access() method - Change method _product_is_storable() to product_id.is_storable - Set check_company=True to stock.warehouse fields - Change domain of multi-company rules for better performance - Change tree to list in views - Change kanban-box to card - Replace <div class="oe_chatter"> with <chatter /> - Remove unnecessary invisible fields in views - Changes in portal templates - Changes in stock.picking.return - Change copy() methods to make them multi-records - Remove copy() method from stock.picking, context key is not used TT54263
This commit is contained in:
@@ -5,7 +5,7 @@
|
|||||||
{
|
{
|
||||||
"name": "Return Merchandise Authorization Management",
|
"name": "Return Merchandise Authorization Management",
|
||||||
"summary": "Return Merchandise Authorization (RMA)",
|
"summary": "Return Merchandise Authorization (RMA)",
|
||||||
"version": "17.0.2.0.0",
|
"version": "18.0.1.0.0",
|
||||||
"development_status": "Production/Stable",
|
"development_status": "Production/Stable",
|
||||||
"category": "RMA",
|
"category": "RMA",
|
||||||
"website": "https://github.com/OCA/rma",
|
"website": "https://github.com/OCA/rma",
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
# Copyright 2020 Tecnativa - Ernesto Tejeda
|
# Copyright 2020 Tecnativa - Ernesto Tejeda
|
||||||
# Copyright 2022 Tecnativa - Víctor Martínez
|
# Copyright 2022-2025 Tecnativa - Víctor Martínez
|
||||||
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
|
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
|
||||||
|
|
||||||
from odoo import _, exceptions, http
|
from odoo import _, exceptions, http
|
||||||
@@ -17,9 +17,7 @@ class PortalRma(CustomerPortal):
|
|||||||
if "rma_count" in counters:
|
if "rma_count" in counters:
|
||||||
rma_model = request.env["rma"]
|
rma_model = request.env["rma"]
|
||||||
rma_count = (
|
rma_count = (
|
||||||
rma_model.search_count([])
|
rma_model.search_count([]) if rma_model.has_access("read") else 0
|
||||||
if rma_model.check_access_rights("read", raise_exception=False)
|
|
||||||
else 0
|
|
||||||
)
|
)
|
||||||
values["rma_count"] = rma_count
|
values["rma_count"] = rma_count
|
||||||
return values
|
return values
|
||||||
@@ -43,7 +41,7 @@ class PortalRma(CustomerPortal):
|
|||||||
values = self._prepare_portal_layout_values()
|
values = self._prepare_portal_layout_values()
|
||||||
rma_obj = request.env["rma"]
|
rma_obj = request.env["rma"]
|
||||||
# Avoid error if the user does not have access.
|
# Avoid error if the user does not have access.
|
||||||
if not rma_obj.check_access_rights("read", raise_exception=False):
|
if not rma_obj.has_access("read"):
|
||||||
return request.redirect("/my")
|
return request.redirect("/my")
|
||||||
domain = self._get_filter_domain(kw)
|
domain = self._get_filter_domain(kw)
|
||||||
searchbar_sortings = {
|
searchbar_sortings = {
|
||||||
@@ -137,8 +135,7 @@ class PortalRma(CustomerPortal):
|
|||||||
picking = request.env["stock.picking"].browse([picking_id])
|
picking = request.env["stock.picking"].browse([picking_id])
|
||||||
picking_sudo = picking.sudo()
|
picking_sudo = picking.sudo()
|
||||||
try:
|
try:
|
||||||
picking.check_access_rights("read")
|
picking.check_access("read")
|
||||||
picking.check_access_rule("read")
|
|
||||||
except exceptions.AccessError:
|
except exceptions.AccessError:
|
||||||
if not access_token or not consteq(rma.access_token, access_token):
|
if not access_token or not consteq(rma.access_token, access_token):
|
||||||
raise
|
raise
|
||||||
|
|||||||
243
rma/i18n/de.po
243
rma/i18n/de.po
@@ -2301,246 +2301,3 @@ msgid ""
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
"{{object.company_id.name}} Ihre RMA wurde erfolgreich erstellt (Ref {{object."
|
"{{object.company_id.name}} Ihre RMA wurde erfolgreich erstellt (Ref {{object."
|
||||||
"name or 'n/a' }})"
|
"name or 'n/a' }})"
|
||||||
|
|
||||||
#~ msgid "SMS Delivery error"
|
|
||||||
#~ msgstr "SMS-Zustellungsfehler"
|
|
||||||
|
|
||||||
#~ msgid ""
|
|
||||||
#~ "<span class=\"fa fa-lg fa-building-o\" title=\"Values set here are "
|
|
||||||
#~ "company-specific.\" groups=\"base.group_multi_company\"/>"
|
|
||||||
#~ msgstr ""
|
|
||||||
#~ "<span class=\"fa fa-lg fa-building-o\" title=\"Diese Werte sind "
|
|
||||||
#~ "unternehmensspezifisch.\" groups=\"base.group_multi_company\"/>"
|
|
||||||
|
|
||||||
#~ msgid "Alias domain"
|
|
||||||
#~ msgstr "Alias domain"
|
|
||||||
|
|
||||||
#~ msgid "Delivered Qty Done"
|
|
||||||
#~ msgstr "gelieferte Menge Erledigt"
|
|
||||||
|
|
||||||
#~ msgid "Last Modified on"
|
|
||||||
#~ msgstr "Zuletzt geändert am"
|
|
||||||
|
|
||||||
#~ msgid "Main Attachment"
|
|
||||||
#~ msgstr "Hauptanhang"
|
|
||||||
|
|
||||||
#~ msgid "Owner"
|
|
||||||
#~ msgstr "Eigentümer"
|
|
||||||
|
|
||||||
#~ msgid "RMA Confirmation Email"
|
|
||||||
#~ msgstr "RMA-Bestätigungs-E-Mail"
|
|
||||||
|
|
||||||
#~ msgid "RMA Manual Finalization"
|
|
||||||
#~ msgstr "Manueller RMA-Abschluss"
|
|
||||||
|
|
||||||
#~ msgid "RMA Receipt Confirmation Email"
|
|
||||||
#~ msgstr "RMA-Empfangsbestätigungs-E-Mail"
|
|
||||||
|
|
||||||
#~ msgid "RMA draft notification Email"
|
|
||||||
#~ msgstr "Benachrichtigungs-E-Mail zum RMA-Entwurf"
|
|
||||||
|
|
||||||
#~ msgid "Remaining delivered qty to done"
|
|
||||||
#~ msgstr "Verbleibende Liefermenge zu erledigen"
|
|
||||||
|
|
||||||
#~ msgid ""
|
|
||||||
#~ "The owner of records created upon receiving emails on this alias. If this "
|
|
||||||
#~ "field is not set the system will attempt to find the right owner based on "
|
|
||||||
#~ "the sender (From) address, or will use the Administrator account if no "
|
|
||||||
#~ "system user is found for that address."
|
|
||||||
#~ msgstr ""
|
|
||||||
#~ "Der Eigentümer von Datensätzen, die beim Empfang von E-Mails unter diesem "
|
|
||||||
#~ "Alias erstellt wurden. Wenn dieses Feld nicht gesetzt ist, versucht das "
|
|
||||||
#~ "System, den richtigen Eigentümer anhand der Absenderadresse (Von) zu "
|
|
||||||
#~ "finden, oder verwendet das Administratorkonto, wenn kein Systembenutzer "
|
|
||||||
#~ "für diese Adresse gefunden wird."
|
|
||||||
|
|
||||||
#~ msgid ""
|
|
||||||
#~ "When the RMA is receive, allow to finsish it manually choosing\n"
|
|
||||||
#~ " a finalization reason."
|
|
||||||
#~ msgstr ""
|
|
||||||
#~ "Wenn die RMA eingegangen ist, können Sie sie manuell abschließen, \n"
|
|
||||||
#~ " indem Sie einen Abschlussgrund auswählen."
|
|
||||||
|
|
||||||
#~ msgid "{{(object.name or '')}}"
|
|
||||||
#~ msgstr "{{(object.name or '')}}"
|
|
||||||
|
|
||||||
#~ msgid ""
|
|
||||||
#~ "<div style=\"margin: 0px; padding: 0px;\">\n"
|
|
||||||
#~ " <p style=\"margin: 0px; padding: 0px; font-size: 13px;"
|
|
||||||
#~ "\">\n"
|
|
||||||
#~ " Dear\n"
|
|
||||||
#~ " <t t-out=\"object.partner_id.name\"/>\n"
|
|
||||||
#~ " <t t-if=\"object.partner_id.parent_id\">\n"
|
|
||||||
#~ " <t t-out=\"object.partner_id.parent_id.name\"/>\n"
|
|
||||||
#~ " </t>\n"
|
|
||||||
#~ " <br/>\n"
|
|
||||||
#~ " <br/>\n"
|
|
||||||
#~ " Here is the RMA\n"
|
|
||||||
#~ " <strong>\n"
|
|
||||||
#~ " <t t-out=\"object.name\"/>\n"
|
|
||||||
#~ " </strong>\n"
|
|
||||||
#~ " from\n"
|
|
||||||
#~ " <t t-out=\"object.company_id.name\"/>\n"
|
|
||||||
#~ " .\n"
|
|
||||||
#~ " <br/>\n"
|
|
||||||
#~ " <br/>\n"
|
|
||||||
#~ " Do not hesitate to contact us if you have any "
|
|
||||||
#~ "question.\n"
|
|
||||||
#~ " </p>\n"
|
|
||||||
#~ " </div>\n"
|
|
||||||
#~ " "
|
|
||||||
#~ msgstr ""
|
|
||||||
#~ "<div style=\"margin: 0px; padding: 0px;\">\n"
|
|
||||||
#~ " <p style=\"box-sizing:border-box;margin: 0px; padding: "
|
|
||||||
#~ "0px; font-size: 13px;\">\n"
|
|
||||||
#~ " Sehr geehrte/r\n"
|
|
||||||
#~ " <t t-out=\"object.partner_id.name\" data-oe-t-"
|
|
||||||
#~ "inline=\"true\"></t>\n"
|
|
||||||
#~ " <t t-if=\"object.partner_id.parent_id\" data-oe-t-"
|
|
||||||
#~ "group-active=\"true\">\n"
|
|
||||||
#~ " <t t-out=\"object.partner_id.parent_id.name\" "
|
|
||||||
#~ "data-oe-t-inline=\"true\"></t>\n"
|
|
||||||
#~ " </t>\n"
|
|
||||||
#~ " <br>\n"
|
|
||||||
#~ " <br>\n"
|
|
||||||
#~ " Hiermit übermitteln wie Ihnen unseren RMA Auftrag\n"
|
|
||||||
#~ " <strong style=\"box-sizing:border-box;font-weight:500;"
|
|
||||||
#~ "\">\n"
|
|
||||||
#~ " <t t-out=\"object.name\" data-oe-t-"
|
|
||||||
#~ "inline=\"true\"></t>\n"
|
|
||||||
#~ " </strong>\n"
|
|
||||||
#~ " von\n"
|
|
||||||
#~ " <t t-out=\"object.company_id.name\" data-oe-t-"
|
|
||||||
#~ "inline=\"true\"></t>\n"
|
|
||||||
#~ " .\n"
|
|
||||||
#~ " <br>\n"
|
|
||||||
#~ " <br>\n"
|
|
||||||
#~ " Zögern Sie nicht uns zu kontaktieren.\n"
|
|
||||||
#~ " </p>\n"
|
|
||||||
#~ " </div>\n"
|
|
||||||
#~ " "
|
|
||||||
|
|
||||||
#~ msgid ""
|
|
||||||
#~ "<div style=\"margin: 0px; padding: 0px;\">\n"
|
|
||||||
#~ " <p style=\"margin: 0px; padding: 0px; font-size: 13px;"
|
|
||||||
#~ "\">\n"
|
|
||||||
#~ " Dear\n"
|
|
||||||
#~ " <t t-out=\"object.partner_id.name\"/>\n"
|
|
||||||
#~ " <t t-if=\"object.partner_id.parent_id\">\n"
|
|
||||||
#~ " <t t-out=\"object.partner_id.parent_id.name\"/>\n"
|
|
||||||
#~ " </t>\n"
|
|
||||||
#~ " <br/>\n"
|
|
||||||
#~ " <br/>\n"
|
|
||||||
#~ " The products for your RMA\n"
|
|
||||||
#~ " <strong>\n"
|
|
||||||
#~ " <t t-out=\"object.name\"/>\n"
|
|
||||||
#~ " </strong>\n"
|
|
||||||
#~ " from\n"
|
|
||||||
#~ " <t t-out=\"object.company_id.name\"/>\n"
|
|
||||||
#~ " have been received in our warehouse.\n"
|
|
||||||
#~ " <br/>\n"
|
|
||||||
#~ " <br/>\n"
|
|
||||||
#~ " Do not hesitate to contact us if you have any "
|
|
||||||
#~ "question.\n"
|
|
||||||
#~ " </p>\n"
|
|
||||||
#~ " </div>\n"
|
|
||||||
#~ " "
|
|
||||||
#~ msgstr ""
|
|
||||||
#~ "<div style=\"margin: 0px; padding: 0px;\">\n"
|
|
||||||
#~ " <p style=\"margin: 0px; padding: 0px; font-size: 13px;"
|
|
||||||
#~ "\">\n"
|
|
||||||
#~ " Sehr geehrte/r\n"
|
|
||||||
#~ " <t t-out=\"object.partner_id.name\"/>\n"
|
|
||||||
#~ " <t t-if=\"object.partner_id.parent_id\">\n"
|
|
||||||
#~ " <t t-out=\"object.partner_id.parent_id.name\"/>\n"
|
|
||||||
#~ " </t>\n"
|
|
||||||
#~ " <br/>\n"
|
|
||||||
#~ " <br/>\n"
|
|
||||||
#~ "Die Produkte für ihren RMA\n"
|
|
||||||
#~ " <strong>\n"
|
|
||||||
#~ " <t t-out=\"object.name\"/>\n"
|
|
||||||
#~ " </strong>\n"
|
|
||||||
#~ " von\n"
|
|
||||||
#~ " <t t-out=\"object.company_id.name\"/>\n"
|
|
||||||
#~ "wurden in unserem Lager erfolgreich entgegen genommen.\n"
|
|
||||||
#~ " <br/>\n"
|
|
||||||
#~ " <br/>\n"
|
|
||||||
#~ " Zögern Sie nicht uns bei weiteren Fragen erneut zu "
|
|
||||||
#~ "kontaktieren\n"
|
|
||||||
#~ " </p>\n"
|
|
||||||
#~ " </div>\n"
|
|
||||||
#~ " "
|
|
||||||
|
|
||||||
#~ msgid ""
|
|
||||||
#~ "<div style=\"margin: 0px; padding: 0px;\">\n"
|
|
||||||
#~ " <p style=\"margin: 0px; padding: 0px; font-size: 13px;"
|
|
||||||
#~ "\">\n"
|
|
||||||
#~ " Dear\n"
|
|
||||||
#~ " <t t-out=\"object.partner_id.name\"/>\n"
|
|
||||||
#~ " <t t-if=\"object.partner_id.parent_id\">\n"
|
|
||||||
#~ " <t t-out=\"object.partner_id.parent_id.name\"/>\n"
|
|
||||||
#~ " </t>\n"
|
|
||||||
#~ " <br/>\n"
|
|
||||||
#~ " <br/>\n"
|
|
||||||
#~ " You've succesfully placed your RMA\n"
|
|
||||||
#~ " <strong>\n"
|
|
||||||
#~ " <t t-out=\"object.name\"/>\n"
|
|
||||||
#~ " </strong>\n"
|
|
||||||
#~ " on\n"
|
|
||||||
#~ " <t t-out=\"object.company_id.name\"/>\n"
|
|
||||||
#~ " . Our team will check it and will validate it as soon "
|
|
||||||
#~ "as possible.\n"
|
|
||||||
#~ " <br/>\n"
|
|
||||||
#~ " <br/>\n"
|
|
||||||
#~ " Do not hesitate to contact us if you have any "
|
|
||||||
#~ "question.\n"
|
|
||||||
#~ " </p>\n"
|
|
||||||
#~ " </div>\n"
|
|
||||||
#~ " "
|
|
||||||
#~ msgstr ""
|
|
||||||
#~ "<div style=\"margin: 0px; padding: 0px;\">\n"
|
|
||||||
#~ " <p style=\"box-sizing:border-box;margin: 0px; padding: "
|
|
||||||
#~ "0px; font-size: 13px;\">\n"
|
|
||||||
#~ " Sehr geehrte/r\n"
|
|
||||||
#~ " <t t-out=\"object.partner_id.name\" data-oe-t-"
|
|
||||||
#~ "inline=\"true\"></t>\n"
|
|
||||||
#~ " <t t-if=\"object.partner_id.parent_id\" data-oe-t-"
|
|
||||||
#~ "group-active=\"true\">\n"
|
|
||||||
#~ " <t t-out=\"object.partner_id.parent_id.name\" "
|
|
||||||
#~ "data-oe-t-inline=\"true\"></t>\n"
|
|
||||||
#~ " </t>\n"
|
|
||||||
#~ " <br>\n"
|
|
||||||
#~ " <br>\n"
|
|
||||||
#~ " Sie haben erfolgreich ihren Reklamationsauftrag "
|
|
||||||
#~ "eingebracht.\n"
|
|
||||||
#~ " <strong style=\"box-sizing:border-box;font-weight:500;"
|
|
||||||
#~ "\">\n"
|
|
||||||
#~ " <t t-out=\"object.name\" data-oe-t-"
|
|
||||||
#~ "inline=\"true\"></t>\n"
|
|
||||||
#~ " </strong>\n"
|
|
||||||
#~ " für\n"
|
|
||||||
#~ " <t t-out=\"object.company_id.name\" data-oe-t-"
|
|
||||||
#~ "inline=\"true\"></t>\n"
|
|
||||||
#~ " . Unser Team wird die Anfrage bearbeiten uns sich so "
|
|
||||||
#~ "bald wie möglich bei Ihnen melden.\n"
|
|
||||||
#~ " <br>\n"
|
|
||||||
#~ " <br>\n"
|
|
||||||
#~ "Zögern Sie nicht uns bei weiteren Fragen erneut zu kontaktieren\n"
|
|
||||||
#~ " </p>\n"
|
|
||||||
#~ " </div>\n"
|
|
||||||
#~ " "
|
|
||||||
|
|
||||||
#~ msgid "Number of messages which requires an action"
|
|
||||||
#~ msgstr "Anzahl der Nachrichten, die eine Aktion erfordern"
|
|
||||||
|
|
||||||
#~ msgid "Number of unread messages"
|
|
||||||
#~ msgstr "Anzahl der ungelesenen Nachrichten"
|
|
||||||
|
|
||||||
#~ msgid "Unread Messages"
|
|
||||||
#~ msgstr "ungelesene Nachrichten"
|
|
||||||
|
|
||||||
#~ msgid "Unread Messages Counter"
|
|
||||||
#~ msgstr "Zähler für ungelesene Nachrichten"
|
|
||||||
|
|
||||||
#~ msgid "Users"
|
|
||||||
#~ msgstr "Benutzer"
|
|
||||||
|
|||||||
263
rma/i18n/es.po
263
rma/i18n/es.po
@@ -2360,266 +2360,3 @@ msgid ""
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
"{{object.company_id.name}} Su RMA se ha creado con éxito (Ref {{object.name "
|
"{{object.company_id.name}} Su RMA se ha creado con éxito (Ref {{object.name "
|
||||||
"or 'n/a' }})"
|
"or 'n/a' }})"
|
||||||
|
|
||||||
#~ msgid "SMS Delivery error"
|
|
||||||
#~ msgstr "Error de Envío de Mensaje"
|
|
||||||
|
|
||||||
#~ msgid ""
|
|
||||||
#~ "<span class=\"fa fa-lg fa-building-o\" title=\"Values set here are "
|
|
||||||
#~ "company-specific.\" groups=\"base.group_multi_company\"/>"
|
|
||||||
#~ msgstr ""
|
|
||||||
#~ "<span class=\"fa fa-lg fa-building-o\" title=\"Valores específicos por "
|
|
||||||
#~ "compañía.\" groups=\"base.group_multi_company\"/>"
|
|
||||||
|
|
||||||
#~ msgid "Alias domain"
|
|
||||||
#~ msgstr "Seudónimo del dominio"
|
|
||||||
|
|
||||||
#~ msgid "Delivered Qty Done"
|
|
||||||
#~ msgstr "Ctd. entregada realizada"
|
|
||||||
|
|
||||||
#~ msgid "Last Modified on"
|
|
||||||
#~ msgstr "Última modificación en"
|
|
||||||
|
|
||||||
#~ msgid "Main Attachment"
|
|
||||||
#~ msgstr "Adjuntos principales"
|
|
||||||
|
|
||||||
#~ msgid "Owner"
|
|
||||||
#~ msgstr "Propietario"
|
|
||||||
|
|
||||||
#~ msgid "RMA Confirmation Email"
|
|
||||||
#~ msgstr "Correo de confirmación de RMA"
|
|
||||||
|
|
||||||
#~ msgid "RMA Manual Finalization"
|
|
||||||
#~ msgstr "Finalización del Manual RMA"
|
|
||||||
|
|
||||||
#~ msgid "RMA Receipt Confirmation Email"
|
|
||||||
#~ msgstr "Correo de confirmación de recepción de RMA"
|
|
||||||
|
|
||||||
#~ msgid "RMA draft notification Email"
|
|
||||||
#~ msgstr "Correo de notificación de borrador de RMA"
|
|
||||||
|
|
||||||
#~ msgid "Remaining delivered qty to done"
|
|
||||||
#~ msgstr "Ctd. entregada restante por realizar"
|
|
||||||
|
|
||||||
#~ msgid ""
|
|
||||||
#~ "The owner of records created upon receiving emails on this alias. If this "
|
|
||||||
#~ "field is not set the system will attempt to find the right owner based on "
|
|
||||||
#~ "the sender (From) address, or will use the Administrator account if no "
|
|
||||||
#~ "system user is found for that address."
|
|
||||||
#~ msgstr ""
|
|
||||||
#~ "El propietario de los registros creados al recibir correos electrónicos "
|
|
||||||
#~ "en este seudónimo. Si el campo no está establecido, el sistema tratará de "
|
|
||||||
#~ "encontrar el propietario adecuado basado en la dirección del emisor (De), "
|
|
||||||
#~ "o usará la cuenta de administrador si no se encuentra un usuario para esa "
|
|
||||||
#~ "dirección."
|
|
||||||
|
|
||||||
#~ msgid ""
|
|
||||||
#~ "When the RMA is receive, allow to finsish it manually choosing\n"
|
|
||||||
#~ " a finalization reason."
|
|
||||||
#~ msgstr ""
|
|
||||||
#~ "Cuando se recibe el RMA, permite finalizarlo manualmente eligiendo\n"
|
|
||||||
#~ " un motivo de finalización."
|
|
||||||
|
|
||||||
#~ msgid "{{(object.name or '')}}"
|
|
||||||
#~ msgstr "{{(object.name or '')}}"
|
|
||||||
|
|
||||||
#~ msgid ""
|
|
||||||
#~ "<div style=\"margin: 0px; padding: 0px;\">\n"
|
|
||||||
#~ " <p style=\"margin: 0px; padding: 0px; font-size: 13px;"
|
|
||||||
#~ "\">\n"
|
|
||||||
#~ " Dear\n"
|
|
||||||
#~ " <t t-out=\"object.partner_id.name\"/>\n"
|
|
||||||
#~ " <t t-if=\"object.partner_id.parent_id\">\n"
|
|
||||||
#~ " <t t-out=\"object.partner_id.parent_id.name\"/>\n"
|
|
||||||
#~ " </t>\n"
|
|
||||||
#~ " <br/>\n"
|
|
||||||
#~ " <br/>\n"
|
|
||||||
#~ " Here is the RMA\n"
|
|
||||||
#~ " <strong>\n"
|
|
||||||
#~ " <t t-out=\"object.name\"/>\n"
|
|
||||||
#~ " </strong>\n"
|
|
||||||
#~ " from\n"
|
|
||||||
#~ " <t t-out=\"object.company_id.name\"/>\n"
|
|
||||||
#~ " .\n"
|
|
||||||
#~ " <br/>\n"
|
|
||||||
#~ " <br/>\n"
|
|
||||||
#~ " Do not hesitate to contact us if you have any "
|
|
||||||
#~ "question.\n"
|
|
||||||
#~ " </p>\n"
|
|
||||||
#~ " </div>\n"
|
|
||||||
#~ " "
|
|
||||||
#~ msgstr ""
|
|
||||||
#~ "<div style=\"margin: 0px; padding: 0px;\">\n"
|
|
||||||
#~ " <p style=\"margin: 0px; padding: 0px; font-size: 13px;"
|
|
||||||
#~ "\">\n"
|
|
||||||
#~ " Estimado/a\n"
|
|
||||||
#~ " <t t-out=\"object.partner_id.name\"/>\n"
|
|
||||||
#~ " <t t-if=\"object.partner_id.parent_id\">\n"
|
|
||||||
#~ " <t t-out=\"object.partner_id.parent_id.name\"/>\n"
|
|
||||||
#~ " </t>\n"
|
|
||||||
#~ " <br/>\n"
|
|
||||||
#~ " <br/>\n"
|
|
||||||
#~ " Aquí tiene el RMA\n"
|
|
||||||
#~ " <strong>\n"
|
|
||||||
#~ " <t t-out=\"object.name\"/>\n"
|
|
||||||
#~ " </strong>\n"
|
|
||||||
#~ " desde\n"
|
|
||||||
#~ " <t t-out=\"object.company_id.name\"/>\n"
|
|
||||||
#~ " .\n"
|
|
||||||
#~ " <br/>\n"
|
|
||||||
#~ " <br/>\n"
|
|
||||||
#~ " No dude en ponerse en contacto con nosotros si tiene "
|
|
||||||
#~ "alguna pregunta.\n"
|
|
||||||
#~ " </p>\n"
|
|
||||||
#~ " </div>\n"
|
|
||||||
#~ " "
|
|
||||||
|
|
||||||
#~ msgid ""
|
|
||||||
#~ "<div style=\"margin: 0px; padding: 0px;\">\n"
|
|
||||||
#~ " <p style=\"margin: 0px; padding: 0px; font-size: 13px;"
|
|
||||||
#~ "\">\n"
|
|
||||||
#~ " Dear\n"
|
|
||||||
#~ " <t t-out=\"object.partner_id.name\"/>\n"
|
|
||||||
#~ " <t t-if=\"object.partner_id.parent_id\">\n"
|
|
||||||
#~ " <t t-out=\"object.partner_id.parent_id.name\"/>\n"
|
|
||||||
#~ " </t>\n"
|
|
||||||
#~ " <br/>\n"
|
|
||||||
#~ " <br/>\n"
|
|
||||||
#~ " The products for your RMA\n"
|
|
||||||
#~ " <strong>\n"
|
|
||||||
#~ " <t t-out=\"object.name\"/>\n"
|
|
||||||
#~ " </strong>\n"
|
|
||||||
#~ " from\n"
|
|
||||||
#~ " <t t-out=\"object.company_id.name\"/>\n"
|
|
||||||
#~ " have been received in our warehouse.\n"
|
|
||||||
#~ " <br/>\n"
|
|
||||||
#~ " <br/>\n"
|
|
||||||
#~ " Do not hesitate to contact us if you have any "
|
|
||||||
#~ "question.\n"
|
|
||||||
#~ " </p>\n"
|
|
||||||
#~ " </div>\n"
|
|
||||||
#~ " "
|
|
||||||
#~ msgstr ""
|
|
||||||
#~ "<div style=\"margin: 0px; padding: 0px;\">\n"
|
|
||||||
#~ " <p style=\"margin: 0px; padding: 0px; font-size: 13px;"
|
|
||||||
#~ "\">\n"
|
|
||||||
#~ " Estimado/a\n"
|
|
||||||
#~ " <t t-out=\"object.partner_id.name\"/>\n"
|
|
||||||
#~ " <t t-if=\"object.partner_id.parent_id\">\n"
|
|
||||||
#~ " <t t-out=\"object.partner_id.parent_id.name\"/>\n"
|
|
||||||
#~ " </t>\n"
|
|
||||||
#~ " <br/>\n"
|
|
||||||
#~ " <br/>\n"
|
|
||||||
#~ " Los productos de su RMA\n"
|
|
||||||
#~ " <strong>\n"
|
|
||||||
#~ " <t t-out=\"object.name\"/>\n"
|
|
||||||
#~ " </strong>\n"
|
|
||||||
#~ " desde\n"
|
|
||||||
#~ " <t t-out=\"object.company_id.name\"/>\n"
|
|
||||||
#~ " han sido recibidos en nuestro almacén.\n"
|
|
||||||
#~ " <br/>\n"
|
|
||||||
#~ " <br/>\n"
|
|
||||||
#~ " Póngase en contacto con nosotros para cualquier duda "
|
|
||||||
#~ "al respecto.\n"
|
|
||||||
#~ " </p>\n"
|
|
||||||
#~ " </div>\n"
|
|
||||||
#~ " "
|
|
||||||
|
|
||||||
#~ msgid ""
|
|
||||||
#~ "<div style=\"margin: 0px; padding: 0px;\">\n"
|
|
||||||
#~ " <p style=\"margin: 0px; padding: 0px; font-size: 13px;"
|
|
||||||
#~ "\">\n"
|
|
||||||
#~ " Dear\n"
|
|
||||||
#~ " <t t-out=\"object.partner_id.name\"/>\n"
|
|
||||||
#~ " <t t-if=\"object.partner_id.parent_id\">\n"
|
|
||||||
#~ " <t t-out=\"object.partner_id.parent_id.name\"/>\n"
|
|
||||||
#~ " </t>\n"
|
|
||||||
#~ " <br/>\n"
|
|
||||||
#~ " <br/>\n"
|
|
||||||
#~ " You've succesfully placed your RMA\n"
|
|
||||||
#~ " <strong>\n"
|
|
||||||
#~ " <t t-out=\"object.name\"/>\n"
|
|
||||||
#~ " </strong>\n"
|
|
||||||
#~ " on\n"
|
|
||||||
#~ " <t t-out=\"object.company_id.name\"/>\n"
|
|
||||||
#~ " . Our team will check it and will validate it as soon "
|
|
||||||
#~ "as possible.\n"
|
|
||||||
#~ " <br/>\n"
|
|
||||||
#~ " <br/>\n"
|
|
||||||
#~ " Do not hesitate to contact us if you have any "
|
|
||||||
#~ "question.\n"
|
|
||||||
#~ " </p>\n"
|
|
||||||
#~ " </div>\n"
|
|
||||||
#~ " "
|
|
||||||
#~ msgstr ""
|
|
||||||
#~ "<div style=\"margin: 0px; padding: 0px;\">\n"
|
|
||||||
#~ " <p style=\"margin: 0px; padding: 0px; font-size: 13px;"
|
|
||||||
#~ "\">\n"
|
|
||||||
#~ " Estimado/a\n"
|
|
||||||
#~ " <t t-out=\"object.partner_id.name\"/>\n"
|
|
||||||
#~ " <t t-if=\"object.partner_id.parent_id\">\n"
|
|
||||||
#~ " <t t-out=\"object.partner_id.parent_id.name\"/>\n"
|
|
||||||
#~ " </t>\n"
|
|
||||||
#~ " <br/>\n"
|
|
||||||
#~ " <br/>\n"
|
|
||||||
#~ " Ha solicitado con éxito su RMA\n"
|
|
||||||
#~ " <strong>\n"
|
|
||||||
#~ " <t t-out=\"object.name\"/>\n"
|
|
||||||
#~ " </strong>\n"
|
|
||||||
#~ " en\n"
|
|
||||||
#~ " <t t-out=\"object.company_id.name\"/>\n"
|
|
||||||
#~ " . Nuestro equipo la comprobará y validará tan pronto "
|
|
||||||
#~ "como sea posible.\n"
|
|
||||||
#~ " <br/>\n"
|
|
||||||
#~ " <br/>\n"
|
|
||||||
#~ " Póngase en contacto con nosotros para cualquier duda "
|
|
||||||
#~ "al respecto.\n"
|
|
||||||
#~ " </p>\n"
|
|
||||||
#~ " </div>\n"
|
|
||||||
#~ " "
|
|
||||||
|
|
||||||
#~ msgid ""
|
|
||||||
#~ "<span class=\"badge badge-danger label-text-align\"><i class=\"fa fa-fw "
|
|
||||||
#~ "fa-times\"/> Cancelled</span>"
|
|
||||||
#~ msgstr ""
|
|
||||||
#~ "<span class=\"badge badge-danger label-text-align\"><i class=\"fa fa-fw "
|
|
||||||
#~ "fa-times\"/>Cancelado</span>"
|
|
||||||
|
|
||||||
#~ msgid ""
|
|
||||||
#~ "<span class=\"badge badge-info label-text-align\"><i class=\"fa fa-fw fa-"
|
|
||||||
#~ "clock-o\"/> Preparation</span>"
|
|
||||||
#~ msgstr ""
|
|
||||||
#~ "<span class=\"badge badge-info label-text-align\"><i class=\"fa fa-fw fa-"
|
|
||||||
#~ "clock-o\"/>Preparación</span>"
|
|
||||||
|
|
||||||
#~ msgid ""
|
|
||||||
#~ "<span class=\"badge badge-success label-text-align\"><i class=\"fa fa-fw "
|
|
||||||
#~ "fa-truck\"/> Shipped</span>"
|
|
||||||
#~ msgstr ""
|
|
||||||
#~ "<span class=\"badge badge-success label-text-align\"><i class=\"fa fa-fw "
|
|
||||||
#~ "fa-truck\"/> Enviado</span>"
|
|
||||||
|
|
||||||
#~ msgid ""
|
|
||||||
#~ "<span class=\"badge badge-warning label-text-align\"><i class=\"fa fa-fw "
|
|
||||||
#~ "fa-clock-o\"/> Partially Available</span>"
|
|
||||||
#~ msgstr ""
|
|
||||||
#~ "<span class=\"badge badge-warning label-text-align\"><i class=\"fa fa-fw "
|
|
||||||
#~ "fa-clock-o\"/>Disponible parcialmente</span>"
|
|
||||||
|
|
||||||
#~ msgid "Number of messages which requires an action"
|
|
||||||
#~ msgstr "Número de mensajes que requieren una acción"
|
|
||||||
|
|
||||||
#~ msgid "Number of unread messages"
|
|
||||||
#~ msgstr "Número de mensajes no leidos"
|
|
||||||
|
|
||||||
#~ msgid "Unread Messages"
|
|
||||||
#~ msgstr "Mensajes por leer"
|
|
||||||
|
|
||||||
#~ msgid "Unread Messages Counter"
|
|
||||||
#~ msgstr "Contador de mensajes sin leer"
|
|
||||||
|
|
||||||
#~ msgid "Users"
|
|
||||||
#~ msgstr "Usuarios"
|
|
||||||
|
|
||||||
#~ msgid "Followers (Channels)"
|
|
||||||
#~ msgstr "Seguidores (Canales)"
|
|
||||||
|
|||||||
@@ -2341,48 +2341,3 @@ msgid ""
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
"{{object.company_id.name}} Votre RMA a été crée avec succès(Ref {{object."
|
"{{object.company_id.name}} Votre RMA a été crée avec succès(Ref {{object."
|
||||||
"name or 'n/a' }})"
|
"name or 'n/a' }})"
|
||||||
|
|
||||||
#~ msgid ""
|
|
||||||
#~ "<span class=\"fa fa-lg fa-building-o\" title=\"Values set here are "
|
|
||||||
#~ "company-specific.\" groups=\"base.group_multi_company\"/>"
|
|
||||||
#~ msgstr ""
|
|
||||||
#~ "<span class=\"fa fa-lg fa-building-o\" title=\"Les valeurs définies ici "
|
|
||||||
#~ "sont propres à l'entreprise.\" groups=\"base.group_multi_company\"/>"
|
|
||||||
|
|
||||||
#~ msgid "Alias domain"
|
|
||||||
#~ msgstr "Domaine de l'alias"
|
|
||||||
|
|
||||||
#~ msgid "Delivered Qty Done"
|
|
||||||
#~ msgstr "Quantité livrée Terminé"
|
|
||||||
|
|
||||||
#~ msgid "Last Modified on"
|
|
||||||
#~ msgstr "Dernière Modification le"
|
|
||||||
|
|
||||||
#~ msgid "Main Attachment"
|
|
||||||
#~ msgstr "Pièce jointe principale"
|
|
||||||
|
|
||||||
#~ msgid "Owner"
|
|
||||||
#~ msgstr "Propriétaire"
|
|
||||||
|
|
||||||
#~ msgid "RMA Confirmation Email"
|
|
||||||
#~ msgstr "Email de confirmation RMA"
|
|
||||||
|
|
||||||
#~ msgid "RMA Manual Finalization"
|
|
||||||
#~ msgstr "Clôture manuelle RMA"
|
|
||||||
|
|
||||||
#~ msgid "RMA Receipt Confirmation Email"
|
|
||||||
#~ msgstr "Email de confirmation de réception RMA"
|
|
||||||
|
|
||||||
#~ msgid "RMA draft notification Email"
|
|
||||||
#~ msgstr "Email de notification brouillon RMA"
|
|
||||||
|
|
||||||
#~ msgid "Remaining delivered qty to done"
|
|
||||||
#~ msgstr "Qté restante à livrer avant de terminer"
|
|
||||||
|
|
||||||
#~ msgid ""
|
|
||||||
#~ "When the RMA is receive, allow to finsish it manually choosing\n"
|
|
||||||
#~ " a finalization reason."
|
|
||||||
#~ msgstr ""
|
|
||||||
#~ "Quand une RMA est reçue, permet de la terminer manuellement en "
|
|
||||||
#~ "sélectionnant\n"
|
|
||||||
#~ " comme motif de clôture."
|
|
||||||
|
|||||||
294
rma/i18n/it.po
294
rma/i18n/it.po
@@ -2351,297 +2351,3 @@ msgid ""
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
"{{object.company_id.name}} La vostra RMA è stata creata con successo (rif. "
|
"{{object.company_id.name}} La vostra RMA è stata creata con successo (rif. "
|
||||||
"{{object.name or 'n/a' }})"
|
"{{object.name or 'n/a' }})"
|
||||||
|
|
||||||
#~ msgid "SMS Delivery error"
|
|
||||||
#~ msgstr "Errore consegna SMS"
|
|
||||||
|
|
||||||
#~ msgid ""
|
|
||||||
#~ "<span class=\"fa fa-lg fa-building-o\" title=\"Values set here are "
|
|
||||||
#~ "company-specific.\" groups=\"base.group_multi_company\"/>"
|
|
||||||
#~ msgstr ""
|
|
||||||
#~ "<span class=\"fa fa-lg fa-building-o\" title=\"I valori impostati qui "
|
|
||||||
#~ "sono specifici per azienda.\" groups=\"base.group_multi_company\"/>"
|
|
||||||
|
|
||||||
#~ msgid "Alias domain"
|
|
||||||
#~ msgstr "Dominio alias"
|
|
||||||
|
|
||||||
#~ msgid "Delivered Qty Done"
|
|
||||||
#~ msgstr "Quantità consegnata fatta"
|
|
||||||
|
|
||||||
#~ msgid "Last Modified on"
|
|
||||||
#~ msgstr "Ultima modifica il"
|
|
||||||
|
|
||||||
#~ msgid "Main Attachment"
|
|
||||||
#~ msgstr "Allegato principale"
|
|
||||||
|
|
||||||
#~ msgid "Owner"
|
|
||||||
#~ msgstr "Proprietario"
|
|
||||||
|
|
||||||
#~ msgid "RMA Confirmation Email"
|
|
||||||
#~ msgstr "Email di Conferma RMA"
|
|
||||||
|
|
||||||
#~ msgid "RMA Manual Finalization"
|
|
||||||
#~ msgstr "Chiusura manuale RMA"
|
|
||||||
|
|
||||||
#~ msgid "RMA Receipt Confirmation Email"
|
|
||||||
#~ msgstr "E-mail di conferma ricevuta RMA"
|
|
||||||
|
|
||||||
#~ msgid "RMA draft notification Email"
|
|
||||||
#~ msgstr "E-mail di notifica bozza RMA"
|
|
||||||
|
|
||||||
#~ msgid "Remaining delivered qty to done"
|
|
||||||
#~ msgstr "Quantità consegnata rimanente da fare"
|
|
||||||
|
|
||||||
#~ msgid ""
|
|
||||||
#~ "The owner of records created upon receiving emails on this alias. If this "
|
|
||||||
#~ "field is not set the system will attempt to find the right owner based on "
|
|
||||||
#~ "the sender (From) address, or will use the Administrator account if no "
|
|
||||||
#~ "system user is found for that address."
|
|
||||||
#~ msgstr ""
|
|
||||||
#~ "Il proprietario dei record creati dopo aver ricevuto email con questo "
|
|
||||||
#~ "alias. Se questo campo non è impostato il sistema tenterà di trovare il "
|
|
||||||
#~ "proprietario corretto in base all'indirizzo del mittente (Da) oppure "
|
|
||||||
#~ "utilizzerà l'account amministratore se non viene trovato alcun utente di "
|
|
||||||
#~ "sistema per quell'indirizzo."
|
|
||||||
|
|
||||||
#~ msgid ""
|
|
||||||
#~ "When the RMA is receive, allow to finsish it manually choosing\n"
|
|
||||||
#~ " a finalization reason."
|
|
||||||
#~ msgstr ""
|
|
||||||
#~ "Quando si riceve l'RMA, permetti di chiuderlo manualmente scegliendo\n"
|
|
||||||
#~ " un motivo per la chiusura."
|
|
||||||
|
|
||||||
#~ msgid "{{(object.name or '')}}"
|
|
||||||
#~ msgstr "{{(object.name or '')}}"
|
|
||||||
|
|
||||||
#~ msgid "${(object.name or '')}"
|
|
||||||
#~ msgstr "${(object.name or '')}"
|
|
||||||
|
|
||||||
#~ msgid "${object.company_id.name} RMA (Ref ${object.name or 'n/a' })"
|
|
||||||
#~ msgstr "${object.company_id.name} RMA (Rif ${object.name or 'n/a' })"
|
|
||||||
|
|
||||||
#~ msgid ""
|
|
||||||
#~ "${object.company_id.name} RMA (Ref ${object.name or 'n/a' }) products "
|
|
||||||
#~ "received"
|
|
||||||
#~ msgstr ""
|
|
||||||
#~ "${object.company_id.name} RMA (Ref ${object.name or 'n/a' }) prodotti "
|
|
||||||
#~ "ricevuti"
|
|
||||||
|
|
||||||
#~ msgid ""
|
|
||||||
#~ "${object.company_id.name} Your RMA has been succesfully created (Ref "
|
|
||||||
#~ "${object.name or 'n/a' })"
|
|
||||||
#~ msgstr ""
|
|
||||||
#~ "${object.company_id.name} Il tuo RMA è stato creato correttamente (Ref "
|
|
||||||
#~ "${object.name or 'n/a' })"
|
|
||||||
|
|
||||||
#, python-format
|
|
||||||
#~ msgid "<b>E-mail subject:</b> %s<br/><br/><b>E-mail body:</b><br/>%s"
|
|
||||||
#~ msgstr "<b>Soggetto E-mail:</b> %s<br/><br/><b>Corpo E-mail:</b><br/>%s"
|
|
||||||
|
|
||||||
#~ msgid ""
|
|
||||||
#~ "<div style=\"margin: 0px; padding: 0px;\">\n"
|
|
||||||
#~ " <p style=\"margin: 0px; padding: 0px; font-size: 13px;"
|
|
||||||
#~ "\">\n"
|
|
||||||
#~ " Dear ${object.partner_id.name}\n"
|
|
||||||
#~ " % if object.partner_id.parent_id:\n"
|
|
||||||
#~ " (${object.partner_id.parent_id.name})\n"
|
|
||||||
#~ " % endif\n"
|
|
||||||
#~ " <br/><br/>\n"
|
|
||||||
#~ " Here is the RMA <strong>${object.name}</strong> from ${object."
|
|
||||||
#~ "company_id.name}.\n"
|
|
||||||
#~ " <br/><br/>\n"
|
|
||||||
#~ " Do not hesitate to contact us if you have any question.\n"
|
|
||||||
#~ "</p>\n"
|
|
||||||
#~ " </div>\n"
|
|
||||||
#~ " "
|
|
||||||
#~ msgstr ""
|
|
||||||
#~ "<div style=\"margin: 0px; padding: 0px;\">\n"
|
|
||||||
#~ " <p style=\"margin: 0px; padding: 0px; font-size: 13px;"
|
|
||||||
#~ "\">\n"
|
|
||||||
#~ " Gentile ${object.partner_id.name}\n"
|
|
||||||
#~ " % if object.partner_id.parent_id:\n"
|
|
||||||
#~ " (${object.partner_id.parent_id.name})\n"
|
|
||||||
#~ " % endif\n"
|
|
||||||
#~ " <br/><br/>\n"
|
|
||||||
#~ " Di seguito l'RMA <strong>${object.name}</strong> da ${object."
|
|
||||||
#~ "company_id.name}.\n"
|
|
||||||
#~ " <br/><br/>\n"
|
|
||||||
#~ " Non esiti a contattarci per qualsiasi domanda.\n"
|
|
||||||
#~ "</p>\n"
|
|
||||||
#~ " </div>\n"
|
|
||||||
#~ " "
|
|
||||||
|
|
||||||
#~ msgid ""
|
|
||||||
#~ "<div style=\"margin: 0px; padding: 0px;\">\n"
|
|
||||||
#~ "<p style=\"margin: 0px; padding: 0px; font-size: 13px;\">\n"
|
|
||||||
#~ " Dear ${object.partner_id.name}\n"
|
|
||||||
#~ " % if object.partner_id.parent_id:\n"
|
|
||||||
#~ " (${object.partner_id.parent_id.name})\n"
|
|
||||||
#~ " % endif\n"
|
|
||||||
#~ " <br/><br/>\n"
|
|
||||||
#~ " The products for your RMA <strong>${object.name}</strong>\n"
|
|
||||||
#~ " from ${object.company_id.name} have been received in our warehouse.\n"
|
|
||||||
#~ " <br/><br/>\n"
|
|
||||||
#~ " Do not hesitate to contact us if you have any question.\n"
|
|
||||||
#~ "</p>\n"
|
|
||||||
#~ "</div>\n"
|
|
||||||
#~ " "
|
|
||||||
#~ msgstr ""
|
|
||||||
#~ "<div style=\"margin: 0px; padding: 0px;\">\n"
|
|
||||||
#~ "<p style=\"margin: 0px; padding: 0px; font-size: 13px;\">\n"
|
|
||||||
#~ " Gentile ${object.partner_id.name}\n"
|
|
||||||
#~ " % if object.partner_id.parent_id:\n"
|
|
||||||
#~ " (${object.partner_id.parent_id.name})\n"
|
|
||||||
#~ " % endif\n"
|
|
||||||
#~ " <br/><br/>\n"
|
|
||||||
#~ " I prodotti del suo RMA <strong>${object.name}</strong>\n"
|
|
||||||
#~ " da ${object.company_id.name} sono stati ricevuti nel nostro "
|
|
||||||
#~ "magazzino.\n"
|
|
||||||
#~ " <br/><br/>\n"
|
|
||||||
#~ " Non esiti a contattarci per qualsiasi domanda.\n"
|
|
||||||
#~ "</p>\n"
|
|
||||||
#~ "</div>\n"
|
|
||||||
#~ " "
|
|
||||||
|
|
||||||
#~ msgid ""
|
|
||||||
#~ "<div style=\"margin: 0px; padding: 0px;\">\n"
|
|
||||||
#~ "<p style=\"margin: 0px; padding: 0px; font-size: 13px;\">\n"
|
|
||||||
#~ " Dear ${object.partner_id.name}\n"
|
|
||||||
#~ " % if object.partner_id.parent_id:\n"
|
|
||||||
#~ " (${object.partner_id.parent_id.name})\n"
|
|
||||||
#~ " % endif\n"
|
|
||||||
#~ " <br/><br/>\n"
|
|
||||||
#~ " You've succesfully placed your RMA <strong>${object.name}</strong>\n"
|
|
||||||
#~ " on ${object.company_id.name}. Our team will check it and will "
|
|
||||||
#~ "validate\n"
|
|
||||||
#~ " it as soon as possible.\n"
|
|
||||||
#~ " <br/><br/>\n"
|
|
||||||
#~ " Do not hesitate to contact us if you have any question.\n"
|
|
||||||
#~ "</p>\n"
|
|
||||||
#~ "</div>\n"
|
|
||||||
#~ " "
|
|
||||||
#~ msgstr ""
|
|
||||||
#~ "<div style=\"margin: 0px; padding: 0px;\">\n"
|
|
||||||
#~ "<p style=\"margin: 0px; padding: 0px; font-size: 13px;\">\n"
|
|
||||||
#~ " Gentile ${object.partner_id.name}\n"
|
|
||||||
#~ " % if object.partner_id.parent_id:\n"
|
|
||||||
#~ " (${object.partner_id.parent_id.name})\n"
|
|
||||||
#~ " % endif\n"
|
|
||||||
#~ " <br/><br/>\n"
|
|
||||||
#~ " ha inserito con successo il suo RMA <strong>${object.name}</strong>\n"
|
|
||||||
#~ " per ${object.company_id.name}. Il nostro team lo verificherà \n"
|
|
||||||
#~ " il prima possibile.\n"
|
|
||||||
#~ " <br/><br/>\n"
|
|
||||||
#~ " Non esiti a contattarci per qualsiasi domanda.\n"
|
|
||||||
#~ "</p>\n"
|
|
||||||
#~ "</div>\n"
|
|
||||||
#~ " "
|
|
||||||
|
|
||||||
#~ msgid ""
|
|
||||||
#~ "<span class=\"badge badge-danger label-text-align\"><i class=\"fa fa-fw "
|
|
||||||
#~ "fa-times\"/> Cancelled</span>"
|
|
||||||
#~ msgstr ""
|
|
||||||
#~ "<span class=\"badge badge-danger label-text-align\"><i class=\"fa fa-fw "
|
|
||||||
#~ "fa-times\"/> Cancellato</span>"
|
|
||||||
|
|
||||||
#~ msgid ""
|
|
||||||
#~ "<span class=\"badge badge-info label-text-align\"><i class=\"fa fa-fw fa-"
|
|
||||||
#~ "clock-o\"/> Preparation</span>"
|
|
||||||
#~ msgstr ""
|
|
||||||
#~ "<span class=\"badge badge-info label-text-align\"><i class=\"fa fa-fw fa-"
|
|
||||||
#~ "clock-o\"/> Preparazione</span>"
|
|
||||||
|
|
||||||
#~ msgid ""
|
|
||||||
#~ "<span class=\"badge badge-success label-text-align\"><i class=\"fa fa-fw "
|
|
||||||
#~ "fa-truck\"/> Shipped</span>"
|
|
||||||
#~ msgstr ""
|
|
||||||
#~ "<span class=\"badge badge-success label-text-align\"><i class=\"fa fa-fw "
|
|
||||||
#~ "fa-truck\"/> Spedito</span>"
|
|
||||||
|
|
||||||
#~ msgid ""
|
|
||||||
#~ "<span class=\"badge badge-warning label-text-align\"><i class=\"fa fa-fw "
|
|
||||||
#~ "fa-clock-o\"/> Partially Available</span>"
|
|
||||||
#~ msgstr ""
|
|
||||||
#~ "<span class=\"badge badge-warning label-text-align\"><i class=\"fa fa-fw "
|
|
||||||
#~ "fa-clock-o\"/> Parzialmente disponibile</span>"
|
|
||||||
|
|
||||||
#~ msgid "Delivered qty"
|
|
||||||
#~ msgstr "Quantità Consegnata"
|
|
||||||
|
|
||||||
#~ msgid "Delivered qty done"
|
|
||||||
#~ msgstr "Quantità consegnata fatta"
|
|
||||||
|
|
||||||
#~ msgid "Followers (Channels)"
|
|
||||||
#~ msgstr "Seguito da (canali)"
|
|
||||||
|
|
||||||
#~ msgid "Number of messages which requires an action"
|
|
||||||
#~ msgstr "Numero di messaggi che richiedono un'azione"
|
|
||||||
|
|
||||||
#~ msgid "Number of unread messages"
|
|
||||||
#~ msgstr "Numero di messaggi non letti"
|
|
||||||
|
|
||||||
#, python-format
|
|
||||||
#~ msgid ""
|
|
||||||
#~ "Quantity to extract cannot be greater than remaining delivery quantity "
|
|
||||||
#~ "(%s %s)"
|
|
||||||
#~ msgstr ""
|
|
||||||
#~ "La quantità da prelevare non può essere superiore alla quantità di "
|
|
||||||
#~ "consegna rimanente (%s %s)"
|
|
||||||
|
|
||||||
#~ msgid "Refund line"
|
|
||||||
#~ msgstr "Riga rimborso"
|
|
||||||
|
|
||||||
#, python-format
|
|
||||||
#~ msgid ""
|
|
||||||
#~ "Replacement: Move <a href=\"#\" data-oe-model=\"stock.move\" data-oe-"
|
|
||||||
#~ "id=\"%d\">%s</a> (Picking <a href=\"#\" data-oe-model=\"stock.picking\" "
|
|
||||||
#~ "data-oe-id=\"%d\">%s</a>) has been created."
|
|
||||||
#~ msgstr ""
|
|
||||||
#~ "Sostituzione: Il trasferimento <a href=\"#\" data-oe-model=\"stock.move\" "
|
|
||||||
#~ "data-oe-id=\"%d\">%s</a> (Picking <a href=\"#\" data-oe-model=\"stock."
|
|
||||||
#~ "picking\" data-oe-id=\"%d\">%s</a>) è stato creato."
|
|
||||||
|
|
||||||
#, python-format
|
|
||||||
#~ msgid ""
|
|
||||||
#~ "Replacement:<br/>Product <a href=\"#\" data-oe-model=\"product.product\" "
|
|
||||||
#~ "data-oe-id=\"%d\">%s</a><br/>Quantity %f %s<br/>This replacement did not "
|
|
||||||
#~ "create a new move, but one of the previously created moves was updated "
|
|
||||||
#~ "with this data."
|
|
||||||
#~ msgstr ""
|
|
||||||
#~ "Sostituzione:<br/>Il prodotto<a href=\"#\" data-oe-model=\"product."
|
|
||||||
#~ "product\" data-oe-id=\"%d\">%s</a><br/>Quantità%f %s<br/>Questo prodotto "
|
|
||||||
#~ "non ha generato un nuovo trasferimento, ma uno dei trasferimenti già "
|
|
||||||
#~ "creati è stato aggiornato con questi dati."
|
|
||||||
|
|
||||||
#, python-format
|
|
||||||
#~ msgid ""
|
|
||||||
#~ "Return: <a href=\"#\" data-oe-model=\"stock.picking\" data-oe-"
|
|
||||||
#~ "id=\"%d\">%s</a> has been created."
|
|
||||||
#~ msgstr ""
|
|
||||||
#~ "Reso: <a href=\"#\" data-oe-model=\"stock.picking\" data-oe-id=\"%d\">%s</"
|
|
||||||
#~ "a> è stato creato."
|
|
||||||
|
|
||||||
#, python-format
|
|
||||||
#~ msgid ""
|
|
||||||
#~ "Split: <a href=\"#\" data-oe-model=\"rma\" data-oe-id=\"%d\">%s</a> has "
|
|
||||||
#~ "been created."
|
|
||||||
#~ msgstr ""
|
|
||||||
#~ "Divisione: <a href=\"#\" data-oe-model=\"rma\" data-oe-id=\"%d\">%s</a> è "
|
|
||||||
#~ "stato creato."
|
|
||||||
|
|
||||||
#, python-format
|
|
||||||
#~ msgid ""
|
|
||||||
#~ "The quantity done for the product '%s' must be equal to its initial "
|
|
||||||
#~ "demand because the stock move is linked to an RMA (%s)."
|
|
||||||
#~ msgstr ""
|
|
||||||
#~ "La quantità completata per il prodotto '%s' deve essere uguale alla "
|
|
||||||
#~ "quantità iniziale perchè il movimento è legato ad un RMA (%s)."
|
|
||||||
|
|
||||||
#~ msgid "Unread Messages"
|
|
||||||
#~ msgstr "Messaggi non letti"
|
|
||||||
|
|
||||||
#~ msgid "Unread Messages Counter"
|
|
||||||
#~ msgstr "Numero messaggi non letti"
|
|
||||||
|
|
||||||
#~ msgid "Users"
|
|
||||||
#~ msgstr "Utenti"
|
|
||||||
|
|||||||
152
rma/i18n/pt.po
152
rma/i18n/pt.po
@@ -2205,155 +2205,3 @@ msgid ""
|
|||||||
"{{object.company_id.name}} Your RMA has been succesfully created (Ref "
|
"{{object.company_id.name}} Your RMA has been succesfully created (Ref "
|
||||||
"{{object.name or 'n/a' }})"
|
"{{object.name or 'n/a' }})"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#~ msgid ""
|
|
||||||
#~ "<span class=\"fa fa-lg fa-building-o\" title=\"Values set here are "
|
|
||||||
#~ "company-specific.\" groups=\"base.group_multi_company\"/>"
|
|
||||||
#~ msgstr ""
|
|
||||||
#~ "<span class=\"fa fa-lg fa-building-o\" title=\"Estes valores são "
|
|
||||||
#~ "específicos por empresa.\" groups=\"base.group_multi_company\"/>"
|
|
||||||
|
|
||||||
#~ msgid "Alias domain"
|
|
||||||
#~ msgstr "Domínio do Alias"
|
|
||||||
|
|
||||||
#~ msgid "Last Modified on"
|
|
||||||
#~ msgstr "Última Modificação Em"
|
|
||||||
|
|
||||||
#~ msgid "Main Attachment"
|
|
||||||
#~ msgstr "Anexo Principal"
|
|
||||||
|
|
||||||
#~ msgid "Owner"
|
|
||||||
#~ msgstr "Proprietário"
|
|
||||||
|
|
||||||
#~ msgid "RMA Confirmation Email"
|
|
||||||
#~ msgstr "E-mail de Confirmação da RMA"
|
|
||||||
|
|
||||||
#~ msgid "Remaining delivered qty to done"
|
|
||||||
#~ msgstr "Qtd. restante entregue a fazer"
|
|
||||||
|
|
||||||
#~ msgid ""
|
|
||||||
#~ "The owner of records created upon receiving emails on this alias. If this "
|
|
||||||
#~ "field is not set the system will attempt to find the right owner based on "
|
|
||||||
#~ "the sender (From) address, or will use the Administrator account if no "
|
|
||||||
#~ "system user is found for that address."
|
|
||||||
#~ msgstr ""
|
|
||||||
#~ "O proprietário dos registos criados ao receber emails nesse alias. Se "
|
|
||||||
#~ "esse campo não estiver definido, o sistema tentará encontrar o "
|
|
||||||
#~ "proprietário certo com base no endereço do remetente (De) ou usará a "
|
|
||||||
#~ "conta de Administrador se nenhum utilizador do sistema for encontrado "
|
|
||||||
#~ "para esse endereço."
|
|
||||||
|
|
||||||
#~ msgid "${(object.name or '')}"
|
|
||||||
#~ msgstr "${(object.name or '')}"
|
|
||||||
|
|
||||||
#~ msgid "${object.company_id.name} RMA (Ref ${object.name or 'n/a' })"
|
|
||||||
#~ msgstr "${object.company_id.name} RMA (Refª ${object.name or 'n/a' })"
|
|
||||||
|
|
||||||
#~ msgid ""
|
|
||||||
#~ "<span class=\"badge badge-danger label-text-align\"><i class=\"fa fa-fw "
|
|
||||||
#~ "fa-times\"/> Cancelled</span>"
|
|
||||||
#~ msgstr ""
|
|
||||||
#~ "<span class=\"badge badge-danger label-text-align\"><i class=\"fa fa-fw "
|
|
||||||
#~ "fa-times\"/> Cancelado</span>"
|
|
||||||
|
|
||||||
#~ msgid ""
|
|
||||||
#~ "<span class=\"badge badge-info label-text-align\"><i class=\"fa fa-fw fa-"
|
|
||||||
#~ "clock-o\"/> Preparation</span>"
|
|
||||||
#~ msgstr ""
|
|
||||||
#~ "<span class=\"badge badge-info label-text-align\"><i class=\"fa fa-fw fa-"
|
|
||||||
#~ "clock-o\"/> Preparação</span>"
|
|
||||||
|
|
||||||
#~ msgid ""
|
|
||||||
#~ "<span class=\"badge badge-success label-text-align\"><i class=\"fa fa-fw "
|
|
||||||
#~ "fa-truck\"/> Shipped</span>"
|
|
||||||
#~ msgstr ""
|
|
||||||
#~ "<span class=\"badge badge-success label-text-align\"><i class=\"fa fa-fw "
|
|
||||||
#~ "fa-truck\"/> Expedido</span>"
|
|
||||||
|
|
||||||
#~ msgid ""
|
|
||||||
#~ "<span class=\"badge badge-warning label-text-align\"><i class=\"fa fa-fw "
|
|
||||||
#~ "fa-clock-o\"/> Partially Available</span>"
|
|
||||||
#~ msgstr ""
|
|
||||||
#~ "<span class=\"badge badge-warning label-text-align\"><i class=\"fa fa-fw "
|
|
||||||
#~ "fa-clock-o\"/> Parcialmente Disponível</span>"
|
|
||||||
|
|
||||||
#~ msgid "Delivered qty"
|
|
||||||
#~ msgstr "Quantidade Enviada"
|
|
||||||
|
|
||||||
#~ msgid "Delivered qty done"
|
|
||||||
#~ msgstr "Quantidade Envidada Concluída"
|
|
||||||
|
|
||||||
#~ msgid "Followers (Channels)"
|
|
||||||
#~ msgstr "Seguidores (Canais)"
|
|
||||||
|
|
||||||
#~ msgid "Number of messages which requires an action"
|
|
||||||
#~ msgstr "Número de Mensagens que Requerem a sua Atenção"
|
|
||||||
|
|
||||||
#~ msgid "Number of unread messages"
|
|
||||||
#~ msgstr "Número de Mensagens Não Lidas"
|
|
||||||
|
|
||||||
#, python-format
|
|
||||||
#~ msgid ""
|
|
||||||
#~ "Quantity to extract cannot be greater than remaining delivery quantity "
|
|
||||||
#~ "(%s %s)"
|
|
||||||
#~ msgstr ""
|
|
||||||
#~ "A quantidade a extrair não pode ser maior do que a quantidade restante da "
|
|
||||||
#~ "entrega (%s %s)"
|
|
||||||
|
|
||||||
#~ msgid "Refund line"
|
|
||||||
#~ msgstr "Linha de reembolso"
|
|
||||||
|
|
||||||
#, python-format
|
|
||||||
#~ msgid ""
|
|
||||||
#~ "Replacement: Move <a href=\"#\" data-oe-model=\"stock.move\" data-oe-"
|
|
||||||
#~ "id=\"%d\">%s</a> (Picking <a href=\"#\" data-oe-model=\"stock.picking\" "
|
|
||||||
#~ "data-oe-id=\"%d\">%s</a>) has been created."
|
|
||||||
#~ msgstr ""
|
|
||||||
#~ "Substituição: Movimentação <a href=\"#\" data-oe-model=\"stock.move\" "
|
|
||||||
#~ "data-oe-id=\"%d\">%s</a> (A Coleta <a href=\"#\" data-oe-model=\"stock."
|
|
||||||
#~ "picking\" data-oe-id=\"%d\">%s</a> foi criada."
|
|
||||||
|
|
||||||
#, python-format
|
|
||||||
#~ msgid ""
|
|
||||||
#~ "Replacement:<br/>Product <a href=\"#\" data-oe-model=\"product.product\" "
|
|
||||||
#~ "data-oe-id=\"%d\">%s</a><br/>Quantity %f %s<br/>This replacement did not "
|
|
||||||
#~ "create a new move, but one of the previously created moves was updated "
|
|
||||||
#~ "with this data."
|
|
||||||
#~ msgstr ""
|
|
||||||
#~ "Substituição:<br/> Produto <a href=\"#\" data-oe-model=\"product."
|
|
||||||
#~ "product\" data-oe-id=\"%d\">%s</a><br/> Quantidade %f%s<br/> Essa "
|
|
||||||
#~ "substituição não criou uma nova movimentação, mas uma das movimentos "
|
|
||||||
#~ "criadas anteriormente foi atualizada com esses dados."
|
|
||||||
|
|
||||||
#, python-format
|
|
||||||
#~ msgid ""
|
|
||||||
#~ "Return: <a href=\"#\" data-oe-model=\"stock.picking\" data-oe-"
|
|
||||||
#~ "id=\"%d\">%s</a> has been created."
|
|
||||||
#~ msgstr ""
|
|
||||||
#~ "Devolução: <a href=\"#\" data-oe-model=\"stock.picking\" data-oe-"
|
|
||||||
#~ "id=\"%d\">%s</a> foi criada."
|
|
||||||
|
|
||||||
#, python-format
|
|
||||||
#~ msgid ""
|
|
||||||
#~ "Split: <a href=\"#\" data-oe-model=\"rma\" data-oe-id=\"%d\">%s</a> has "
|
|
||||||
#~ "been created."
|
|
||||||
#~ msgstr ""
|
|
||||||
#~ "Divisão: <a href=\"#\" data-oe-model=\"rma\" data-oe-id=\"%d\">%s</a> foi "
|
|
||||||
#~ "criada."
|
|
||||||
|
|
||||||
#, python-format
|
|
||||||
#~ msgid ""
|
|
||||||
#~ "The quantity done for the product '%s' must be equal to its initial "
|
|
||||||
#~ "demand because the stock move is linked to an RMA (%s)."
|
|
||||||
#~ msgstr ""
|
|
||||||
#~ "A quantidade realizada para o produto '%s' deve ser igual à sua demanda "
|
|
||||||
#~ "inicial, porque a movimentação do stock está vinculada a uma RMA (%s)."
|
|
||||||
|
|
||||||
#~ msgid "Unread Messages"
|
|
||||||
#~ msgstr "Mensagens não lidas"
|
|
||||||
|
|
||||||
#~ msgid "Unread Messages Counter"
|
|
||||||
#~ msgstr "Contador de Mensagens Não Lidas"
|
|
||||||
|
|
||||||
#~ msgid "Users"
|
|
||||||
#~ msgstr "Utilizadores"
|
|
||||||
|
|||||||
@@ -2202,145 +2202,3 @@ msgid ""
|
|||||||
"{{object.company_id.name}} Your RMA has been succesfully created (Ref "
|
"{{object.company_id.name}} Your RMA has been succesfully created (Ref "
|
||||||
"{{object.name or 'n/a' }})"
|
"{{object.name or 'n/a' }})"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#~ msgid "Alias domain"
|
|
||||||
#~ msgstr "Domínio do Alias"
|
|
||||||
|
|
||||||
#~ msgid "Last Modified on"
|
|
||||||
#~ msgstr "Última Modificação Feita em"
|
|
||||||
|
|
||||||
#~ msgid "Main Attachment"
|
|
||||||
#~ msgstr "Anexo Principal"
|
|
||||||
|
|
||||||
#~ msgid "Owner"
|
|
||||||
#~ msgstr "Proprietário"
|
|
||||||
|
|
||||||
#~ msgid "Remaining delivered qty to done"
|
|
||||||
#~ msgstr "Quantidade restante entregue a concluir"
|
|
||||||
|
|
||||||
#~ msgid ""
|
|
||||||
#~ "The owner of records created upon receiving emails on this alias. If this "
|
|
||||||
#~ "field is not set the system will attempt to find the right owner based on "
|
|
||||||
#~ "the sender (From) address, or will use the Administrator account if no "
|
|
||||||
#~ "system user is found for that address."
|
|
||||||
#~ msgstr ""
|
|
||||||
#~ "O proprietário dos registros criados ao receber emails nesse alias. Se "
|
|
||||||
#~ "esse campo não estiver definido, o sistema tentará encontrar o "
|
|
||||||
#~ "proprietário certo com base no endereço do remetente (De) ou usará a "
|
|
||||||
#~ "conta de Administrador se nenhum usuário do sistema for encontrado para "
|
|
||||||
#~ "esse endereço."
|
|
||||||
|
|
||||||
#~ msgid "${(object.name or '')}"
|
|
||||||
#~ msgstr "${(object.name or '')}"
|
|
||||||
|
|
||||||
#~ msgid "${object.company_id.name} RMA (Ref ${object.name or 'n/a' })"
|
|
||||||
#~ msgstr "${object.company_id.name} RMA (Ref ${object.name or 'n/a' })"
|
|
||||||
|
|
||||||
#~ msgid ""
|
|
||||||
#~ "<span class=\"badge badge-danger label-text-align\"><i class=\"fa fa-fw "
|
|
||||||
#~ "fa-times\"/> Cancelled</span>"
|
|
||||||
#~ msgstr ""
|
|
||||||
#~ "<span class=\"badge badge-danger label-text-align\"><i class=\"fa fa-fw "
|
|
||||||
#~ "fa-times\"/> Cancelado</span>"
|
|
||||||
|
|
||||||
#~ msgid ""
|
|
||||||
#~ "<span class=\"badge badge-info label-text-align\"><i class=\"fa fa-fw fa-"
|
|
||||||
#~ "clock-o\"/> Preparation</span>"
|
|
||||||
#~ msgstr ""
|
|
||||||
#~ "<span class=\"badge badge-info label-text-align\"><i class=\"fa fa-fw fa-"
|
|
||||||
#~ "clock-o\"/> Preparo</span>"
|
|
||||||
|
|
||||||
#~ msgid ""
|
|
||||||
#~ "<span class=\"badge badge-success label-text-align\"><i class=\"fa fa-fw "
|
|
||||||
#~ "fa-truck\"/> Shipped</span>"
|
|
||||||
#~ msgstr ""
|
|
||||||
#~ "<span class=\"badge badge-success label-text-align\"><i class=\"fa fa-fw "
|
|
||||||
#~ "fa-truck\"/> Embarcado</span>"
|
|
||||||
|
|
||||||
#~ msgid ""
|
|
||||||
#~ "<span class=\"badge badge-warning label-text-align\"><i class=\"fa fa-fw "
|
|
||||||
#~ "fa-clock-o\"/> Partially Available</span>"
|
|
||||||
#~ msgstr ""
|
|
||||||
#~ "<span class=\"badge badge-warning label-text-align\"><i class=\"fa fa-fw "
|
|
||||||
#~ "fa-clock-o\"/> Parcialmente Disponível</span>"
|
|
||||||
|
|
||||||
#~ msgid "Delivered qty"
|
|
||||||
#~ msgstr "Quantidade Enviada"
|
|
||||||
|
|
||||||
#~ msgid "Delivered qty done"
|
|
||||||
#~ msgstr "Quantidade Envidada Concluída"
|
|
||||||
|
|
||||||
#~ msgid "Followers (Channels)"
|
|
||||||
#~ msgstr "Seguidores (Canais)"
|
|
||||||
|
|
||||||
#~ msgid "Number of messages which requires an action"
|
|
||||||
#~ msgstr "Número de Mensagens que Requerem sua Atenção"
|
|
||||||
|
|
||||||
#~ msgid "Number of unread messages"
|
|
||||||
#~ msgstr "Número de Mensagens Não Lidas"
|
|
||||||
|
|
||||||
#, python-format
|
|
||||||
#~ msgid ""
|
|
||||||
#~ "Quantity to extract cannot be greater than remaining delivery quantity "
|
|
||||||
#~ "(%s %s)"
|
|
||||||
#~ msgstr ""
|
|
||||||
#~ "A quantidade a extrair não pode ser maior que a quantidade de entrega "
|
|
||||||
#~ "restante (%s %s)"
|
|
||||||
|
|
||||||
#~ msgid "Refund line"
|
|
||||||
#~ msgstr "Linha de Restituição"
|
|
||||||
|
|
||||||
#, python-format
|
|
||||||
#~ msgid ""
|
|
||||||
#~ "Replacement: Move <a href=\"#\" data-oe-model=\"stock.move\" data-oe-"
|
|
||||||
#~ "id=\"%d\">%s</a> (Picking <a href=\"#\" data-oe-model=\"stock.picking\" "
|
|
||||||
#~ "data-oe-id=\"%d\">%s</a>) has been created."
|
|
||||||
#~ msgstr ""
|
|
||||||
#~ "Substituição: Movimentação <a href=\"#\" data-oe-model=\"stock.move\" "
|
|
||||||
#~ "data-oe-id=\"%d\">%s</a> (A Coleta <a href=\"#\" data-oe-model=\"stock."
|
|
||||||
#~ "picking\" data-oe-id=\"%d\">%s</a> foi criada."
|
|
||||||
|
|
||||||
#, python-format
|
|
||||||
#~ msgid ""
|
|
||||||
#~ "Replacement:<br/>Product <a href=\"#\" data-oe-model=\"product.product\" "
|
|
||||||
#~ "data-oe-id=\"%d\">%s</a><br/>Quantity %f %s<br/>This replacement did not "
|
|
||||||
#~ "create a new move, but one of the previously created moves was updated "
|
|
||||||
#~ "with this data."
|
|
||||||
#~ msgstr ""
|
|
||||||
#~ "Substituição:<br/> Produto <a href=\"#\" data-oe-model=\"product."
|
|
||||||
#~ "product\" data-oe-id=\"%d\">%s</a><br/> Quantidade %f%s<br/> Essa "
|
|
||||||
#~ "substituição não criou uma nova movimentação, mas uma das movimentos "
|
|
||||||
#~ "criadas anteriormente foi atualizada com esses dados."
|
|
||||||
|
|
||||||
#, python-format
|
|
||||||
#~ msgid ""
|
|
||||||
#~ "Return: <a href=\"#\" data-oe-model=\"stock.picking\" data-oe-"
|
|
||||||
#~ "id=\"%d\">%s</a> has been created."
|
|
||||||
#~ msgstr ""
|
|
||||||
#~ "Retorno: <a href=\"#\" data-oe-model=\"stock.picking\" data-oe-"
|
|
||||||
#~ "id=\"%d\">%s</a> foi criado."
|
|
||||||
|
|
||||||
#, python-format
|
|
||||||
#~ msgid ""
|
|
||||||
#~ "Split: <a href=\"#\" data-oe-model=\"rma\" data-oe-id=\"%d\">%s</a> has "
|
|
||||||
#~ "been created."
|
|
||||||
#~ msgstr ""
|
|
||||||
#~ "Divisão: <a href=\"#\" data-oe-model=\"rma\" data-oe-id=\"%d\">%s</a> foi "
|
|
||||||
#~ "criada."
|
|
||||||
|
|
||||||
#, python-format
|
|
||||||
#~ msgid ""
|
|
||||||
#~ "The quantity done for the product '%s' must be equal to its initial "
|
|
||||||
#~ "demand because the stock move is linked to an RMA (%s)."
|
|
||||||
#~ msgstr ""
|
|
||||||
#~ "A quantidade realizada para o produto '%s' deve ser igual à sua demanda "
|
|
||||||
#~ "inicial, porque a movimentação do estoque está vinculada a uma RMA (%s)."
|
|
||||||
|
|
||||||
#~ msgid "Unread Messages"
|
|
||||||
#~ msgstr "Mensagens não lidas"
|
|
||||||
|
|
||||||
#~ msgid "Unread Messages Counter"
|
|
||||||
#~ msgstr "Contador de Mensagens Não Lidas"
|
|
||||||
|
|
||||||
#~ msgid "Users"
|
|
||||||
#~ msgstr "Usuários"
|
|
||||||
|
|||||||
119
rma/i18n/ro.po
119
rma/i18n/ro.po
@@ -2188,122 +2188,3 @@ msgid ""
|
|||||||
"{{object.company_id.name}} Your RMA has been succesfully created (Ref "
|
"{{object.company_id.name}} Your RMA has been succesfully created (Ref "
|
||||||
"{{object.name or 'n/a' }})"
|
"{{object.name or 'n/a' }})"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#~ msgid "Last Modified on"
|
|
||||||
#~ msgstr "Ultima modificare în"
|
|
||||||
|
|
||||||
#~ msgid "Owner"
|
|
||||||
#~ msgstr "Proprietar"
|
|
||||||
|
|
||||||
#~ msgid ""
|
|
||||||
#~ "The owner of records created upon receiving emails on this alias. If this "
|
|
||||||
#~ "field is not set the system will attempt to find the right owner based on "
|
|
||||||
#~ "the sender (From) address, or will use the Administrator account if no "
|
|
||||||
#~ "system user is found for that address."
|
|
||||||
#~ msgstr ""
|
|
||||||
#~ "Proprietarul înregistrărilor create la primirea e-mailurilor de la acest "
|
|
||||||
#~ "alias. Dacă acest câmp nu este setat, sistemul va încerca să găsească "
|
|
||||||
#~ "proprietarul potrivit în funcție de adresa expeditorului (De la) sau va "
|
|
||||||
#~ "utiliza contul de administrator dacă nu este găsit niciun utilizator de "
|
|
||||||
#~ "sistem pentru acea adresă."
|
|
||||||
|
|
||||||
#~ msgid "${(object.name or '')}"
|
|
||||||
#~ msgstr "${(object.name or '')}"
|
|
||||||
|
|
||||||
#~ msgid "${object.company_id.name} RMA (Ref ${object.name or 'n/a' })"
|
|
||||||
#~ msgstr "${object.company_id.name} Retur (Ref ${object.name or 'n/a' })"
|
|
||||||
|
|
||||||
#, python-format
|
|
||||||
#~ msgid "<b>E-mail subject:</b> %s<br/><br/><b>E-mail body:</b><br/>%s"
|
|
||||||
#~ msgstr "<b>Subiect e-mail:</b> %s<br/><br/><b>Conținut e-mail:</b><br/>%s"
|
|
||||||
|
|
||||||
#~ msgid ""
|
|
||||||
#~ "<div style=\"margin: 0px; padding: 0px;\">\n"
|
|
||||||
#~ " <p style=\"margin: 0px; padding: 0px; font-size: 13px;"
|
|
||||||
#~ "\">\n"
|
|
||||||
#~ " Dear ${object.partner_id.name}\n"
|
|
||||||
#~ " % if object.partner_id.parent_id:\n"
|
|
||||||
#~ " (${object.partner_id.parent_id.name})\n"
|
|
||||||
#~ " % endif\n"
|
|
||||||
#~ " <br/><br/>\n"
|
|
||||||
#~ " Here is the RMA <strong>${object.name}</strong> from ${object."
|
|
||||||
#~ "company_id.name}.\n"
|
|
||||||
#~ " <br/><br/>\n"
|
|
||||||
#~ " Do not hesitate to contact us if you have any question.\n"
|
|
||||||
#~ "</p>\n"
|
|
||||||
#~ " </div>\n"
|
|
||||||
#~ " "
|
|
||||||
#~ msgstr ""
|
|
||||||
#~ "<div style=\"margin: 0px; padding: 0px;\">\n"
|
|
||||||
#~ " <p style=\"margin: 0px; padding: 0px; font-size: 13px;"
|
|
||||||
#~ "\">\n"
|
|
||||||
#~ " Dragă ${object.partner_id.name}\n"
|
|
||||||
#~ " % if object.partner_id.parent_id:\n"
|
|
||||||
#~ " (${object.partner_id.parent_id.name})\n"
|
|
||||||
#~ " % endif\n"
|
|
||||||
#~ " <br/><br/>\n"
|
|
||||||
#~ " Aici este formularul de retur <strong>${object.name}</strong> de la "
|
|
||||||
#~ "${object.company_id.name}.\n"
|
|
||||||
#~ " <br/><br/>\n"
|
|
||||||
#~ " Nu ezitați să ne contactați dacă aveți întrebări.\n"
|
|
||||||
#~ "</p>\n"
|
|
||||||
#~ " </div>\n"
|
|
||||||
#~ " "
|
|
||||||
|
|
||||||
#~ msgid ""
|
|
||||||
#~ "<span class=\"badge badge-danger label-text-align\"><i class=\"fa fa-fw "
|
|
||||||
#~ "fa-times\"/> Cancelled</span>"
|
|
||||||
#~ msgstr ""
|
|
||||||
#~ "<span class=\"badge badge-danger label-text-align\"><i class=\"fa fa-fw "
|
|
||||||
#~ "fa-times\"/> Anulat</span>"
|
|
||||||
|
|
||||||
#~ msgid ""
|
|
||||||
#~ "<span class=\"badge badge-info label-text-align\"><i class=\"fa fa-fw fa-"
|
|
||||||
#~ "clock-o\"/> Preparation</span>"
|
|
||||||
#~ msgstr ""
|
|
||||||
#~ "<span class=\"badge badge-info label-text-align\"><i class=\"fa fa-fw fa-"
|
|
||||||
#~ "clock-o\"/> Pregătire</span>"
|
|
||||||
|
|
||||||
#~ msgid ""
|
|
||||||
#~ "<span class=\"badge badge-success label-text-align\"><i class=\"fa fa-fw "
|
|
||||||
#~ "fa-truck\"/> Shipped</span>"
|
|
||||||
#~ msgstr ""
|
|
||||||
#~ "<span class=\"badge badge-success label-text-align\"><i class=\"fa fa-fw "
|
|
||||||
#~ "fa-truck\"/> Expediat</span>"
|
|
||||||
|
|
||||||
#~ msgid ""
|
|
||||||
#~ "<span class=\"badge badge-warning label-text-align\"><i class=\"fa fa-fw "
|
|
||||||
#~ "fa-clock-o\"/> Partially Available</span>"
|
|
||||||
#~ msgstr ""
|
|
||||||
#~ "<span class=\"badge badge-warning label-text-align\"><i class=\"fa fa-fw "
|
|
||||||
#~ "fa-clock-o\"/> Disponibil parțial</span>"
|
|
||||||
|
|
||||||
#~ msgid "Delivered qty"
|
|
||||||
#~ msgstr "Cantitate livrată"
|
|
||||||
|
|
||||||
#~ msgid "Delivered qty done"
|
|
||||||
#~ msgstr "Cantitate livrată efectivă"
|
|
||||||
|
|
||||||
#~ msgid "Followers (Channels)"
|
|
||||||
#~ msgstr "Urmăritori (Canale)"
|
|
||||||
|
|
||||||
#, python-format
|
|
||||||
#~ msgid ""
|
|
||||||
#~ "Quantity to extract cannot be greater than remaining delivery quantity "
|
|
||||||
#~ "(%s %s)"
|
|
||||||
#~ msgstr ""
|
|
||||||
#~ "Cantitatea de extras nu poate fi mai mare decât cantitatea de livrare "
|
|
||||||
#~ "rămasă (%s %s)"
|
|
||||||
|
|
||||||
#~ msgid "Refund line"
|
|
||||||
#~ msgstr "Linie ramburs"
|
|
||||||
|
|
||||||
#, python-format
|
|
||||||
#~ msgid ""
|
|
||||||
#~ "Replacement: Move <a href=\"#\" data-oe-model=\"stock.move\" data-oe-"
|
|
||||||
#~ "id=\"%d\">%s</a> (Picking <a href=\"#\" data-oe-model=\"stock.picking\" "
|
|
||||||
#~ "data-oe-id=\"%d\">%s</a>) has been created."
|
|
||||||
#~ msgstr ""
|
|
||||||
#~ "Înlocuire: Mișcarea <a href=\"#\" data-oe-model=\"stock.move\" data-oe-"
|
|
||||||
#~ "id=\"%d\">%s</a> (Transfer <a href=\"#\" data-oe-model=\"stock.picking\" "
|
|
||||||
#~ "data-oe-id=\"%d\">%s</a>) a fost creat."
|
|
||||||
|
|||||||
@@ -1,17 +0,0 @@
|
|||||||
# Copyright 2024 Tecnativa - Víctor Martínez
|
|
||||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
|
|
||||||
|
|
||||||
from openupgradelib import openupgrade
|
|
||||||
|
|
||||||
|
|
||||||
@openupgrade.migrate()
|
|
||||||
def migrate(env, version):
|
|
||||||
"""Similar behavior to create_rma_routes of post_init_hook."""
|
|
||||||
warehouses = env["stock.warehouse"].search([])
|
|
||||||
warehouses = warehouses.with_context(rma_post_init_hook=True)
|
|
||||||
for wh in warehouses:
|
|
||||||
if not wh.rma_in_type_id or not wh.rma_out_type_id:
|
|
||||||
data = wh._create_or_update_sequences_and_picking_types()
|
|
||||||
wh.write(data)
|
|
||||||
route_vals = wh._create_or_update_route()
|
|
||||||
wh.write(route_vals)
|
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
# Copyright 2020 Tecnativa - Ernesto Tejeda
|
# Copyright 2020 Tecnativa - Ernesto Tejeda
|
||||||
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
|
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
|
||||||
|
|
||||||
from odoo import _, fields, models
|
from odoo import fields, models
|
||||||
from odoo.exceptions import ValidationError
|
from odoo.exceptions import ValidationError
|
||||||
from odoo.tools import float_compare
|
from odoo.tools import float_compare
|
||||||
|
|
||||||
@@ -33,7 +33,7 @@ class AccountMove(models.Model):
|
|||||||
"""
|
"""
|
||||||
if self._check_rma_invoice_lines_qty():
|
if self._check_rma_invoice_lines_qty():
|
||||||
raise ValidationError(
|
raise ValidationError(
|
||||||
_(
|
self.env._(
|
||||||
"There is at least one invoice lines whose quantity is "
|
"There is at least one invoice lines whose quantity is "
|
||||||
"less than the quantity specified in its linked RMA."
|
"less than the quantity specified in its linked RMA."
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
# Copyright 2023 Tecnativa - Pedro M. Baeza
|
# Copyright 2023 Tecnativa - Pedro M. Baeza
|
||||||
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
|
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
|
||||||
|
|
||||||
from odoo import _, api, fields, models
|
from odoo import api, fields, models
|
||||||
|
|
||||||
|
|
||||||
class ResCompany(models.Model):
|
class ResCompany(models.Model):
|
||||||
@@ -79,7 +79,7 @@ class ResCompany(models.Model):
|
|||||||
.sudo()
|
.sudo()
|
||||||
.create(
|
.create(
|
||||||
{
|
{
|
||||||
"name": _("RMA Code"),
|
"name": self.env._("RMA Code"),
|
||||||
"prefix": "RMA",
|
"prefix": "RMA",
|
||||||
"code": "rma",
|
"code": "rma",
|
||||||
"padding": 4,
|
"padding": 4,
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ class ResConfigSettings(models.TransientModel):
|
|||||||
)
|
)
|
||||||
rma_mail_confirmation_template_id = fields.Many2one(
|
rma_mail_confirmation_template_id = fields.Many2one(
|
||||||
related="company_id.rma_mail_confirmation_template_id",
|
related="company_id.rma_mail_confirmation_template_id",
|
||||||
|
domain="[('model', '=', 'rma')]",
|
||||||
readonly=False,
|
readonly=False,
|
||||||
)
|
)
|
||||||
send_rma_receipt_confirmation = fields.Boolean(
|
send_rma_receipt_confirmation = fields.Boolean(
|
||||||
@@ -29,6 +30,7 @@ class ResConfigSettings(models.TransientModel):
|
|||||||
)
|
)
|
||||||
rma_mail_receipt_confirmation_template_id = fields.Many2one(
|
rma_mail_receipt_confirmation_template_id = fields.Many2one(
|
||||||
related="company_id.rma_mail_receipt_confirmation_template_id",
|
related="company_id.rma_mail_receipt_confirmation_template_id",
|
||||||
|
domain="[('model', '=', 'rma')]",
|
||||||
readonly=False,
|
readonly=False,
|
||||||
)
|
)
|
||||||
send_rma_draft_confirmation = fields.Boolean(
|
send_rma_draft_confirmation = fields.Boolean(
|
||||||
@@ -37,5 +39,6 @@ class ResConfigSettings(models.TransientModel):
|
|||||||
)
|
)
|
||||||
rma_mail_draft_confirmation_template_id = fields.Many2one(
|
rma_mail_draft_confirmation_template_id = fields.Many2one(
|
||||||
related="company_id.rma_mail_draft_confirmation_template_id",
|
related="company_id.rma_mail_draft_confirmation_template_id",
|
||||||
|
domain="[('model', '=', 'rma')]",
|
||||||
readonly=False,
|
readonly=False,
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ from itertools import groupby
|
|||||||
|
|
||||||
from markupsafe import Markup
|
from markupsafe import Markup
|
||||||
|
|
||||||
from odoo import _, api, fields, models
|
from odoo import api, fields, models
|
||||||
from odoo.exceptions import AccessError, ValidationError
|
from odoo.exceptions import AccessError, ValidationError
|
||||||
from odoo.tools import html2plaintext
|
from odoo.tools import html2plaintext
|
||||||
|
|
||||||
@@ -40,7 +40,7 @@ class Rma(models.Model):
|
|||||||
name = fields.Char(
|
name = fields.Char(
|
||||||
index=True,
|
index=True,
|
||||||
copy=False,
|
copy=False,
|
||||||
default=lambda self: _("New"),
|
default=lambda self: self.env._("New"),
|
||||||
)
|
)
|
||||||
origin = fields.Char(
|
origin = fields.Char(
|
||||||
string="Source Document",
|
string="Source Document",
|
||||||
@@ -314,9 +314,7 @@ class Rma(models.Model):
|
|||||||
for r in self:
|
for r in self:
|
||||||
r.remaining_qty = r.product_uom_qty - r.delivered_qty
|
r.remaining_qty = r.product_uom_qty - r.delivered_qty
|
||||||
|
|
||||||
@api.depends(
|
@api.depends("state")
|
||||||
"state",
|
|
||||||
)
|
|
||||||
def _compute_can_be_refunded(self):
|
def _compute_can_be_refunded(self):
|
||||||
"""Compute 'can_be_refunded'. This field controls the visibility
|
"""Compute 'can_be_refunded'. This field controls the visibility
|
||||||
of 'Refund' button in the rma form view and determinates if
|
of 'Refund' button in the rma form view and determinates if
|
||||||
@@ -497,7 +495,7 @@ class Rma(models.Model):
|
|||||||
@api.model_create_multi
|
@api.model_create_multi
|
||||||
def create(self, vals_list):
|
def create(self, vals_list):
|
||||||
for vals in vals_list:
|
for vals in vals_list:
|
||||||
if vals.get("name", _("New")) == _("New"):
|
if vals.get("name", self.env._("New")) == self.env._("New"):
|
||||||
ir_sequence = self.env["ir.sequence"]
|
ir_sequence = self.env["ir.sequence"]
|
||||||
if "company_id" in vals:
|
if "company_id" in vals:
|
||||||
ir_sequence = ir_sequence.with_company(vals["company_id"])
|
ir_sequence = ir_sequence.with_company(vals["company_id"])
|
||||||
@@ -514,18 +512,19 @@ class Rma(models.Model):
|
|||||||
return rmas
|
return rmas
|
||||||
|
|
||||||
def copy(self, default=None):
|
def copy(self, default=None):
|
||||||
team = super().copy(default)
|
new_rmas = super().copy(default)
|
||||||
for follower in self.message_follower_ids:
|
for old_rma, new_rma in zip(self, new_rmas, strict=False):
|
||||||
team.message_subscribe(
|
for follower in old_rma.message_follower_ids:
|
||||||
partner_ids=follower.partner_id.ids,
|
new_rma.message_subscribe(
|
||||||
subtype_ids=follower.subtype_ids.ids,
|
partner_ids=follower.partner_id.ids,
|
||||||
)
|
subtype_ids=follower.subtype_ids.ids,
|
||||||
return team
|
)
|
||||||
|
return new_rmas
|
||||||
|
|
||||||
def unlink(self):
|
def unlink(self):
|
||||||
if self.filtered(lambda r: r.state != "draft"):
|
if self.filtered(lambda r: r.state != "draft"):
|
||||||
raise ValidationError(
|
raise ValidationError(
|
||||||
_("You cannot delete RMAs that are not in draft state")
|
self.env._("You cannot delete RMAs that are not in draft state")
|
||||||
)
|
)
|
||||||
return super().unlink()
|
return super().unlink()
|
||||||
|
|
||||||
@@ -601,10 +600,6 @@ class Rma(models.Model):
|
|||||||
if self.partner_id and self.partner_id not in self.message_partner_ids:
|
if self.partner_id and self.partner_id not in self.message_partner_ids:
|
||||||
self.message_subscribe([self.partner_id.id])
|
self.message_subscribe([self.partner_id.id])
|
||||||
|
|
||||||
def _product_is_storable(self, product=None):
|
|
||||||
product = product or self.product_id
|
|
||||||
return product.type in ["product", "consu"]
|
|
||||||
|
|
||||||
def _prepare_procurement_group_vals(self):
|
def _prepare_procurement_group_vals(self):
|
||||||
return {
|
return {
|
||||||
"move_type": "direct",
|
"move_type": "direct",
|
||||||
@@ -643,7 +638,7 @@ class Rma(models.Model):
|
|||||||
procurements = []
|
procurements = []
|
||||||
group_model = self.env["procurement.group"]
|
group_model = self.env["procurement.group"]
|
||||||
for rma in self:
|
for rma in self:
|
||||||
if not rma._product_is_storable():
|
if not rma.product_id.is_storable:
|
||||||
continue
|
continue
|
||||||
group = rma.procurement_group_id
|
group = rma.procurement_group_id
|
||||||
if not group:
|
if not group:
|
||||||
@@ -824,7 +819,7 @@ class Rma(models.Model):
|
|||||||
"""Invoked when 'Refund' smart button in rma form view is clicked."""
|
"""Invoked when 'Refund' smart button in rma form view is clicked."""
|
||||||
self.ensure_one()
|
self.ensure_one()
|
||||||
return {
|
return {
|
||||||
"name": _("Refund"),
|
"name": self.env._("Refund"),
|
||||||
"type": "ir.actions.act_window",
|
"type": "ir.actions.act_window",
|
||||||
"view_type": "form",
|
"view_type": "form",
|
||||||
"view_mode": "form",
|
"view_mode": "form",
|
||||||
@@ -873,7 +868,7 @@ class Rma(models.Model):
|
|||||||
)
|
)
|
||||||
desc += f"\n{field_record.field_description}"
|
desc += f"\n{field_record.field_description}"
|
||||||
if desc:
|
if desc:
|
||||||
raise ValidationError(_("Required field(s):%s") % desc)
|
raise ValidationError(self.env._("Required field(s):%s") % desc)
|
||||||
|
|
||||||
def _ensure_can_be_returned(self):
|
def _ensure_can_be_returned(self):
|
||||||
"""This method is intended to be invoked after user click on
|
"""This method is intended to be invoked after user click on
|
||||||
@@ -888,9 +883,11 @@ class Rma(models.Model):
|
|||||||
"""
|
"""
|
||||||
if len(self) == 1:
|
if len(self) == 1:
|
||||||
if not self.can_be_returned:
|
if not self.can_be_returned:
|
||||||
raise ValidationError(_("This RMA cannot perform a return."))
|
raise ValidationError(self.env._("This RMA cannot perform a return."))
|
||||||
elif not self.filtered("can_be_returned"):
|
elif not self.filtered("can_be_returned"):
|
||||||
raise ValidationError(_("None of the selected RMAs can perform a return."))
|
raise ValidationError(
|
||||||
|
self.env._("None of the selected RMAs can perform a return.")
|
||||||
|
)
|
||||||
|
|
||||||
def _ensure_can_be_replaced(self):
|
def _ensure_can_be_replaced(self):
|
||||||
"""This method is intended to be invoked after user click on
|
"""This method is intended to be invoked after user click on
|
||||||
@@ -903,10 +900,12 @@ class Rma(models.Model):
|
|||||||
"""
|
"""
|
||||||
if len(self) == 1:
|
if len(self) == 1:
|
||||||
if not self.can_be_replaced:
|
if not self.can_be_replaced:
|
||||||
raise ValidationError(_("This RMA cannot perform a replacement."))
|
raise ValidationError(
|
||||||
|
self.env._("This RMA cannot perform a replacement.")
|
||||||
|
)
|
||||||
elif not self.filtered("can_be_replaced"):
|
elif not self.filtered("can_be_replaced"):
|
||||||
raise ValidationError(
|
raise ValidationError(
|
||||||
_("None of the selected RMAs can perform a replacement.")
|
self.env._("None of the selected RMAs can perform a replacement.")
|
||||||
)
|
)
|
||||||
|
|
||||||
def _ensure_can_be_split(self):
|
def _ensure_can_be_split(self):
|
||||||
@@ -917,7 +916,7 @@ class Rma(models.Model):
|
|||||||
"""
|
"""
|
||||||
self.ensure_one()
|
self.ensure_one()
|
||||||
if not self.can_be_split:
|
if not self.can_be_split:
|
||||||
raise ValidationError(_("This RMA cannot be split."))
|
raise ValidationError(self.env._("This RMA cannot be split."))
|
||||||
|
|
||||||
def _ensure_qty_to_return(self, qty=None, uom=None):
|
def _ensure_qty_to_return(self, qty=None, uom=None):
|
||||||
"""This method is intended to be invoked after confirm the wizard.
|
"""This method is intended to be invoked after confirm the wizard.
|
||||||
@@ -928,7 +927,9 @@ class Rma(models.Model):
|
|||||||
qty = uom._compute_quantity(qty, self.product_uom)
|
qty = uom._compute_quantity(qty, self.product_uom)
|
||||||
if qty > self.remaining_qty:
|
if qty > self.remaining_qty:
|
||||||
raise ValidationError(
|
raise ValidationError(
|
||||||
_("The quantity to return is greater than " "remaining quantity.")
|
self.env._(
|
||||||
|
"The quantity to return is greater than " "remaining quantity."
|
||||||
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
def _ensure_qty_to_extract(self, qty, uom):
|
def _ensure_qty_to_extract(self, qty, uom):
|
||||||
@@ -940,7 +941,7 @@ class Rma(models.Model):
|
|||||||
to_split_uom_qty = uom._compute_quantity(qty, self.product_uom)
|
to_split_uom_qty = uom._compute_quantity(qty, self.product_uom)
|
||||||
if to_split_uom_qty > self.remaining_qty:
|
if to_split_uom_qty > self.remaining_qty:
|
||||||
raise ValidationError(
|
raise ValidationError(
|
||||||
_(
|
self.env._(
|
||||||
"Quantity to extract cannot be greater than remaining"
|
"Quantity to extract cannot be greater than remaining"
|
||||||
" delivery quantity (%(remaining_qty)s %(product_uom)s)"
|
" delivery quantity (%(remaining_qty)s %(product_uom)s)"
|
||||||
)
|
)
|
||||||
@@ -980,7 +981,7 @@ class Rma(models.Model):
|
|||||||
)
|
)
|
||||||
self.message_post(
|
self.message_post(
|
||||||
body=Markup(
|
body=Markup(
|
||||||
_(
|
self.env._(
|
||||||
'Split: <a href="#" data-oe-model="rma" '
|
'Split: <a href="#" data-oe-model="rma" '
|
||||||
'data-oe-id="%(id)d">%(name)s</a> has been created.'
|
'data-oe-id="%(id)d">%(name)s</a> has been created.'
|
||||||
)
|
)
|
||||||
@@ -1103,7 +1104,7 @@ class Rma(models.Model):
|
|||||||
self._ensure_can_be_returned()
|
self._ensure_can_be_returned()
|
||||||
self._ensure_qty_to_return(qty, uom)
|
self._ensure_qty_to_return(qty, uom)
|
||||||
rmas_to_return = self.filtered(
|
rmas_to_return = self.filtered(
|
||||||
lambda rma: rma.can_be_returned and rma._product_is_storable()
|
lambda rma: rma.can_be_returned and rma.product_id.is_storable
|
||||||
)
|
)
|
||||||
procurements = rmas_to_return._prepare_delivery_procurements(
|
procurements = rmas_to_return._prepare_delivery_procurements(
|
||||||
scheduled_date, qty, uom
|
scheduled_date, qty, uom
|
||||||
@@ -1116,7 +1117,7 @@ class Rma(models.Model):
|
|||||||
pickings[picking] |= rma
|
pickings[picking] |= rma
|
||||||
rma.message_post(
|
rma.message_post(
|
||||||
body=Markup(
|
body=Markup(
|
||||||
_(
|
self.env._(
|
||||||
'Return: <a href="#" data-oe-model="stock.picking" '
|
'Return: <a href="#" data-oe-model="stock.picking" '
|
||||||
'data-oe-id="%(id)d">%(name)s</a> has been created.'
|
'data-oe-id="%(id)d">%(name)s</a> has been created.'
|
||||||
)
|
)
|
||||||
@@ -1146,7 +1147,7 @@ class Rma(models.Model):
|
|||||||
procurements = []
|
procurements = []
|
||||||
group_model = self.env["procurement.group"]
|
group_model = self.env["procurement.group"]
|
||||||
for rma in self:
|
for rma in self:
|
||||||
if not rma._product_is_storable(product):
|
if not product.is_storable:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
if not rma.procurement_group_id:
|
if not rma.procurement_group_id:
|
||||||
@@ -1186,7 +1187,7 @@ class Rma(models.Model):
|
|||||||
# MRP BoM Kits
|
# MRP BoM Kits
|
||||||
for new_move in new_moves:
|
for new_move in new_moves:
|
||||||
body += Markup(
|
body += Markup(
|
||||||
_(
|
self.env._(
|
||||||
'Replacement: Move <a href="#" data-oe-model="stock.move"'
|
'Replacement: Move <a href="#" data-oe-model="stock.move"'
|
||||||
' data-oe-id="%(move_id)d">%(move_name)s</a> (Picking <a'
|
' data-oe-id="%(move_id)d">%(move_name)s</a> (Picking <a'
|
||||||
' href="#" data-oe-model="stock.picking"'
|
' href="#" data-oe-model="stock.picking"'
|
||||||
@@ -1212,7 +1213,7 @@ class Rma(models.Model):
|
|||||||
self.message_post(
|
self.message_post(
|
||||||
body=body
|
body=body
|
||||||
or Markup(
|
or Markup(
|
||||||
_(
|
self.env._(
|
||||||
"Replacement:<br/>"
|
"Replacement:<br/>"
|
||||||
'Product <a href="#" data-oe-model="product.product" '
|
'Product <a href="#" data-oe-model="product.product" '
|
||||||
'data-oe-id="%(id)d">%(name)s</a><br/>'
|
'data-oe-id="%(id)d">%(name)s</a><br/>'
|
||||||
@@ -1255,14 +1256,14 @@ class Rma(models.Model):
|
|||||||
custom_values = {}
|
custom_values = {}
|
||||||
subject = msg_dict.get("subject", "")
|
subject = msg_dict.get("subject", "")
|
||||||
body = html2plaintext(msg_dict.get("body", ""))
|
body = html2plaintext(msg_dict.get("body", ""))
|
||||||
desc = _(
|
desc = self.env._(
|
||||||
"<b>E-mail subject:</b> %(subject)s<br/><br/><b>E-mail"
|
"<b>E-mail subject:</b> %(subject)s<br/><br/><b>E-mail"
|
||||||
" body:</b><br/>%(body)s"
|
" body:</b><br/>%(body)s"
|
||||||
) % ({"subject": subject, "body": body})
|
) % ({"subject": subject, "body": body})
|
||||||
defaults = {
|
defaults = {
|
||||||
"description": desc,
|
"description": desc,
|
||||||
"name": _("New"),
|
"name": self.env._("New"),
|
||||||
"origin": _("Incoming e-mail"),
|
"origin": self.env._("Incoming e-mail"),
|
||||||
}
|
}
|
||||||
if msg_dict.get("author_id"):
|
if msg_dict.get("author_id"):
|
||||||
partner = self.env["res.partner"].browse(msg_dict.get("author_id"))
|
partner = self.env["res.partner"].browse(msg_dict.get("author_id"))
|
||||||
@@ -1298,7 +1299,7 @@ class Rma(models.Model):
|
|||||||
try:
|
try:
|
||||||
for record in self.filtered("partner_id"):
|
for record in self.filtered("partner_id"):
|
||||||
record._message_add_suggested_recipient(
|
record._message_add_suggested_recipient(
|
||||||
recipients, partner=record.partner_id, reason=_("Customer")
|
recipients, partner=record.partner_id, reason=self.env._("Customer")
|
||||||
)
|
)
|
||||||
except AccessError as e: # no read access rights
|
except AccessError as e: # no read access rights
|
||||||
_logger.debug(e)
|
_logger.debug(e)
|
||||||
@@ -1307,7 +1308,7 @@ class Rma(models.Model):
|
|||||||
# Reporting business methods
|
# Reporting business methods
|
||||||
def _get_report_base_filename(self):
|
def _get_report_base_filename(self):
|
||||||
self.ensure_one()
|
self.ensure_one()
|
||||||
return "RMA Report - %s" % self.name
|
return f"RMA Report - {self.name}"
|
||||||
|
|
||||||
# Other business methods
|
# Other business methods
|
||||||
|
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
import ast
|
import ast
|
||||||
|
|
||||||
from odoo import _, fields, models
|
from odoo import fields, models
|
||||||
|
|
||||||
|
|
||||||
class RmaTeam(models.Model):
|
class RmaTeam(models.Model):
|
||||||
@@ -40,18 +40,17 @@ class RmaTeam(models.Model):
|
|||||||
)
|
)
|
||||||
|
|
||||||
def copy(self, default=None):
|
def copy(self, default=None):
|
||||||
self.ensure_one()
|
default = dict(default or {})
|
||||||
if default is None:
|
new_teams = super().copy(default)
|
||||||
default = {}
|
for old_team, new_team in zip(self, new_teams, strict=False):
|
||||||
if not default.get("name"):
|
if not default.get("name"):
|
||||||
default["name"] = _("%s (copy)") % self.name
|
new_team.name = self.env._("%s (copy)") % old_team.name
|
||||||
team = super().copy(default)
|
for follower in old_team.message_follower_ids:
|
||||||
for follower in self.message_follower_ids:
|
new_team.message_subscribe(
|
||||||
team.message_subscribe(
|
partner_ids=follower.partner_id.ids,
|
||||||
partner_ids=follower.partner_id.ids,
|
subtype_ids=follower.subtype_ids.ids,
|
||||||
subtype_ids=follower.subtype_ids.ids,
|
)
|
||||||
)
|
return new_teams
|
||||||
return team
|
|
||||||
|
|
||||||
def _alias_get_creation_values(self):
|
def _alias_get_creation_values(self):
|
||||||
values = super()._alias_get_creation_values()
|
values = super()._alias_get_creation_values()
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
# Copyright 2023 Michael Tietz (MT Software) <mtietz@mt-software.de>
|
# Copyright 2023 Michael Tietz (MT Software) <mtietz@mt-software.de>
|
||||||
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
|
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
|
||||||
|
|
||||||
from odoo import _, api, fields, models
|
from odoo import api, fields, models
|
||||||
from odoo.exceptions import ValidationError
|
from odoo.exceptions import ValidationError
|
||||||
from odoo.tools import float_compare
|
from odoo.tools import float_compare
|
||||||
|
|
||||||
@@ -72,7 +72,7 @@ class StockMove(models.Model):
|
|||||||
!= 0
|
!= 0
|
||||||
):
|
):
|
||||||
raise ValidationError(
|
raise ValidationError(
|
||||||
_(
|
self.env._(
|
||||||
"The quantity done for the product '%(id)s' must "
|
"The quantity done for the product '%(id)s' must "
|
||||||
"be equal to its initial demand because the "
|
"be equal to its initial demand because the "
|
||||||
"stock move is linked to an RMA (%(name)s)."
|
"stock move is linked to an RMA (%(name)s)."
|
||||||
|
|||||||
@@ -16,18 +16,6 @@ class StockPicking(models.Model):
|
|||||||
for rec in self:
|
for rec in self:
|
||||||
rec.rma_count = len(rec.move_ids.mapped("rma_ids"))
|
rec.rma_count = len(rec.move_ids.mapped("rma_ids"))
|
||||||
|
|
||||||
def copy(self, default=None):
|
|
||||||
self.ensure_one()
|
|
||||||
if self.env.context.get("set_rma_picking_type"):
|
|
||||||
location_dest_id = default.get("location_dest_id")
|
|
||||||
if location_dest_id:
|
|
||||||
warehouse = self.env["stock.warehouse"].search(
|
|
||||||
[("rma_loc_id", "parent_of", location_dest_id)], limit=1
|
|
||||||
)
|
|
||||||
if warehouse:
|
|
||||||
default["picking_type_id"] = warehouse.rma_in_type_id.id
|
|
||||||
return super().copy(default)
|
|
||||||
|
|
||||||
def action_view_rma(self):
|
def action_view_rma(self):
|
||||||
self.ensure_one()
|
self.ensure_one()
|
||||||
action = self.env["ir.actions.act_window"]._for_xml_id("rma.rma_action")
|
action = self.env["ir.actions.act_window"]._for_xml_id("rma.rma_action")
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
# Copyright 2023 Michael Tietz (MT Software) <mtietz@mt-software.de>
|
# Copyright 2023 Michael Tietz (MT Software) <mtietz@mt-software.de>
|
||||||
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
|
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
|
||||||
|
|
||||||
from odoo import _, fields, models
|
from odoo import fields, models
|
||||||
|
|
||||||
|
|
||||||
class StockWarehouse(models.Model):
|
class StockWarehouse(models.Model):
|
||||||
@@ -19,17 +19,24 @@ class StockWarehouse(models.Model):
|
|||||||
rma_in_type_id = fields.Many2one(
|
rma_in_type_id = fields.Many2one(
|
||||||
comodel_name="stock.picking.type",
|
comodel_name="stock.picking.type",
|
||||||
string="RMA In Type",
|
string="RMA In Type",
|
||||||
|
check_company=True,
|
||||||
|
copy=False,
|
||||||
)
|
)
|
||||||
rma_out_type_id = fields.Many2one(
|
rma_out_type_id = fields.Many2one(
|
||||||
comodel_name="stock.picking.type",
|
comodel_name="stock.picking.type",
|
||||||
string="RMA Out Type",
|
string="RMA Out Type",
|
||||||
|
check_company=True,
|
||||||
|
copy=False,
|
||||||
)
|
)
|
||||||
rma_loc_id = fields.Many2one(
|
rma_loc_id = fields.Many2one(
|
||||||
comodel_name="stock.location",
|
comodel_name="stock.location", string="RMA Location", check_company=True
|
||||||
string="RMA Location",
|
)
|
||||||
|
rma_in_route_id = fields.Many2one(
|
||||||
|
"stock.route", "RMA in Route", ondelete="restrict", copy=False
|
||||||
|
)
|
||||||
|
rma_out_route_id = fields.Many2one(
|
||||||
|
"stock.route", "RMA out Route", ondelete="restrict", copy=False
|
||||||
)
|
)
|
||||||
rma_in_route_id = fields.Many2one("stock.route", "RMA in Route")
|
|
||||||
rma_out_route_id = fields.Many2one("stock.route", "RMA out Route")
|
|
||||||
|
|
||||||
def _get_rma_location_values(self, vals, code=False):
|
def _get_rma_location_values(self, vals, code=False):
|
||||||
"""this method is intended to be used by 'create' method
|
"""this method is intended to be used by 'create' method
|
||||||
@@ -49,7 +56,6 @@ class StockWarehouse(models.Model):
|
|||||||
return {
|
return {
|
||||||
"name": view_location.name,
|
"name": view_location.name,
|
||||||
"active": True,
|
"active": True,
|
||||||
"return_location": True,
|
|
||||||
"usage": "internal",
|
"usage": "internal",
|
||||||
"company_id": company_id,
|
"company_id": company_id,
|
||||||
"location_id": self.env.ref("rma.stock_location_rma").id,
|
"location_id": self.env.ref("rma.stock_location_rma").id,
|
||||||
@@ -63,17 +69,19 @@ class StockWarehouse(models.Model):
|
|||||||
|
|
||||||
def _get_sequence_values(self, name=False, code=False):
|
def _get_sequence_values(self, name=False, code=False):
|
||||||
values = super()._get_sequence_values(name=name, code=code)
|
values = super()._get_sequence_values(name=name, code=code)
|
||||||
|
name = name if name else self.name
|
||||||
|
code = code if code else self.code
|
||||||
values.update(
|
values.update(
|
||||||
{
|
{
|
||||||
"rma_in_type_id": {
|
"rma_in_type_id": {
|
||||||
"name": self.name + " " + _("Sequence RMA in"),
|
"name": name + " " + self.env._("Sequence RMA in"),
|
||||||
"prefix": self.code + "/RMA/IN/",
|
"prefix": code + "/RMA/IN/",
|
||||||
"padding": 5,
|
"padding": 5,
|
||||||
"company_id": self.company_id.id,
|
"company_id": self.company_id.id,
|
||||||
},
|
},
|
||||||
"rma_out_type_id": {
|
"rma_out_type_id": {
|
||||||
"name": self.name + " " + _("Sequence RMA out"),
|
"name": name + " " + self.env._("Sequence RMA out"),
|
||||||
"prefix": self.code + "/RMA/OUT/",
|
"prefix": code + "/RMA/OUT/",
|
||||||
"padding": 5,
|
"padding": 5,
|
||||||
"company_id": self.company_id.id,
|
"company_id": self.company_id.id,
|
||||||
},
|
},
|
||||||
@@ -96,23 +104,21 @@ class StockWarehouse(models.Model):
|
|||||||
data.update(
|
data.update(
|
||||||
{
|
{
|
||||||
"rma_in_type_id": {
|
"rma_in_type_id": {
|
||||||
"name": _("RMA Receipts"),
|
"name": self.env._("RMA Receipts"),
|
||||||
"code": "incoming",
|
"code": "incoming",
|
||||||
"use_create_lots": False,
|
"use_create_lots": False,
|
||||||
"use_existing_lots": True,
|
"use_existing_lots": True,
|
||||||
"default_location_src_id": False,
|
|
||||||
"default_location_dest_id": self.rma_loc_id.id,
|
"default_location_dest_id": self.rma_loc_id.id,
|
||||||
"sequence": max_sequence + 1,
|
"sequence": max_sequence + 1,
|
||||||
"sequence_code": "RMA/IN",
|
"sequence_code": "RMA/IN",
|
||||||
"company_id": self.company_id.id,
|
"company_id": self.company_id.id,
|
||||||
},
|
},
|
||||||
"rma_out_type_id": {
|
"rma_out_type_id": {
|
||||||
"name": _("RMA Delivery Orders"),
|
"name": self.env._("RMA Delivery Orders"),
|
||||||
"code": "outgoing",
|
"code": "outgoing",
|
||||||
"use_create_lots": False,
|
"use_create_lots": False,
|
||||||
"use_existing_lots": True,
|
"use_existing_lots": True,
|
||||||
"default_location_src_id": self.rma_loc_id.id,
|
"default_location_src_id": self.rma_loc_id.id,
|
||||||
"default_location_dest_id": False,
|
|
||||||
"sequence": max_sequence + 2,
|
"sequence": max_sequence + 2,
|
||||||
"sequence_code": "RMA/OUT",
|
"sequence_code": "RMA/OUT",
|
||||||
"company_id": self.company_id.id,
|
"company_id": self.company_id.id,
|
||||||
|
|||||||
@@ -71,25 +71,19 @@
|
|||||||
<field name="name">RMA multi-company</field>
|
<field name="name">RMA multi-company</field>
|
||||||
<field name="model_id" ref="model_rma" />
|
<field name="model_id" ref="model_rma" />
|
||||||
<field name="global" eval="True" />
|
<field name="global" eval="True" />
|
||||||
<field
|
<field name="domain_force">[('company_id', 'in', company_ids + [False])]</field>
|
||||||
name="domain_force"
|
|
||||||
>['|',('company_id','=',False),('company_id','in',company_ids)]</field>
|
|
||||||
</record>
|
</record>
|
||||||
<record id="rma_team_rule_multi_company" model="ir.rule">
|
<record id="rma_team_rule_multi_company" model="ir.rule">
|
||||||
<field name="name">RMA team multi-company</field>
|
<field name="name">RMA team multi-company</field>
|
||||||
<field name="model_id" ref="model_rma_team" />
|
<field name="model_id" ref="model_rma_team" />
|
||||||
<field name="global" eval="True" />
|
<field name="global" eval="True" />
|
||||||
<field
|
<field name="domain_force">[('company_id', 'in', company_ids + [False])]</field>
|
||||||
name="domain_force"
|
|
||||||
>['|',('company_id','=',False),('company_id','in',company_ids)]</field>
|
|
||||||
</record>
|
</record>
|
||||||
<record id="rma_finalization_comp_rule" model="ir.rule">
|
<record id="rma_finalization_comp_rule" model="ir.rule">
|
||||||
<field name="name">RMA Finalization Reason multi-company</field>
|
<field name="name">RMA Finalization Reason multi-company</field>
|
||||||
<field name="model_id" ref="model_rma_finalization" />
|
<field name="model_id" ref="model_rma_finalization" />
|
||||||
<field name="global" eval="True" />
|
<field name="global" eval="True" />
|
||||||
<field
|
<field name="domain_force">[('company_id', 'in', company_ids + [False])]</field>
|
||||||
name="domain_force"
|
|
||||||
> ['|', ('company_id', 'in', company_ids), ('company_id', '=', False)]</field>
|
|
||||||
</record>
|
</record>
|
||||||
<!-- Allow to refund RMAs -->
|
<!-- Allow to refund RMAs -->
|
||||||
<record id="rma_account_move_personal_rule" model="ir.rule">
|
<record id="rma_account_move_personal_rule" model="ir.rule">
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
# Copyright 2020 Tecnativa - Ernesto Tejeda
|
# Copyright 2020 Tecnativa - Ernesto Tejeda
|
||||||
# Copyright 2023 Michael Tietz (MT Software) <mtietz@mt-software.de>
|
# Copyright 2023 Michael Tietz (MT Software) <mtietz@mt-software.de>
|
||||||
|
# Copyright 2025 Tecnativa - Víctor Martínez
|
||||||
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
|
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
|
||||||
|
|
||||||
from odoo.exceptions import UserError, ValidationError
|
from odoo.exceptions import UserError, ValidationError
|
||||||
@@ -28,7 +29,7 @@ class TestRma(BaseCommon):
|
|||||||
)
|
)
|
||||||
cls.rma_loc = cls.warehouse_company.rma_loc_id
|
cls.rma_loc = cls.warehouse_company.rma_loc_id
|
||||||
cls.product = cls.product_product.create(
|
cls.product = cls.product_product.create(
|
||||||
{"name": "Product test 1", "type": "product"}
|
{"name": "Product test 1", "type": "consu", "is_storable": True}
|
||||||
)
|
)
|
||||||
cls.account_receiv = cls.env["account.account"].create(
|
cls.account_receiv = cls.env["account.account"].create(
|
||||||
{
|
{
|
||||||
@@ -123,7 +124,7 @@ class TestRma(BaseCommon):
|
|||||||
move.product_uom_qty = 10
|
move.product_uom_qty = 10
|
||||||
with picking_form.move_ids_without_package.new() as move:
|
with picking_form.move_ids_without_package.new() as move:
|
||||||
move.product_id = self.product_product.create(
|
move.product_id = self.product_product.create(
|
||||||
{"name": "Product 2 test", "type": "product"}
|
{"name": "Product 2 test", "type": "consu", "is_storable": True}
|
||||||
)
|
)
|
||||||
move.product_uom_qty = 20
|
move.product_uom_qty = 20
|
||||||
picking = picking_form.save()
|
picking = picking_form.save()
|
||||||
@@ -169,14 +170,44 @@ class TestRmaCase(TestRma):
|
|||||||
wizard_form.product_uom_qty = rma.product_uom_qty
|
wizard_form.product_uom_qty = rma.product_uom_qty
|
||||||
wizard = wizard_form.save()
|
wizard = wizard_form.save()
|
||||||
wizard.action_deliver()
|
wizard.action_deliver()
|
||||||
self.assertEqual(rma.delivery_picking_count, 2)
|
out_picking = rma.delivery_move_ids.picking_id
|
||||||
out_pickings = rma.mapped("delivery_move_ids.picking_id")
|
out_picking.move_ids.quantity = 1
|
||||||
self.assertIn(
|
out_picking.button_validate()
|
||||||
self.warehouse.pick_type_id, out_pickings.mapped("picking_type_id")
|
self.assertEqual(out_picking.state, "done")
|
||||||
)
|
self.assertEqual(out_picking.picking_type_id, self.warehouse.pick_type_id)
|
||||||
self.assertIn(
|
next_transfer = out_picking._get_next_transfers()
|
||||||
self.warehouse.out_type_id, out_pickings.mapped("picking_type_id")
|
self.assertEqual(next_transfer.picking_type_id, self.warehouse.out_type_id)
|
||||||
|
self.assertEqual(rma.delivery_picking_count, 1)
|
||||||
|
|
||||||
|
def test_rma_replace_pick_pack_ship(self):
|
||||||
|
self.warehouse.write({"delivery_steps": "pick_pack_ship"})
|
||||||
|
rma = self._create_rma(self.partner, self.product, 1, self.rma_loc)
|
||||||
|
rma.action_confirm()
|
||||||
|
rma.reception_move_id.quantity = 1
|
||||||
|
rma.reception_move_id.picking_id.button_validate()
|
||||||
|
self.assertEqual(rma.reception_move_id.picking_id.state, "done")
|
||||||
|
self.assertEqual(rma.state, "received")
|
||||||
|
res = rma.action_replace()
|
||||||
|
wizard_form = Form(self.env[res["res_model"]].with_context(**res["context"]))
|
||||||
|
wizard_form.product_id = self.product
|
||||||
|
wizard_form.product_uom_qty = rma.product_uom_qty
|
||||||
|
wizard = wizard_form.save()
|
||||||
|
wizard.action_deliver()
|
||||||
|
out_picking = rma.delivery_move_ids.picking_id
|
||||||
|
out_picking.move_ids.quantity = 1
|
||||||
|
out_picking.button_validate()
|
||||||
|
self.assertEqual(out_picking.state, "done")
|
||||||
|
self.assertEqual(out_picking.picking_type_id, self.warehouse.pick_type_id)
|
||||||
|
next_transfer = out_picking._get_next_transfers()
|
||||||
|
self.assertEqual(next_transfer.picking_type_id, self.warehouse.pack_type_id)
|
||||||
|
next_transfer.move_ids.quantity = 1
|
||||||
|
next_transfer.button_validate()
|
||||||
|
self.assertEqual(next_transfer.state, "done")
|
||||||
|
next_transfer_extra = next_transfer._get_next_transfers()
|
||||||
|
self.assertEqual(
|
||||||
|
next_transfer_extra.picking_type_id, self.warehouse.out_type_id
|
||||||
)
|
)
|
||||||
|
self.assertEqual(rma.delivery_picking_count, 1)
|
||||||
|
|
||||||
def test_computed(self):
|
def test_computed(self):
|
||||||
# If partner changes, the invoice address is set
|
# If partner changes, the invoice address is set
|
||||||
@@ -193,7 +224,12 @@ class TestRmaCase(TestRma):
|
|||||||
}
|
}
|
||||||
)
|
)
|
||||||
product_2 = self.product_product.create(
|
product_2 = self.product_product.create(
|
||||||
{"name": "Product test 2", "type": "product", "uom_id": uom_ten.id}
|
{
|
||||||
|
"name": "Product test 2",
|
||||||
|
"type": "consu",
|
||||||
|
"is_storable": True,
|
||||||
|
"uom_id": uom_ten.id,
|
||||||
|
}
|
||||||
)
|
)
|
||||||
outgoing_picking_type = self.env["stock.picking.type"].search(
|
outgoing_picking_type = self.env["stock.picking.type"].search(
|
||||||
[
|
[
|
||||||
@@ -305,6 +341,7 @@ class TestRmaCase(TestRma):
|
|||||||
self.assertEqual(rma_2.state, "received")
|
self.assertEqual(rma_2.state, "received")
|
||||||
|
|
||||||
@users("__system__", "user_rma")
|
@users("__system__", "user_rma")
|
||||||
|
@mute_logger("odoo.models.unlink")
|
||||||
def test_action_refund(self):
|
def test_action_refund(self):
|
||||||
rma = self._create_confirm_receive(self.partner, self.product, 10, self.rma_loc)
|
rma = self._create_confirm_receive(self.partner, self.product, 10, self.rma_loc)
|
||||||
self.assertEqual(rma.state, "received")
|
self.assertEqual(rma.state, "received")
|
||||||
@@ -339,6 +376,7 @@ class TestRmaCase(TestRma):
|
|||||||
self.assertFalse(rma.can_be_returned)
|
self.assertFalse(rma.can_be_returned)
|
||||||
self.assertFalse(rma.can_be_replaced)
|
self.assertFalse(rma.can_be_replaced)
|
||||||
|
|
||||||
|
@mute_logger("odoo.models.unlink")
|
||||||
def test_mass_refund(self):
|
def test_mass_refund(self):
|
||||||
# Create, confirm and receive rma_1
|
# Create, confirm and receive rma_1
|
||||||
rma_1 = self._create_confirm_receive(
|
rma_1 = self._create_confirm_receive(
|
||||||
@@ -351,7 +389,7 @@ class TestRmaCase(TestRma):
|
|||||||
)
|
)
|
||||||
# rma_3: Same partner and different product than rma_1
|
# rma_3: Same partner and different product than rma_1
|
||||||
product = self.product_product.create(
|
product = self.product_product.create(
|
||||||
{"name": "Product 2 test", "type": "product"}
|
{"name": "Product 2 test", "type": "consu", "is_storable": True}
|
||||||
)
|
)
|
||||||
rma_3 = self._create_confirm_receive(self.partner, product, 20, self.rma_loc)
|
rma_3 = self._create_confirm_receive(self.partner, product, 20, self.rma_loc)
|
||||||
# rma_4: Different partner and same product as rma_1
|
# rma_4: Different partner and same product as rma_1
|
||||||
@@ -424,7 +462,7 @@ class TestRmaCase(TestRma):
|
|||||||
rma = self._create_confirm_receive(self.partner, self.product, 10, self.rma_loc)
|
rma = self._create_confirm_receive(self.partner, self.product, 10, self.rma_loc)
|
||||||
# Replace with another product with quantity 2.
|
# Replace with another product with quantity 2.
|
||||||
product_2 = self.product_product.create(
|
product_2 = self.product_product.create(
|
||||||
{"name": "Product 2 test", "type": "product"}
|
{"name": "Product 2 test", "type": "consu", "is_storable": True}
|
||||||
)
|
)
|
||||||
delivery_form = Form(
|
delivery_form = Form(
|
||||||
self.env["rma.delivery.wizard"].with_context(
|
self.env["rma.delivery.wizard"].with_context(
|
||||||
@@ -450,7 +488,7 @@ class TestRmaCase(TestRma):
|
|||||||
picking = first_move.picking_id
|
picking = first_move.picking_id
|
||||||
# Replace again with another product with the remaining quantity
|
# Replace again with another product with the remaining quantity
|
||||||
product_3 = self.product_product.create(
|
product_3 = self.product_product.create(
|
||||||
{"name": "Product 3 test", "type": "product"}
|
{"name": "Product 3 test", "type": "consu", "is_storable": True}
|
||||||
)
|
)
|
||||||
delivery_form = Form(
|
delivery_form = Form(
|
||||||
self.env["rma.delivery.wizard"].with_context(
|
self.env["rma.delivery.wizard"].with_context(
|
||||||
@@ -572,7 +610,7 @@ class TestRmaCase(TestRma):
|
|||||||
)
|
)
|
||||||
# rma_3: Same partner and different product than rma_1
|
# rma_3: Same partner and different product than rma_1
|
||||||
product = self.product_product.create(
|
product = self.product_product.create(
|
||||||
{"name": "Product 2 test", "type": "product"}
|
{"name": "Product 2 test", "type": "consu", "is_storable": True}
|
||||||
)
|
)
|
||||||
rma_3 = self._create_confirm_receive(self.partner, product, 20, self.rma_loc)
|
rma_3 = self._create_confirm_receive(self.partner, product, 20, self.rma_loc)
|
||||||
# rma_4: Different partner and same product as rma_1
|
# rma_4: Different partner and same product as rma_1
|
||||||
@@ -653,7 +691,7 @@ class TestRmaCase(TestRma):
|
|||||||
)
|
)
|
||||||
# rma_3: Same partner and different product than rma_1
|
# rma_3: Same partner and different product than rma_1
|
||||||
product = self.product_product.create(
|
product = self.product_product.create(
|
||||||
{"name": "Product 2 test", "type": "product"}
|
{"name": "Product 2 test", "type": "consu", "is_storable": True}
|
||||||
)
|
)
|
||||||
rma_3 = self._create_confirm_receive(self.partner, product, 20, self.rma_loc)
|
rma_3 = self._create_confirm_receive(self.partner, product, 20, self.rma_loc)
|
||||||
# rma_4: Different partner and same product as rma_1
|
# rma_4: Different partner and same product as rma_1
|
||||||
@@ -685,7 +723,11 @@ class TestRmaCase(TestRma):
|
|||||||
stock_return_picking_form.create_rma = True
|
stock_return_picking_form.create_rma = True
|
||||||
stock_return_picking_form.rma_operation_id = self.operation
|
stock_return_picking_form.rma_operation_id = self.operation
|
||||||
return_wizard = stock_return_picking_form.save()
|
return_wizard = stock_return_picking_form.save()
|
||||||
picking_action = return_wizard.create_returns()
|
for move in origin_delivery.move_ids_without_package:
|
||||||
|
return_wizard.product_return_moves.filtered(
|
||||||
|
lambda x, move=move: x.move_id == move
|
||||||
|
).quantity = move.quantity
|
||||||
|
picking_action = return_wizard.action_create_returns()
|
||||||
# Each origin move is linked to a different RMA
|
# Each origin move is linked to a different RMA
|
||||||
origin_moves = origin_delivery.move_ids
|
origin_moves = origin_delivery.move_ids
|
||||||
self.assertTrue(origin_moves[0].rma_ids)
|
self.assertTrue(origin_moves[0].rma_ids)
|
||||||
|
|||||||
@@ -78,7 +78,6 @@
|
|||||||
name="rma_mail_confirmation_template_id"
|
name="rma_mail_confirmation_template_id"
|
||||||
class="oe_inline"
|
class="oe_inline"
|
||||||
required="send_rma_confirmation"
|
required="send_rma_confirmation"
|
||||||
context="{'default_model': 'rma'}"
|
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -116,7 +115,6 @@
|
|||||||
name="rma_mail_receipt_confirmation_template_id"
|
name="rma_mail_receipt_confirmation_template_id"
|
||||||
class="oe_inline"
|
class="oe_inline"
|
||||||
required="send_rma_receipt_confirmation"
|
required="send_rma_receipt_confirmation"
|
||||||
context="{'default_model': 'rma'}"
|
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -154,7 +152,6 @@
|
|||||||
name="rma_mail_draft_confirmation_template_id"
|
name="rma_mail_draft_confirmation_template_id"
|
||||||
class="oe_inline"
|
class="oe_inline"
|
||||||
required="send_rma_draft_confirmation"
|
required="send_rma_draft_confirmation"
|
||||||
context="{'default_model': 'rma'}"
|
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -45,11 +45,11 @@
|
|||||||
<field name="model">rma.finalization</field>
|
<field name="model">rma.finalization</field>
|
||||||
<field eval="6" name="priority" />
|
<field eval="6" name="priority" />
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<tree>
|
<list>
|
||||||
<field name="name" />
|
<field name="name" />
|
||||||
<field name="company_id" groups="base.group_multi_company" />
|
<field name="company_id" groups="base.group_multi_company" />
|
||||||
<field name="company_id" invisible="1" />
|
<field name="company_id" invisible="1" />
|
||||||
</tree>
|
</list>
|
||||||
</field>
|
</field>
|
||||||
</record>
|
</record>
|
||||||
<record id="action_rma_finalization" model="ir.actions.act_window">
|
<record id="action_rma_finalization" model="ir.actions.act_window">
|
||||||
|
|||||||
@@ -73,7 +73,7 @@
|
|||||||
<span t-field="rma.product_uom_qty" />
|
<span t-field="rma.product_uom_qty" />
|
||||||
</td>
|
</td>
|
||||||
<td class="d-none d-md-table-cell tx_status">
|
<td class="d-none d-md-table-cell tx_status">
|
||||||
<span class="badge badge-pill badge-secondary">
|
<span class="badge rounded-pill text-bg-info">
|
||||||
<span t-field="rma.state" />
|
<span t-field="rma.state" />
|
||||||
</span>
|
</span>
|
||||||
</td>
|
</td>
|
||||||
@@ -93,251 +93,313 @@
|
|||||||
/>
|
/>
|
||||||
</t>
|
</t>
|
||||||
</t>
|
</t>
|
||||||
<t t-call="portal.portal_record_layout">
|
<h5 class="mb-0">
|
||||||
<t t-set="card_header">
|
<span>
|
||||||
<h5 class="mb-0">
|
RMA Order -
|
||||||
<span>
|
<span t-field="rma.name" />
|
||||||
RMA Order -
|
</span>
|
||||||
<span t-field="rma.name" />
|
<span style="position: absolute; left: 50%;" class="d-none d-sm-inline">
|
||||||
</span>
|
<a
|
||||||
|
t-att-href="rma.get_portal_url(report_type='pdf', download=True)"
|
||||||
|
>
|
||||||
|
<i
|
||||||
|
class="fa fa-download"
|
||||||
|
role="img"
|
||||||
|
aria-label="Download"
|
||||||
|
title="Download"
|
||||||
|
/>
|
||||||
|
</a>
|
||||||
|
</span>
|
||||||
|
<span class="float-right">
|
||||||
|
<!-- Tags -->
|
||||||
|
<t t-set="tags" t-value="rma.tag_ids.filtered('is_public')" />
|
||||||
|
<!-- We don't have the color o_tag_color_# classes available in the frontend -->
|
||||||
|
<t t-foreach="tags" t-as="tag">
|
||||||
<span
|
<span
|
||||||
style="position: absolute; left: 50%;"
|
class="badge badge-pill badge-info label-text-align"
|
||||||
class="d-none d-sm-inline"
|
t-esc="tag.name"
|
||||||
>
|
/>
|
||||||
<a
|
</t>
|
||||||
t-att-href="rma.get_portal_url(report_type='pdf', download=True)"
|
<t t-if="rma.state in ['refunded', 'returned', 'replaced']">
|
||||||
>
|
<span class="small text-success orders_label_text_align">
|
||||||
<i
|
<i class="fa fa-fw fa-check" />
|
||||||
class="fa fa-download"
|
<b>
|
||||||
role="img"
|
<span t-field="rma.state" />
|
||||||
aria-label="Download"
|
</b>
|
||||||
title="Download"
|
|
||||||
/>
|
|
||||||
</a>
|
|
||||||
</span>
|
</span>
|
||||||
<span class="float-right">
|
</t>
|
||||||
<!-- Tags -->
|
<t t-elif="rma.state in ['cancelled', 'locked']">
|
||||||
<t
|
<span class="small text-danger orders_label_text_align">
|
||||||
t-set="tags"
|
<i class="fa fa-fw fa-times" />
|
||||||
t-value="rma.tag_ids.filtered('is_public')"
|
<b>
|
||||||
/>
|
<span t-field="rma.state" />
|
||||||
<!-- We don't have the color o_tag_color_# classes available in the frontend -->
|
</b>
|
||||||
<t t-foreach="tags" t-as="tag">
|
|
||||||
<span
|
|
||||||
class="badge badge-pill badge-info label-text-align"
|
|
||||||
t-esc="tag.name"
|
|
||||||
/>
|
|
||||||
</t>
|
|
||||||
<t t-if="rma.state in ['refunded', 'returned', 'replaced']">
|
|
||||||
<span
|
|
||||||
class="small text-success orders_label_text_align"
|
|
||||||
>
|
|
||||||
<i class="fa fa-fw fa-check" />
|
|
||||||
<b>
|
|
||||||
<span t-field="rma.state" />
|
|
||||||
</b>
|
|
||||||
</span>
|
|
||||||
</t>
|
|
||||||
<t t-elif="rma.state in ['cancelled', 'locked']">
|
|
||||||
<span class="small text-danger orders_label_text_align">
|
|
||||||
<i class="fa fa-fw fa-times" />
|
|
||||||
<b>
|
|
||||||
<span t-field="rma.state" />
|
|
||||||
</b>
|
|
||||||
</span>
|
|
||||||
</t>
|
|
||||||
<t t-else="">
|
|
||||||
<span class="small text-info orders_label_text_align">
|
|
||||||
<i class="fa fa-fw fa-clock-o" />
|
|
||||||
<b>
|
|
||||||
<span t-field="rma.state" />
|
|
||||||
</b>
|
|
||||||
</span>
|
|
||||||
</t>
|
|
||||||
</span>
|
</span>
|
||||||
</h5>
|
</t>
|
||||||
</t>
|
<t t-else="">
|
||||||
<t t-set="card_body">
|
<span class="small text-info orders_label_text_align">
|
||||||
<div id="general_information">
|
<i class="fa fa-fw fa-clock-o" />
|
||||||
<div class="row mt4">
|
<b>
|
||||||
<!-- Customer -->
|
<span t-field="rma.state" />
|
||||||
<div
|
</b>
|
||||||
t-if="rma.partner_id"
|
</span>
|
||||||
class="col-12 col-md-6 mb-4 mb-md-0"
|
</t>
|
||||||
>
|
</span>
|
||||||
<h6>
|
</h5>
|
||||||
<strong>Customer:</strong>
|
<div id="general_information">
|
||||||
</h6>
|
<div class="row mt4">
|
||||||
<div class="row">
|
<!-- Customer -->
|
||||||
<div class="col flex-grow-0 pr-3">
|
<div t-if="rma.partner_id" class="col-12 col-md-6 mb-4 mb-md-0">
|
||||||
<img
|
<h6>
|
||||||
t-if="rma.partner_id.image_1024"
|
<strong>Customer:</strong>
|
||||||
class="rounded-circle mt-1 o_portal_contact_img"
|
</h6>
|
||||||
t-att-src="image_data_uri(rma.partner_id.image_1024)"
|
<div class="row">
|
||||||
alt="Contact"
|
<div class="col flex-grow-0 pr-3">
|
||||||
/>
|
<img
|
||||||
<img
|
t-if="rma.partner_id.avatar_1024"
|
||||||
t-else=""
|
class="o_avatar o_portal_contact_img rounded"
|
||||||
class="rounded-circle mt-1 o_portal_contact_img"
|
t-att-src="image_data_uri(rma.partner_id.avatar_512)"
|
||||||
src="/web/static/src/img/user_menu_avatar.png"
|
alt="Contact"
|
||||||
alt="Contact"
|
/>
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
<div class="col pl-sm-0">
|
|
||||||
<address
|
|
||||||
t-field="rma.partner_id"
|
|
||||||
t-options='{"widget": "contact", "fields": ["name", "email", "phone"]}'
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
<!-- Shipping Address -->
|
<div class="col pl-sm-0">
|
||||||
<div
|
<address
|
||||||
t-if="rma.partner_shipping_id"
|
t-field="rma.partner_id"
|
||||||
class="col-12 col-md-6 mb-4 mb-md-0"
|
t-options='{"widget": "contact", "fields": ["name", "email", "phone"]}'
|
||||||
>
|
/>
|
||||||
<h6>
|
|
||||||
<strong>Shipping address:</strong>
|
|
||||||
</h6>
|
|
||||||
<div class="row">
|
|
||||||
<div class="col flex-grow-0 pr-3">
|
|
||||||
<img
|
|
||||||
t-if="rma.partner_shipping_id.image_1024"
|
|
||||||
class="rounded-circle mt-1 o_portal_contact_img"
|
|
||||||
t-att-src="image_data_uri(rma.partner_shipping_id.image_1024)"
|
|
||||||
alt="Contact"
|
|
||||||
/>
|
|
||||||
<img
|
|
||||||
t-else=""
|
|
||||||
class="rounded-circle mt-1 o_portal_contact_img"
|
|
||||||
src="/web/static/src/img/user_menu_avatar.png"
|
|
||||||
alt="Contact"
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
<div class="col pl-sm-0">
|
|
||||||
<address
|
|
||||||
t-field="rma.partner_shipping_id"
|
|
||||||
t-options='{"widget": "contact", "fields": ["name", "email", "phone", "address"]}'
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<!-- RMA Info -->
|
|
||||||
<div t-if="rma.user_id" class="col-12 col-md-6">
|
|
||||||
<h6>
|
|
||||||
<strong>Responsible:</strong>
|
|
||||||
</h6>
|
|
||||||
<div class="row">
|
|
||||||
<div class="col flex-grow-0 pr-3">
|
|
||||||
<img
|
|
||||||
t-if="rma.user_id.image_1024"
|
|
||||||
class="rounded-circle mt-1 o_portal_contact_img"
|
|
||||||
t-att-src="image_data_uri(rma.user_id.image_1024)"
|
|
||||||
alt="Contact"
|
|
||||||
/>
|
|
||||||
<img
|
|
||||||
t-else=""
|
|
||||||
class="rounded-circle mt-1 o_portal_contact_img"
|
|
||||||
src="/web/static/src/img/user_menu_avatar.png"
|
|
||||||
alt="Contact"
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
<div class="col pl-sm-0">
|
|
||||||
<address
|
|
||||||
t-field="rma.user_id"
|
|
||||||
t-options='{"widget": "contact", "fields": ["name", "email", "phone"]}'
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="row mt32" id="product_information">
|
|
||||||
<div class="col-12 col-md-6 mb-4 mb-md-0">
|
|
||||||
<div t-if="rma.picking_id" class="row mb-2 mb-sm-1">
|
|
||||||
<div class="col-12 col-sm-4">
|
|
||||||
<strong>Origin delivery</strong>
|
|
||||||
</div>
|
|
||||||
<div class="col-12 col-sm-8">
|
|
||||||
<span t-field="rma.picking_id" />
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<!-- We need to prevent access errors if the product is
|
|
||||||
unpublished-->
|
|
||||||
<div
|
|
||||||
t-if="rma.sudo().product_id"
|
|
||||||
class="row mb-2 mb-sm-1"
|
|
||||||
>
|
|
||||||
<div class="col-12 col-sm-4">
|
|
||||||
<strong>Product</strong>
|
|
||||||
</div>
|
|
||||||
<div class="col-12 col-sm-8">
|
|
||||||
<span
|
|
||||||
t-esc="rma.sudo().product_id.display_name"
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div
|
|
||||||
t-if="rma.product_uom_qty"
|
|
||||||
class="row mb-2 mb-sm-1"
|
|
||||||
>
|
|
||||||
<div class="col-12 col-sm-4">
|
|
||||||
<strong>Quantity</strong>
|
|
||||||
</div>
|
|
||||||
<div class="col-12 col-sm-8">
|
|
||||||
<span t-field="rma.product_uom_qty" />
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div t-if="rma.delivered_qty" class="row">
|
|
||||||
<div class="col-12 col-sm-4">
|
|
||||||
<strong>Delivered quantity</strong>
|
|
||||||
</div>
|
|
||||||
<div class="col-12 col-sm-8">
|
|
||||||
<span t-field="rma.delivered_qty" />
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="col-12 col-md-6">
|
|
||||||
<div t-if="rma.date" class="row mb-2 mb-sm-1">
|
|
||||||
<div class="col-12 col-sm-4">
|
|
||||||
<strong>RMA Date</strong>
|
|
||||||
</div>
|
|
||||||
<div class="col-12 col-sm-8">
|
|
||||||
<span
|
|
||||||
t-field="rma.date"
|
|
||||||
t-options='{"widget": "date"}'
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div t-if="rma.deadline" class="row mb-2 mb-sm-1">
|
|
||||||
<div class="col-12 col-sm-4">
|
|
||||||
<strong>Deadline</strong>
|
|
||||||
</div>
|
|
||||||
<div class="col-12 col-sm-8">
|
|
||||||
<span
|
|
||||||
t-field="rma.deadline"
|
|
||||||
t-options='{"widget": "date"}'
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div t-if="rma.origin" class="row">
|
|
||||||
<div class="col-12 col-sm-4">
|
|
||||||
<strong>Origin</strong>
|
|
||||||
</div>
|
|
||||||
<div class="col-12 col-sm-8">
|
|
||||||
<span t-field="rma.origin" />
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<section
|
<!-- Shipping Address -->
|
||||||
t-if="rma.reception_move_id"
|
<div
|
||||||
id="reception_section"
|
t-if="rma.partner_shipping_id"
|
||||||
style="page-break-inside: auto;"
|
class="col-12 col-md-6 mb-4 mb-md-0"
|
||||||
class="mt32"
|
>
|
||||||
|
<h6>
|
||||||
|
<strong>Shipping address:</strong>
|
||||||
|
</h6>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col flex-grow-0 pr-3">
|
||||||
|
<img
|
||||||
|
t-if="rma.partner_shipping_id.avatar_1024"
|
||||||
|
class="o_avatar o_portal_contact_img rounded"
|
||||||
|
t-att-src="image_data_uri(rma.partner_shipping_id.avatar_512)"
|
||||||
|
alt="Contact"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<div class="col pl-sm-0">
|
||||||
|
<address
|
||||||
|
t-field="rma.partner_shipping_id"
|
||||||
|
t-options='{"widget": "contact", "fields": ["name", "email", "phone", "address"]}'
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<!-- RMA Info -->
|
||||||
|
<div t-if="rma.user_id" class="col-12 col-md-6">
|
||||||
|
<h6>
|
||||||
|
<strong>Responsible:</strong>
|
||||||
|
</h6>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col flex-grow-0 pr-3">
|
||||||
|
<img
|
||||||
|
t-if="rma.user_id.avatar_1024"
|
||||||
|
class="o_avatar o_portal_contact_img rounded"
|
||||||
|
t-att-src="image_data_uri(rma.user_id.avatar_512)"
|
||||||
|
alt="Contact"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<div class="col pl-sm-0">
|
||||||
|
<address
|
||||||
|
t-field="rma.user_id"
|
||||||
|
t-options='{"widget": "contact", "fields": ["name", "email", "phone"]}'
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="row mt32" id="product_information">
|
||||||
|
<div class="col-12 col-md-6 mb-4 mb-md-0">
|
||||||
|
<div t-if="rma.picking_id" class="row mb-2 mb-sm-1">
|
||||||
|
<div class="col-12 col-sm-4">
|
||||||
|
<strong>Origin delivery</strong>
|
||||||
|
</div>
|
||||||
|
<div class="col-12 col-sm-8">
|
||||||
|
<span t-field="rma.picking_id" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<!-- We need to prevent access errors if the product is
|
||||||
|
unpublished-->
|
||||||
|
<div t-if="rma.sudo().product_id" class="row mb-2 mb-sm-1">
|
||||||
|
<div class="col-12 col-sm-4">
|
||||||
|
<strong>Product</strong>
|
||||||
|
</div>
|
||||||
|
<div class="col-12 col-sm-8">
|
||||||
|
<span t-esc="rma.sudo().product_id.display_name" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div t-if="rma.product_uom_qty" class="row mb-2 mb-sm-1">
|
||||||
|
<div class="col-12 col-sm-4">
|
||||||
|
<strong>Quantity</strong>
|
||||||
|
</div>
|
||||||
|
<div class="col-12 col-sm-8">
|
||||||
|
<span t-field="rma.product_uom_qty" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div t-if="rma.delivered_qty" class="row">
|
||||||
|
<div class="col-12 col-sm-4">
|
||||||
|
<strong>Delivered quantity</strong>
|
||||||
|
</div>
|
||||||
|
<div class="col-12 col-sm-8">
|
||||||
|
<span t-field="rma.delivered_qty" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-12 col-md-6">
|
||||||
|
<div t-if="rma.date" class="row mb-2 mb-sm-1">
|
||||||
|
<div class="col-12 col-sm-4">
|
||||||
|
<strong>RMA Date</strong>
|
||||||
|
</div>
|
||||||
|
<div class="col-12 col-sm-8">
|
||||||
|
<span
|
||||||
|
t-field="rma.date"
|
||||||
|
t-options='{"widget": "date"}'
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div t-if="rma.deadline" class="row mb-2 mb-sm-1">
|
||||||
|
<div class="col-12 col-sm-4">
|
||||||
|
<strong>Deadline</strong>
|
||||||
|
</div>
|
||||||
|
<div class="col-12 col-sm-8">
|
||||||
|
<span
|
||||||
|
t-field="rma.deadline"
|
||||||
|
t-options='{"widget": "date"}'
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div t-if="rma.origin" class="row">
|
||||||
|
<div class="col-12 col-sm-4">
|
||||||
|
<strong>Origin</strong>
|
||||||
|
</div>
|
||||||
|
<div class="col-12 col-sm-8">
|
||||||
|
<span t-field="rma.origin" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<section
|
||||||
|
t-if="rma.reception_move_id"
|
||||||
|
id="reception_section"
|
||||||
|
style="page-break-inside: auto;"
|
||||||
|
class="mt32"
|
||||||
|
>
|
||||||
|
<strong class="d-block mb-1">Reception</strong>
|
||||||
|
<t t-set="picking" t-value="rma.reception_move_id.picking_id" />
|
||||||
|
<t
|
||||||
|
t-set="report_url"
|
||||||
|
t-value="'/my/rma/picking/pdf/%s/%s?%s' % (rma.id, picking.id, keep_query())"
|
||||||
|
/>
|
||||||
|
<a
|
||||||
|
class="list-group-item list-group-item-action d-flex flex-wrap align-items-center justify-content-between py-2 px-3"
|
||||||
|
t-att-href="report_url"
|
||||||
|
>
|
||||||
|
<div>
|
||||||
|
<i
|
||||||
|
class="fa fa-truck mr-1"
|
||||||
|
role="img"
|
||||||
|
aria-label="Download"
|
||||||
|
title="Download"
|
||||||
|
/>
|
||||||
|
<span t-esc="picking.name" class="mr-lg-3" />
|
||||||
|
<div class="d-lg-inline-block">
|
||||||
|
Date:
|
||||||
|
<span class="text-muted" t-field="picking.date" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<t t-if="picking.state == 'done'">
|
||||||
|
<span class="badge badge-success label-text-align">
|
||||||
|
<i class="fa fa-fw fa-truck" />
|
||||||
|
Shipped
|
||||||
|
</span>
|
||||||
|
</t>
|
||||||
|
<t t-if="picking.state == 'partially_available'">
|
||||||
|
<span class="badge badge-warning label-text-align">
|
||||||
|
<i class="fa fa-fw fa-clock-o" />
|
||||||
|
Partially Available
|
||||||
|
</span>
|
||||||
|
</t>
|
||||||
|
<t t-if="picking.state == 'cancel'">
|
||||||
|
<span class="badge badge-danger label-text-align">
|
||||||
|
<i class="fa fa-fw fa-times" />
|
||||||
|
Cancelled
|
||||||
|
</span>
|
||||||
|
</t>
|
||||||
|
<t
|
||||||
|
t-if="picking.state in ['draft', 'waiting', 'confirmed', 'assigned']"
|
||||||
|
>
|
||||||
|
<span class="badge badge-info label-text-align">
|
||||||
|
<i class="fa fa-fw fa-clock-o" />
|
||||||
|
Preparation
|
||||||
|
</span>
|
||||||
|
</t>
|
||||||
|
</a>
|
||||||
|
</section>
|
||||||
|
<section
|
||||||
|
t-if="rma.refund_id"
|
||||||
|
id="refund_section"
|
||||||
|
style="page-break-inside: auto;"
|
||||||
|
class="mt32"
|
||||||
|
>
|
||||||
|
<strong class="d-block mb-1">Refund</strong>
|
||||||
|
<t t-set="refund" t-value="rma.refund_id" />
|
||||||
|
<t
|
||||||
|
t-set="report_url"
|
||||||
|
t-value="refund.get_portal_url(report_type='pdf')"
|
||||||
|
/>
|
||||||
|
<a
|
||||||
|
class="list-group-item list-group-item-action d-flex flex-wrap align-items-center justify-content-between py-2 px-3"
|
||||||
|
t-att-href="report_url"
|
||||||
|
>
|
||||||
|
<div>
|
||||||
|
<i
|
||||||
|
class="fa fa-pencil-square-o mr-1"
|
||||||
|
role="img"
|
||||||
|
aria-label="Download"
|
||||||
|
title="Download"
|
||||||
|
/>
|
||||||
|
<span t-esc="refund.name" class="mr-lg-3" />
|
||||||
|
<div class="d-lg-inline-block">
|
||||||
|
Date:
|
||||||
|
<span class="text-muted" t-field="refund.invoice_date" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<span
|
||||||
|
t-if="refund.state == 'paid'"
|
||||||
|
class="small text-success orders_label_text_align"
|
||||||
|
>
|
||||||
|
<i class="fa fa-fw fa-check" />
|
||||||
|
<b>Paid</b>
|
||||||
|
</span>
|
||||||
|
<span t-else="" class="small text-info orders_label_text_align">
|
||||||
|
<i class="fa fa-fw fa-clock-o" />
|
||||||
|
<b>Waiting Payment</b>
|
||||||
|
</span>
|
||||||
|
</a>
|
||||||
|
</section>
|
||||||
|
<section
|
||||||
|
t-if="rma.delivery_move_ids"
|
||||||
|
id="reception_section"
|
||||||
|
style="page-break-inside: auto;"
|
||||||
|
class="mt32"
|
||||||
|
>
|
||||||
|
<strong class="d-block mb-1">Delivery</strong>
|
||||||
|
<ul class="list-group mb-4">
|
||||||
|
<t
|
||||||
|
t-foreach="rma.delivery_move_ids.mapped('picking_id')"
|
||||||
|
t-as="picking"
|
||||||
>
|
>
|
||||||
<strong class="d-block mb-1">Reception</strong>
|
|
||||||
<t t-set="picking" t-value="rma.reception_move_id.picking_id" />
|
|
||||||
<t
|
<t
|
||||||
t-set="report_url"
|
t-set="report_url"
|
||||||
t-value="'/my/rma/picking/pdf/%s/%s?%s' % (rma.id, picking.id, keep_query())"
|
t-value="'/my/rma/picking/pdf/%s/%s?%s' % (rma.id, picking.id, keep_query())"
|
||||||
@@ -386,134 +448,14 @@
|
|||||||
</span>
|
</span>
|
||||||
</t>
|
</t>
|
||||||
</a>
|
</a>
|
||||||
</section>
|
</t>
|
||||||
<section
|
</ul>
|
||||||
t-if="rma.refund_id"
|
</section>
|
||||||
id="refund_section"
|
<section id="description" class="mt-5" t-if="rma.description">
|
||||||
style="page-break-inside: auto;"
|
<h3 class="">Description</h3>
|
||||||
class="mt32"
|
<hr class="mt-0 mb-1" />
|
||||||
>
|
<t t-out="rma.description" />
|
||||||
<strong class="d-block mb-1">Refund</strong>
|
</section>
|
||||||
<t t-set="refund" t-value="rma.refund_id" />
|
|
||||||
<t
|
|
||||||
t-set="report_url"
|
|
||||||
t-value="refund.get_portal_url(report_type='pdf')"
|
|
||||||
/>
|
|
||||||
<a
|
|
||||||
class="list-group-item list-group-item-action d-flex flex-wrap align-items-center justify-content-between py-2 px-3"
|
|
||||||
t-att-href="report_url"
|
|
||||||
>
|
|
||||||
<div>
|
|
||||||
<i
|
|
||||||
class="fa fa-pencil-square-o mr-1"
|
|
||||||
role="img"
|
|
||||||
aria-label="Download"
|
|
||||||
title="Download"
|
|
||||||
/>
|
|
||||||
<span t-esc="refund.name" class="mr-lg-3" />
|
|
||||||
<div class="d-lg-inline-block">
|
|
||||||
Date:
|
|
||||||
<span
|
|
||||||
class="text-muted"
|
|
||||||
t-field="refund.invoice_date"
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<span
|
|
||||||
t-if="refund.state == 'paid'"
|
|
||||||
class="small text-success orders_label_text_align"
|
|
||||||
>
|
|
||||||
<i class="fa fa-fw fa-check" />
|
|
||||||
<b>Paid</b>
|
|
||||||
</span>
|
|
||||||
<span
|
|
||||||
t-else=""
|
|
||||||
class="small text-info orders_label_text_align"
|
|
||||||
>
|
|
||||||
<i class="fa fa-fw fa-clock-o" />
|
|
||||||
<b>Waiting Payment</b>
|
|
||||||
</span>
|
|
||||||
</a>
|
|
||||||
</section>
|
|
||||||
<section
|
|
||||||
t-if="rma.delivery_move_ids"
|
|
||||||
id="reception_section"
|
|
||||||
style="page-break-inside: auto;"
|
|
||||||
class="mt32"
|
|
||||||
>
|
|
||||||
<strong class="d-block mb-1">Delivery</strong>
|
|
||||||
<ul class="list-group mb-4">
|
|
||||||
<t
|
|
||||||
t-foreach="rma.delivery_move_ids.mapped('picking_id')"
|
|
||||||
t-as="picking"
|
|
||||||
>
|
|
||||||
<t
|
|
||||||
t-set="report_url"
|
|
||||||
t-value="'/my/rma/picking/pdf/%s/%s?%s' % (rma.id, picking.id, keep_query())"
|
|
||||||
/>
|
|
||||||
<a
|
|
||||||
class="list-group-item list-group-item-action d-flex flex-wrap align-items-center justify-content-between py-2 px-3"
|
|
||||||
t-att-href="report_url"
|
|
||||||
>
|
|
||||||
<div>
|
|
||||||
<i
|
|
||||||
class="fa fa-truck mr-1"
|
|
||||||
role="img"
|
|
||||||
aria-label="Download"
|
|
||||||
title="Download"
|
|
||||||
/>
|
|
||||||
<span t-esc="picking.name" class="mr-lg-3" />
|
|
||||||
<div class="d-lg-inline-block">
|
|
||||||
Date:
|
|
||||||
<span
|
|
||||||
class="text-muted"
|
|
||||||
t-field="picking.date"
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<t t-if="picking.state == 'done'">
|
|
||||||
<span
|
|
||||||
class="badge badge-success label-text-align"
|
|
||||||
>
|
|
||||||
<i class="fa fa-fw fa-truck" />
|
|
||||||
Shipped
|
|
||||||
</span>
|
|
||||||
</t>
|
|
||||||
<t t-if="picking.state == 'partially_available'">
|
|
||||||
<span
|
|
||||||
class="badge badge-warning label-text-align"
|
|
||||||
>
|
|
||||||
<i class="fa fa-fw fa-clock-o" />
|
|
||||||
Partially Available
|
|
||||||
</span>
|
|
||||||
</t>
|
|
||||||
<t t-if="picking.state == 'cancel'">
|
|
||||||
<span
|
|
||||||
class="badge badge-danger label-text-align"
|
|
||||||
>
|
|
||||||
<i class="fa fa-fw fa-times" />
|
|
||||||
Cancelled
|
|
||||||
</span>
|
|
||||||
</t>
|
|
||||||
<t
|
|
||||||
t-if="picking.state in ['draft', 'waiting', 'confirmed', 'assigned']"
|
|
||||||
>
|
|
||||||
<span class="badge badge-info label-text-align">
|
|
||||||
<i class="fa fa-fw fa-clock-o" />
|
|
||||||
Preparation
|
|
||||||
</span>
|
|
||||||
</t>
|
|
||||||
</a>
|
|
||||||
</t>
|
|
||||||
</ul>
|
|
||||||
</section>
|
|
||||||
<section id="description" class="mt-5" t-if="rma.description">
|
|
||||||
<h3 class="">Description</h3>
|
|
||||||
<hr class="mt-0 mb-1" />
|
|
||||||
<t t-out="rma.description" />
|
|
||||||
</section>
|
|
||||||
</t>
|
|
||||||
</t>
|
|
||||||
<!-- chatter -->
|
<!-- chatter -->
|
||||||
<div id="rma_communication" class="mt-4">
|
<div id="rma_communication" class="mt-4">
|
||||||
<h2>Communication</h2>
|
<h2>Communication</h2>
|
||||||
|
|||||||
@@ -37,11 +37,11 @@
|
|||||||
<field name="model">rma.tag</field>
|
<field name="model">rma.tag</field>
|
||||||
<field eval="6" name="priority" />
|
<field eval="6" name="priority" />
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<tree>
|
<list>
|
||||||
<field name="name" />
|
<field name="name" />
|
||||||
<field name="is_public" />
|
<field name="is_public" />
|
||||||
<field name="active" />
|
<field name="active" />
|
||||||
</tree>
|
</list>
|
||||||
</field>
|
</field>
|
||||||
</record>
|
</record>
|
||||||
<record id="action_rma_tag" model="ir.actions.act_window">
|
<record id="action_rma_tag" model="ir.actions.act_window">
|
||||||
|
|||||||
@@ -5,13 +5,13 @@
|
|||||||
<record id="rma_team_view_tree" model="ir.ui.view">
|
<record id="rma_team_view_tree" model="ir.ui.view">
|
||||||
<field name="model">rma.team</field>
|
<field name="model">rma.team</field>
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<tree>
|
<list>
|
||||||
<field name="sequence" widget="handle" />
|
<field name="sequence" widget="handle" />
|
||||||
<field name="name" />
|
<field name="name" />
|
||||||
<field name="user_id" />
|
<field name="user_id" />
|
||||||
<field name="company_id" groups="base.group_multi_company" />
|
<field name="company_id" groups="base.group_multi_company" />
|
||||||
<field name="company_id" column_invisible="1" />
|
<field name="company_id" column_invisible="1" />
|
||||||
</tree>
|
</list>
|
||||||
</field>
|
</field>
|
||||||
</record>
|
</record>
|
||||||
<record id="rma_team_view_form" model="ir.ui.view">
|
<record id="rma_team_view_form" model="ir.ui.view">
|
||||||
@@ -52,30 +52,32 @@
|
|||||||
<field name="id" />
|
<field name="id" />
|
||||||
<field name="name" />
|
<field name="name" />
|
||||||
<templates>
|
<templates>
|
||||||
<t t-name="kanban-box">
|
<t t-name="card" class="flex-row">
|
||||||
<div
|
<aside>
|
||||||
class="oe_kanban_global_click"
|
<field
|
||||||
style="max-width: 200px"
|
name="avatar_128"
|
||||||
>
|
widget="image"
|
||||||
<div class="o_kanban_record_top">
|
class="o_image_64_cover"
|
||||||
<img
|
alt="Avatar"
|
||||||
t-att-src="kanban_image('res.users', 'avatar_128', record.id.raw_value)"
|
/>
|
||||||
height="40"
|
</aside>
|
||||||
width="40"
|
<main class="ms-3">
|
||||||
class="oe_avatar oe_kanban_avatar_smallbox mb0"
|
<field
|
||||||
alt="Avatar"
|
name="name"
|
||||||
|
class="fw-bold fs-5"
|
||||||
|
/>
|
||||||
|
<div
|
||||||
|
class="d-flex align-items-baseline text-break"
|
||||||
|
>
|
||||||
|
<i
|
||||||
|
class="fa fa-envelope me-1"
|
||||||
|
role="img"
|
||||||
|
aria-label="Email"
|
||||||
|
title="Email"
|
||||||
/>
|
/>
|
||||||
<div
|
<field name="email" />
|
||||||
class="o_kanban_record_headings ml8"
|
|
||||||
>
|
|
||||||
<strong
|
|
||||||
class="o_kanban_record_title"
|
|
||||||
>
|
|
||||||
<field name="name" />
|
|
||||||
</strong>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</main>
|
||||||
</t>
|
</t>
|
||||||
</templates>
|
</templates>
|
||||||
</kanban>
|
</kanban>
|
||||||
@@ -115,17 +117,14 @@
|
|||||||
</page>
|
</page>
|
||||||
</notebook>
|
</notebook>
|
||||||
</sheet>
|
</sheet>
|
||||||
<div class="oe_chatter">
|
<chatter />
|
||||||
<field name="message_follower_ids" widget="mail_followers" />
|
|
||||||
<field name="message_ids" widget="mail_thread" />
|
|
||||||
</div>
|
|
||||||
</form>
|
</form>
|
||||||
</field>
|
</field>
|
||||||
</record>
|
</record>
|
||||||
<record id="rma_team_action" model="ir.actions.act_window">
|
<record id="rma_team_action" model="ir.actions.act_window">
|
||||||
<field name="name">RMA team</field>
|
<field name="name">RMA team</field>
|
||||||
<field name="res_model">rma.team</field>
|
<field name="res_model">rma.team</field>
|
||||||
<field name="view_mode">tree,form</field>
|
<field name="view_mode">list,form</field>
|
||||||
<field name="help" type="html">
|
<field name="help" type="html">
|
||||||
<p class="o_view_nocontent_smiling_face">
|
<p class="o_view_nocontent_smiling_face">
|
||||||
Click to add a new RMA.
|
Click to add a new RMA.
|
||||||
|
|||||||
@@ -103,7 +103,7 @@
|
|||||||
<field name="name">rma.view.tree</field>
|
<field name="name">rma.view.tree</field>
|
||||||
<field name="model">rma</field>
|
<field name="model">rma</field>
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<tree
|
<list
|
||||||
decoration-muted="state in ['cancelled', 'locked']"
|
decoration-muted="state in ['cancelled', 'locked']"
|
||||||
decoration-bf="state == 'draft' and product_id == False"
|
decoration-bf="state == 'draft' and product_id == False"
|
||||||
decoration-danger="deadline and (deadline < current_date)"
|
decoration-danger="deadline and (deadline < current_date)"
|
||||||
@@ -119,7 +119,7 @@
|
|||||||
<field name="deadline" />
|
<field name="deadline" />
|
||||||
<field name="finalization_id" optional="hide" />
|
<field name="finalization_id" optional="hide" />
|
||||||
<field name="state" />
|
<field name="state" />
|
||||||
</tree>
|
</list>
|
||||||
</field>
|
</field>
|
||||||
</record>
|
</record>
|
||||||
<record id="rma_view_form" model="ir.ui.view">
|
<record id="rma_view_form" model="ir.ui.view">
|
||||||
@@ -340,11 +340,7 @@
|
|||||||
groups="base.group_multi_company"
|
groups="base.group_multi_company"
|
||||||
readonly="state in ['locked', 'cancelled']"
|
readonly="state in ['locked', 'cancelled']"
|
||||||
/>
|
/>
|
||||||
<field
|
<field name="company_id" invisible="1" />
|
||||||
name="company_id"
|
|
||||||
invisible="1"
|
|
||||||
readonly="state in ['locked', 'cancelled']"
|
|
||||||
/>
|
|
||||||
</group>
|
</group>
|
||||||
</group>
|
</group>
|
||||||
<notebook>
|
<notebook>
|
||||||
@@ -373,7 +369,6 @@
|
|||||||
widget="priority"
|
widget="priority"
|
||||||
readonly="state != 'draft'"
|
readonly="state != 'draft'"
|
||||||
/>
|
/>
|
||||||
<field name="origin_split_rma_id" invisible="1" />
|
|
||||||
</group>
|
</group>
|
||||||
</group>
|
</group>
|
||||||
<group>
|
<group>
|
||||||
@@ -386,23 +381,8 @@
|
|||||||
</group>
|
</group>
|
||||||
</page>
|
</page>
|
||||||
</notebook>
|
</notebook>
|
||||||
<field name="sent" invisible="1" />
|
|
||||||
<field name="reception_move_id" invisible="1" />
|
|
||||||
<field name="refund_id" invisible="1" />
|
|
||||||
<field name="can_be_refunded" invisible="1" />
|
|
||||||
<field name="can_be_returned" invisible="1" />
|
|
||||||
<field name="can_be_replaced" invisible="1" />
|
|
||||||
<field name="can_be_split" invisible="1" />
|
|
||||||
<field name="can_be_locked" invisible="1" />
|
|
||||||
<field name="can_be_finished" invisible="1" />
|
|
||||||
<field name="commercial_partner_id" invisible="1" />
|
|
||||||
<field name="remaining_qty" invisible="1" />
|
|
||||||
</sheet>
|
</sheet>
|
||||||
<div class="oe_chatter">
|
<chatter />
|
||||||
<field name="message_follower_ids" widget="mail_followers" />
|
|
||||||
<field name="activity_ids" widget="mail_activity" />
|
|
||||||
<field name="message_ids" widget="mail_thread" />
|
|
||||||
</div>
|
|
||||||
</form>
|
</form>
|
||||||
</field>
|
</field>
|
||||||
</record>
|
</record>
|
||||||
@@ -458,7 +438,7 @@
|
|||||||
<record id="rma_action" model="ir.actions.act_window">
|
<record id="rma_action" model="ir.actions.act_window">
|
||||||
<field name="name">RMA</field>
|
<field name="name">RMA</field>
|
||||||
<field name="res_model">rma</field>
|
<field name="res_model">rma</field>
|
||||||
<field name="view_mode">tree,form,pivot,calendar,activity</field>
|
<field name="view_mode">list,form,pivot,calendar,activity</field>
|
||||||
<field name="context">{}</field>
|
<field name="context">{}</field>
|
||||||
<field name="help" type="html">
|
<field name="help" type="html">
|
||||||
<p class="o_view_nocontent_smiling_face">
|
<p class="o_view_nocontent_smiling_face">
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
# Copyright 2020 Tecnativa - Ernesto Tejeda
|
# Copyright 2020 Tecnativa - Ernesto Tejeda
|
||||||
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
|
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
|
||||||
|
|
||||||
from odoo import _, api, fields, models
|
from odoo import api, fields, models
|
||||||
from odoo.exceptions import ValidationError
|
from odoo.exceptions import ValidationError
|
||||||
|
|
||||||
|
|
||||||
@@ -40,7 +40,7 @@ class RmaReDeliveryWizard(models.TransientModel):
|
|||||||
self.ensure_one()
|
self.ensure_one()
|
||||||
rma_ids = self.env.context.get("active_ids")
|
rma_ids = self.env.context.get("active_ids")
|
||||||
if len(rma_ids) == 1 and self.product_uom_qty <= 0:
|
if len(rma_ids) == 1 and self.product_uom_qty <= 0:
|
||||||
raise ValidationError(_("Quantity must be greater than 0."))
|
raise ValidationError(self.env._("Quantity must be greater than 0."))
|
||||||
|
|
||||||
@api.model
|
@api.model
|
||||||
def default_get(self, fields_list):
|
def default_get(self, fields_list):
|
||||||
|
|||||||
@@ -18,7 +18,6 @@
|
|||||||
/>
|
/>
|
||||||
</group>
|
</group>
|
||||||
<group>
|
<group>
|
||||||
<field name="uom_category_id" invisible="1" />
|
|
||||||
<field
|
<field
|
||||||
name="product_id"
|
name="product_id"
|
||||||
invisible="type != 'replace' or rma_count > 1"
|
invisible="type != 'replace' or rma_count > 1"
|
||||||
@@ -37,8 +36,6 @@
|
|||||||
</div>
|
</div>
|
||||||
</group>
|
</group>
|
||||||
</group>
|
</group>
|
||||||
<field name="rma_count" invisible="1" />
|
|
||||||
<field name="type" invisible="1" />
|
|
||||||
<footer>
|
<footer>
|
||||||
<button
|
<button
|
||||||
name="action_deliver"
|
name="action_deliver"
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
# Copyright 2020 Tecnativa - Ernesto Tejeda
|
# Copyright 2020 Tecnativa - Ernesto Tejeda
|
||||||
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
|
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
|
||||||
|
|
||||||
from odoo import _, api, fields, models
|
from odoo import api, fields, models
|
||||||
|
|
||||||
|
|
||||||
class RmaReSplitWizard(models.TransientModel):
|
class RmaReSplitWizard(models.TransientModel):
|
||||||
@@ -60,7 +60,7 @@ class RmaReSplitWizard(models.TransientModel):
|
|||||||
self.product_uom_qty, self.product_uom
|
self.product_uom_qty, self.product_uom
|
||||||
)
|
)
|
||||||
return {
|
return {
|
||||||
"name": _("Extracted RMA"),
|
"name": self.env._("Extracted RMA"),
|
||||||
"type": "ir.actions.act_window",
|
"type": "ir.actions.act_window",
|
||||||
"view_type": "form",
|
"view_type": "form",
|
||||||
"view_mode": "form",
|
"view_mode": "form",
|
||||||
|
|||||||
@@ -14,7 +14,6 @@
|
|||||||
<div class="o_row">
|
<div class="o_row">
|
||||||
<field name="product_uom_qty" />
|
<field name="product_uom_qty" />
|
||||||
<field name="product_uom" groups="uom.group_uom" />
|
<field name="product_uom" groups="uom.group_uom" />
|
||||||
<field name="product_uom" invisible="1" />
|
|
||||||
</div>
|
</div>
|
||||||
</group>
|
</group>
|
||||||
</group>
|
</group>
|
||||||
|
|||||||
@@ -1,11 +1,12 @@
|
|||||||
# Copyright 2020 Tecnativa - Ernesto Tejeda
|
# Copyright 2020 Tecnativa - Ernesto Tejeda
|
||||||
# Copyright 2023 Michael Tietz (MT Software) <mtietz@mt-software.de>
|
# Copyright 2023 Michael Tietz (MT Software) <mtietz@mt-software.de>
|
||||||
|
# Copyright 2025 Tecnativa - Víctor Martínez
|
||||||
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
|
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
|
||||||
from copy import deepcopy
|
from copy import deepcopy
|
||||||
|
|
||||||
from odoo import _, api, fields, models
|
from odoo import api, fields, models
|
||||||
from odoo.exceptions import ValidationError
|
from odoo.exceptions import ValidationError
|
||||||
from odoo.tools import float_compare
|
from odoo.tools import float_is_zero
|
||||||
|
|
||||||
|
|
||||||
class ReturnPickingLine(models.TransientModel):
|
class ReturnPickingLine(models.TransientModel):
|
||||||
@@ -27,12 +28,13 @@ class ReturnPickingLine(models.TransientModel):
|
|||||||
|
|
||||||
def _prepare_rma_vals(self):
|
def _prepare_rma_vals(self):
|
||||||
self.ensure_one()
|
self.ensure_one()
|
||||||
|
warehouse = self.move_id.picking_id.picking_type_id.warehouse_id
|
||||||
return {
|
return {
|
||||||
"move_id": self.move_id.id,
|
"move_id": self.move_id.id,
|
||||||
"product_id": self.move_id.product_id.id,
|
"product_id": self.move_id.product_id.id,
|
||||||
"product_uom_qty": self.quantity,
|
"product_uom_qty": self.quantity,
|
||||||
"product_uom": self.product_id.uom_id.id,
|
"product_uom": self.product_id.uom_id.id,
|
||||||
"location_id": self.wizard_id.location_id.id or self.move_id.location_id.id,
|
"location_id": warehouse.rma_loc_id.id,
|
||||||
"operation_id": self.rma_operation_id.id,
|
"operation_id": self.rma_operation_id.id,
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -42,47 +44,17 @@ class ReturnPicking(models.TransientModel):
|
|||||||
|
|
||||||
create_rma = fields.Boolean(string="Create RMAs")
|
create_rma = fields.Boolean(string="Create RMAs")
|
||||||
picking_type_code = fields.Selection(related="picking_id.picking_type_id.code")
|
picking_type_code = fields.Selection(related="picking_id.picking_type_id.code")
|
||||||
rma_location_ids = fields.Many2many(
|
|
||||||
comodel_name="stock.location", compute="_compute_rma_location_id"
|
|
||||||
)
|
|
||||||
rma_operation_id = fields.Many2one(
|
rma_operation_id = fields.Many2one(
|
||||||
comodel_name="rma.operation",
|
comodel_name="rma.operation",
|
||||||
string="Requested operation",
|
string="Requested operation",
|
||||||
)
|
)
|
||||||
# Expand domain for RMAs
|
|
||||||
location_id = fields.Many2one(
|
|
||||||
domain="create_rma and [('id', 'child_of', rma_location_ids)]"
|
|
||||||
"or "
|
|
||||||
"['|', ('id', '=', original_location_id), '|', '&', "
|
|
||||||
"('return_location', '=', True), ('company_id', '=', False), '&', "
|
|
||||||
"('return_location', '=', True), ('company_id', '=', company_id)]"
|
|
||||||
)
|
|
||||||
|
|
||||||
@api.depends("picking_id")
|
|
||||||
def _compute_rma_location_id(self):
|
|
||||||
for record in self:
|
|
||||||
record.rma_location_ids = (
|
|
||||||
self.env["stock.warehouse"]
|
|
||||||
.search([("company_id", "=", record.picking_id.company_id.id)])
|
|
||||||
.rma_loc_id
|
|
||||||
)
|
|
||||||
|
|
||||||
@api.onchange("create_rma")
|
@api.onchange("create_rma")
|
||||||
def _onchange_create_rma(self):
|
def _onchange_create_rma(self):
|
||||||
if self.create_rma:
|
if self.create_rma:
|
||||||
warehouse = self.picking_id.picking_type_id.warehouse_id
|
|
||||||
self.location_id = warehouse.rma_loc_id.id
|
|
||||||
# We want to avoid setting the return move `to_refund` as it will change
|
# We want to avoid setting the return move `to_refund` as it will change
|
||||||
# the delivered quantities in the sale and set them to invoice.
|
# the delivered quantities in the sale and set them to invoice.
|
||||||
self.product_return_moves.to_refund = False
|
self.product_return_moves.to_refund = False
|
||||||
else:
|
|
||||||
# If self.create_rma is not True, the value of the location will be the
|
|
||||||
# same as assigned by default
|
|
||||||
location_id = self.picking_id.location_id.id
|
|
||||||
return_picking_type = self.picking_id.picking_type_id.return_picking_type_id
|
|
||||||
if return_picking_type.default_location_dest_id.return_location:
|
|
||||||
location_id = return_picking_type.default_location_dest_id.id
|
|
||||||
self.location_id = location_id
|
|
||||||
|
|
||||||
def _prepare_rma_partner_values(self):
|
def _prepare_rma_partner_values(self):
|
||||||
self.ensure_one()
|
self.ensure_one()
|
||||||
@@ -119,10 +91,8 @@ class ReturnPicking(models.TransientModel):
|
|||||||
for return_picking in self:
|
for return_picking in self:
|
||||||
global_vals = return_picking._prepare_rma_vals()
|
global_vals = return_picking._prepare_rma_vals()
|
||||||
for line in return_picking.product_return_moves:
|
for line in return_picking.product_return_moves:
|
||||||
if (
|
if not line.move_id or float_is_zero(
|
||||||
not line.move_id
|
line.quantity, precision_rounding=line.uom_id.rounding
|
||||||
or float_compare(line.quantity, 0, line.product_id.uom_id.rounding)
|
|
||||||
<= 0
|
|
||||||
):
|
):
|
||||||
continue
|
continue
|
||||||
vals = deepcopy(global_vals)
|
vals = deepcopy(global_vals)
|
||||||
@@ -130,7 +100,7 @@ class ReturnPicking(models.TransientModel):
|
|||||||
vals_list.append(vals)
|
vals_list.append(vals)
|
||||||
return vals_list
|
return vals_list
|
||||||
|
|
||||||
def create_returns(self):
|
def action_create_returns(self):
|
||||||
"""Override create_returns method for creating one or more
|
"""Override create_returns method for creating one or more
|
||||||
'confirmed' RMAs after return a delivery picking in case
|
'confirmed' RMAs after return a delivery picking in case
|
||||||
'Create RMAs' checkbox is checked in this wizard.
|
'Create RMAs' checkbox is checked in this wizard.
|
||||||
@@ -141,7 +111,7 @@ class ReturnPicking(models.TransientModel):
|
|||||||
if self.create_rma:
|
if self.create_rma:
|
||||||
if not self.picking_id.partner_id:
|
if not self.picking_id.partner_id:
|
||||||
raise ValidationError(
|
raise ValidationError(
|
||||||
_(
|
self.env._(
|
||||||
"You must specify the 'Customer' in the "
|
"You must specify the 'Customer' in the "
|
||||||
"'Stock Picking' from which RMAs will be created"
|
"'Stock Picking' from which RMAs will be created"
|
||||||
)
|
)
|
||||||
@@ -165,11 +135,11 @@ class ReturnPicking(models.TransientModel):
|
|||||||
}
|
}
|
||||||
)
|
)
|
||||||
return {
|
return {
|
||||||
"name": _("Returned Picking"),
|
"name": self.env._("Returned Picking"),
|
||||||
"view_mode": "form,tree,calendar",
|
"view_mode": "form,list,calendar",
|
||||||
"res_model": "stock.picking",
|
"res_model": "stock.picking",
|
||||||
"res_id": picking.id,
|
"res_id": picking.id,
|
||||||
"type": "ir.actions.act_window",
|
"type": "ir.actions.act_window",
|
||||||
"context": ctx,
|
"context": ctx,
|
||||||
}
|
}
|
||||||
return super().create_returns()
|
return super().action_create_returns()
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
<field name="model">stock.return.picking</field>
|
<field name="model">stock.return.picking</field>
|
||||||
<field name="inherit_id" ref="stock.view_stock_return_picking_form" />
|
<field name="inherit_id" ref="stock.view_stock_return_picking_form" />
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<xpath expr="//field[@name='product_return_moves']//tree" position="inside">
|
<xpath expr="//field[@name='product_return_moves']//list" position="inside">
|
||||||
<field
|
<field
|
||||||
name="rma_operation_id"
|
name="rma_operation_id"
|
||||||
required="parent.create_rma and quantity>0"
|
required="parent.create_rma and quantity>0"
|
||||||
@@ -22,10 +22,6 @@
|
|||||||
invisible="picking_type_code != 'outgoing'"
|
invisible="picking_type_code != 'outgoing'"
|
||||||
/>
|
/>
|
||||||
<field name="rma_operation_id" invisible="not create_rma" />
|
<field name="rma_operation_id" invisible="not create_rma" />
|
||||||
<field name="rma_location_ids" invisible="1" />
|
|
||||||
<field name="picking_id" invisible="1" />
|
|
||||||
<field name="picking_type_code" invisible="1" />
|
|
||||||
<field name="location_id" invisible="1" />
|
|
||||||
</group>
|
</group>
|
||||||
</field>
|
</field>
|
||||||
</field>
|
</field>
|
||||||
|
|||||||
Reference in New Issue
Block a user