[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:
Víctor Martínez
2025-02-10 17:42:22 +01:00
parent 5e54061217
commit a70bf4951e
32 changed files with 509 additions and 1874 deletions

View File

@@ -5,7 +5,7 @@
{
"name": "Return Merchandise Authorization Management",
"summary": "Return Merchandise Authorization (RMA)",
"version": "17.0.2.0.0",
"version": "18.0.1.0.0",
"development_status": "Production/Stable",
"category": "RMA",
"website": "https://github.com/OCA/rma",

View File

@@ -1,5 +1,5 @@
# 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).
from odoo import _, exceptions, http
@@ -17,9 +17,7 @@ class PortalRma(CustomerPortal):
if "rma_count" in counters:
rma_model = request.env["rma"]
rma_count = (
rma_model.search_count([])
if rma_model.check_access_rights("read", raise_exception=False)
else 0
rma_model.search_count([]) if rma_model.has_access("read") else 0
)
values["rma_count"] = rma_count
return values
@@ -43,7 +41,7 @@ class PortalRma(CustomerPortal):
values = self._prepare_portal_layout_values()
rma_obj = request.env["rma"]
# 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")
domain = self._get_filter_domain(kw)
searchbar_sortings = {
@@ -137,8 +135,7 @@ class PortalRma(CustomerPortal):
picking = request.env["stock.picking"].browse([picking_id])
picking_sudo = picking.sudo()
try:
picking.check_access_rights("read")
picking.check_access_rule("read")
picking.check_access("read")
except exceptions.AccessError:
if not access_token or not consteq(rma.access_token, access_token):
raise

View File

@@ -2301,246 +2301,3 @@ msgid ""
msgstr ""
"{{object.company_id.name}} Ihre RMA wurde erfolgreich erstellt (Ref {{object."
"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"

View File

@@ -2360,266 +2360,3 @@ msgid ""
msgstr ""
"{{object.company_id.name}} Su RMA se ha creado con éxito (Ref {{object.name "
"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)"

View File

@@ -2341,48 +2341,3 @@ msgid ""
msgstr ""
"{{object.company_id.name}} Votre RMA a été crée avec succès(Ref {{object."
"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."

View File

@@ -2351,297 +2351,3 @@ msgid ""
msgstr ""
"{{object.company_id.name}} La vostra RMA è stata creata con successo (rif. "
"{{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"

View File

@@ -2205,155 +2205,3 @@ msgid ""
"{{object.company_id.name}} Your RMA has been succesfully created (Ref "
"{{object.name or 'n/a' }})"
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"

View File

@@ -2202,145 +2202,3 @@ msgid ""
"{{object.company_id.name}} Your RMA has been succesfully created (Ref "
"{{object.name or 'n/a' }})"
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"

View File

@@ -2188,122 +2188,3 @@ msgid ""
"{{object.company_id.name}} Your RMA has been succesfully created (Ref "
"{{object.name or 'n/a' }})"
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."

View File

@@ -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)

View File

@@ -1,7 +1,7 @@
# Copyright 2020 Tecnativa - Ernesto Tejeda
# 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.tools import float_compare
@@ -33,7 +33,7 @@ class AccountMove(models.Model):
"""
if self._check_rma_invoice_lines_qty():
raise ValidationError(
_(
self.env._(
"There is at least one invoice lines whose quantity is "
"less than the quantity specified in its linked RMA."
)

View File

@@ -2,7 +2,7 @@
# Copyright 2023 Tecnativa - Pedro M. Baeza
# 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):
@@ -79,7 +79,7 @@ class ResCompany(models.Model):
.sudo()
.create(
{
"name": _("RMA Code"),
"name": self.env._("RMA Code"),
"prefix": "RMA",
"code": "rma",
"padding": 4,

View File

@@ -21,6 +21,7 @@ class ResConfigSettings(models.TransientModel):
)
rma_mail_confirmation_template_id = fields.Many2one(
related="company_id.rma_mail_confirmation_template_id",
domain="[('model', '=', 'rma')]",
readonly=False,
)
send_rma_receipt_confirmation = fields.Boolean(
@@ -29,6 +30,7 @@ class ResConfigSettings(models.TransientModel):
)
rma_mail_receipt_confirmation_template_id = fields.Many2one(
related="company_id.rma_mail_receipt_confirmation_template_id",
domain="[('model', '=', 'rma')]",
readonly=False,
)
send_rma_draft_confirmation = fields.Boolean(
@@ -37,5 +39,6 @@ class ResConfigSettings(models.TransientModel):
)
rma_mail_draft_confirmation_template_id = fields.Many2one(
related="company_id.rma_mail_draft_confirmation_template_id",
domain="[('model', '=', 'rma')]",
readonly=False,
)

View File

@@ -9,7 +9,7 @@ from itertools import groupby
from markupsafe import Markup
from odoo import _, api, fields, models
from odoo import api, fields, models
from odoo.exceptions import AccessError, ValidationError
from odoo.tools import html2plaintext
@@ -40,7 +40,7 @@ class Rma(models.Model):
name = fields.Char(
index=True,
copy=False,
default=lambda self: _("New"),
default=lambda self: self.env._("New"),
)
origin = fields.Char(
string="Source Document",
@@ -314,9 +314,7 @@ class Rma(models.Model):
for r in self:
r.remaining_qty = r.product_uom_qty - r.delivered_qty
@api.depends(
"state",
)
@api.depends("state")
def _compute_can_be_refunded(self):
"""Compute 'can_be_refunded'. This field controls the visibility
of 'Refund' button in the rma form view and determinates if
@@ -497,7 +495,7 @@ class Rma(models.Model):
@api.model_create_multi
def create(self, 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"]
if "company_id" in vals:
ir_sequence = ir_sequence.with_company(vals["company_id"])
@@ -514,18 +512,19 @@ class Rma(models.Model):
return rmas
def copy(self, default=None):
team = super().copy(default)
for follower in self.message_follower_ids:
team.message_subscribe(
new_rmas = super().copy(default)
for old_rma, new_rma in zip(self, new_rmas, strict=False):
for follower in old_rma.message_follower_ids:
new_rma.message_subscribe(
partner_ids=follower.partner_id.ids,
subtype_ids=follower.subtype_ids.ids,
)
return team
return new_rmas
def unlink(self):
if self.filtered(lambda r: r.state != "draft"):
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()
@@ -601,10 +600,6 @@ class Rma(models.Model):
if self.partner_id and self.partner_id not in self.message_partner_ids:
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):
return {
"move_type": "direct",
@@ -643,7 +638,7 @@ class Rma(models.Model):
procurements = []
group_model = self.env["procurement.group"]
for rma in self:
if not rma._product_is_storable():
if not rma.product_id.is_storable:
continue
group = rma.procurement_group_id
if not group:
@@ -824,7 +819,7 @@ class Rma(models.Model):
"""Invoked when 'Refund' smart button in rma form view is clicked."""
self.ensure_one()
return {
"name": _("Refund"),
"name": self.env._("Refund"),
"type": "ir.actions.act_window",
"view_type": "form",
"view_mode": "form",
@@ -873,7 +868,7 @@ class Rma(models.Model):
)
desc += f"\n{field_record.field_description}"
if desc:
raise ValidationError(_("Required field(s):%s") % desc)
raise ValidationError(self.env._("Required field(s):%s") % desc)
def _ensure_can_be_returned(self):
"""This method is intended to be invoked after user click on
@@ -888,9 +883,11 @@ class Rma(models.Model):
"""
if len(self) == 1:
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"):
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):
"""This method is intended to be invoked after user click on
@@ -903,10 +900,12 @@ class Rma(models.Model):
"""
if len(self) == 1:
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"):
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):
@@ -917,7 +916,7 @@ class Rma(models.Model):
"""
self.ensure_one()
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):
"""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)
if qty > self.remaining_qty:
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):
@@ -940,7 +941,7 @@ class Rma(models.Model):
to_split_uom_qty = uom._compute_quantity(qty, self.product_uom)
if to_split_uom_qty > self.remaining_qty:
raise ValidationError(
_(
self.env._(
"Quantity to extract cannot be greater than remaining"
" delivery quantity (%(remaining_qty)s %(product_uom)s)"
)
@@ -980,7 +981,7 @@ class Rma(models.Model):
)
self.message_post(
body=Markup(
_(
self.env._(
'Split: <a href="#" data-oe-model="rma" '
'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_qty_to_return(qty, uom)
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(
scheduled_date, qty, uom
@@ -1116,7 +1117,7 @@ class Rma(models.Model):
pickings[picking] |= rma
rma.message_post(
body=Markup(
_(
self.env._(
'Return: <a href="#" data-oe-model="stock.picking" '
'data-oe-id="%(id)d">%(name)s</a> has been created.'
)
@@ -1146,7 +1147,7 @@ class Rma(models.Model):
procurements = []
group_model = self.env["procurement.group"]
for rma in self:
if not rma._product_is_storable(product):
if not product.is_storable:
continue
if not rma.procurement_group_id:
@@ -1186,7 +1187,7 @@ class Rma(models.Model):
# MRP BoM Kits
for new_move in new_moves:
body += Markup(
_(
self.env._(
'Replacement: Move <a href="#" data-oe-model="stock.move"'
' data-oe-id="%(move_id)d">%(move_name)s</a> (Picking <a'
' href="#" data-oe-model="stock.picking"'
@@ -1212,7 +1213,7 @@ class Rma(models.Model):
self.message_post(
body=body
or Markup(
_(
self.env._(
"Replacement:<br/>"
'Product <a href="#" data-oe-model="product.product" '
'data-oe-id="%(id)d">%(name)s</a><br/>'
@@ -1255,14 +1256,14 @@ class Rma(models.Model):
custom_values = {}
subject = msg_dict.get("subject", "")
body = html2plaintext(msg_dict.get("body", ""))
desc = _(
desc = self.env._(
"<b>E-mail subject:</b> %(subject)s<br/><br/><b>E-mail"
" body:</b><br/>%(body)s"
) % ({"subject": subject, "body": body})
defaults = {
"description": desc,
"name": _("New"),
"origin": _("Incoming e-mail"),
"name": self.env._("New"),
"origin": self.env._("Incoming e-mail"),
}
if 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:
for record in self.filtered("partner_id"):
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
_logger.debug(e)
@@ -1307,7 +1308,7 @@ class Rma(models.Model):
# Reporting business methods
def _get_report_base_filename(self):
self.ensure_one()
return "RMA Report - %s" % self.name
return f"RMA Report - {self.name}"
# Other business methods

View File

@@ -3,7 +3,7 @@
import ast
from odoo import _, fields, models
from odoo import fields, models
class RmaTeam(models.Model):
@@ -40,18 +40,17 @@ class RmaTeam(models.Model):
)
def copy(self, default=None):
self.ensure_one()
if default is None:
default = {}
default = dict(default or {})
new_teams = super().copy(default)
for old_team, new_team in zip(self, new_teams, strict=False):
if not default.get("name"):
default["name"] = _("%s (copy)") % self.name
team = super().copy(default)
for follower in self.message_follower_ids:
team.message_subscribe(
new_team.name = self.env._("%s (copy)") % old_team.name
for follower in old_team.message_follower_ids:
new_team.message_subscribe(
partner_ids=follower.partner_id.ids,
subtype_ids=follower.subtype_ids.ids,
)
return team
return new_teams
def _alias_get_creation_values(self):
values = super()._alias_get_creation_values()

View File

@@ -2,7 +2,7 @@
# Copyright 2023 Michael Tietz (MT Software) <mtietz@mt-software.de>
# 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.tools import float_compare
@@ -72,7 +72,7 @@ class StockMove(models.Model):
!= 0
):
raise ValidationError(
_(
self.env._(
"The quantity done for the product '%(id)s' must "
"be equal to its initial demand because the "
"stock move is linked to an RMA (%(name)s)."

View File

@@ -16,18 +16,6 @@ class StockPicking(models.Model):
for rec in self:
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):
self.ensure_one()
action = self.env["ir.actions.act_window"]._for_xml_id("rma.rma_action")

View File

@@ -2,7 +2,7 @@
# Copyright 2023 Michael Tietz (MT Software) <mtietz@mt-software.de>
# 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):
@@ -19,17 +19,24 @@ class StockWarehouse(models.Model):
rma_in_type_id = fields.Many2one(
comodel_name="stock.picking.type",
string="RMA In Type",
check_company=True,
copy=False,
)
rma_out_type_id = fields.Many2one(
comodel_name="stock.picking.type",
string="RMA Out Type",
check_company=True,
copy=False,
)
rma_loc_id = fields.Many2one(
comodel_name="stock.location",
string="RMA Location",
comodel_name="stock.location", string="RMA Location", check_company=True
)
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):
"""this method is intended to be used by 'create' method
@@ -49,7 +56,6 @@ class StockWarehouse(models.Model):
return {
"name": view_location.name,
"active": True,
"return_location": True,
"usage": "internal",
"company_id": company_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):
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(
{
"rma_in_type_id": {
"name": self.name + " " + _("Sequence RMA in"),
"prefix": self.code + "/RMA/IN/",
"name": name + " " + self.env._("Sequence RMA in"),
"prefix": code + "/RMA/IN/",
"padding": 5,
"company_id": self.company_id.id,
},
"rma_out_type_id": {
"name": self.name + " " + _("Sequence RMA out"),
"prefix": self.code + "/RMA/OUT/",
"name": name + " " + self.env._("Sequence RMA out"),
"prefix": code + "/RMA/OUT/",
"padding": 5,
"company_id": self.company_id.id,
},
@@ -96,23 +104,21 @@ class StockWarehouse(models.Model):
data.update(
{
"rma_in_type_id": {
"name": _("RMA Receipts"),
"name": self.env._("RMA Receipts"),
"code": "incoming",
"use_create_lots": False,
"use_existing_lots": True,
"default_location_src_id": False,
"default_location_dest_id": self.rma_loc_id.id,
"sequence": max_sequence + 1,
"sequence_code": "RMA/IN",
"company_id": self.company_id.id,
},
"rma_out_type_id": {
"name": _("RMA Delivery Orders"),
"name": self.env._("RMA Delivery Orders"),
"code": "outgoing",
"use_create_lots": False,
"use_existing_lots": True,
"default_location_src_id": self.rma_loc_id.id,
"default_location_dest_id": False,
"sequence": max_sequence + 2,
"sequence_code": "RMA/OUT",
"company_id": self.company_id.id,

View File

@@ -71,25 +71,19 @@
<field name="name">RMA multi-company</field>
<field name="model_id" ref="model_rma" />
<field name="global" eval="True" />
<field
name="domain_force"
>['|',('company_id','=',False),('company_id','in',company_ids)]</field>
<field name="domain_force">[('company_id', 'in', company_ids + [False])]</field>
</record>
<record id="rma_team_rule_multi_company" model="ir.rule">
<field name="name">RMA team multi-company</field>
<field name="model_id" ref="model_rma_team" />
<field name="global" eval="True" />
<field
name="domain_force"
>['|',('company_id','=',False),('company_id','in',company_ids)]</field>
<field name="domain_force">[('company_id', 'in', company_ids + [False])]</field>
</record>
<record id="rma_finalization_comp_rule" model="ir.rule">
<field name="name">RMA Finalization Reason multi-company</field>
<field name="model_id" ref="model_rma_finalization" />
<field name="global" eval="True" />
<field
name="domain_force"
> ['|', ('company_id', 'in', company_ids), ('company_id', '=', False)]</field>
<field name="domain_force">[('company_id', 'in', company_ids + [False])]</field>
</record>
<!-- Allow to refund RMAs -->
<record id="rma_account_move_personal_rule" model="ir.rule">

View File

@@ -1,5 +1,6 @@
# Copyright 2020 Tecnativa - Ernesto Tejeda
# 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).
from odoo.exceptions import UserError, ValidationError
@@ -28,7 +29,7 @@ class TestRma(BaseCommon):
)
cls.rma_loc = cls.warehouse_company.rma_loc_id
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(
{
@@ -123,7 +124,7 @@ class TestRma(BaseCommon):
move.product_uom_qty = 10
with picking_form.move_ids_without_package.new() as move:
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
picking = picking_form.save()
@@ -169,14 +170,44 @@ class TestRmaCase(TestRma):
wizard_form.product_uom_qty = rma.product_uom_qty
wizard = wizard_form.save()
wizard.action_deliver()
self.assertEqual(rma.delivery_picking_count, 2)
out_pickings = rma.mapped("delivery_move_ids.picking_id")
self.assertIn(
self.warehouse.pick_type_id, out_pickings.mapped("picking_type_id")
)
self.assertIn(
self.warehouse.out_type_id, out_pickings.mapped("picking_type_id")
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.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):
# If partner changes, the invoice address is set
@@ -193,7 +224,12 @@ class TestRmaCase(TestRma):
}
)
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(
[
@@ -305,6 +341,7 @@ class TestRmaCase(TestRma):
self.assertEqual(rma_2.state, "received")
@users("__system__", "user_rma")
@mute_logger("odoo.models.unlink")
def test_action_refund(self):
rma = self._create_confirm_receive(self.partner, self.product, 10, self.rma_loc)
self.assertEqual(rma.state, "received")
@@ -339,6 +376,7 @@ class TestRmaCase(TestRma):
self.assertFalse(rma.can_be_returned)
self.assertFalse(rma.can_be_replaced)
@mute_logger("odoo.models.unlink")
def test_mass_refund(self):
# Create, confirm and receive rma_1
rma_1 = self._create_confirm_receive(
@@ -351,7 +389,7 @@ class TestRmaCase(TestRma):
)
# rma_3: Same partner and different product than rma_1
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_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)
# Replace with another product with quantity 2.
product_2 = self.product_product.create(
{"name": "Product 2 test", "type": "product"}
{"name": "Product 2 test", "type": "consu", "is_storable": True}
)
delivery_form = Form(
self.env["rma.delivery.wizard"].with_context(
@@ -450,7 +488,7 @@ class TestRmaCase(TestRma):
picking = first_move.picking_id
# Replace again with another product with the remaining quantity
product_3 = self.product_product.create(
{"name": "Product 3 test", "type": "product"}
{"name": "Product 3 test", "type": "consu", "is_storable": True}
)
delivery_form = Form(
self.env["rma.delivery.wizard"].with_context(
@@ -572,7 +610,7 @@ class TestRmaCase(TestRma):
)
# rma_3: Same partner and different product than rma_1
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_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
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_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.rma_operation_id = self.operation
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
origin_moves = origin_delivery.move_ids
self.assertTrue(origin_moves[0].rma_ids)

View File

@@ -78,7 +78,6 @@
name="rma_mail_confirmation_template_id"
class="oe_inline"
required="send_rma_confirmation"
context="{'default_model': 'rma'}"
/>
</div>
</div>
@@ -116,7 +115,6 @@
name="rma_mail_receipt_confirmation_template_id"
class="oe_inline"
required="send_rma_receipt_confirmation"
context="{'default_model': 'rma'}"
/>
</div>
</div>
@@ -154,7 +152,6 @@
name="rma_mail_draft_confirmation_template_id"
class="oe_inline"
required="send_rma_draft_confirmation"
context="{'default_model': 'rma'}"
/>
</div>
</div>

View File

@@ -45,11 +45,11 @@
<field name="model">rma.finalization</field>
<field eval="6" name="priority" />
<field name="arch" type="xml">
<tree>
<list>
<field name="name" />
<field name="company_id" groups="base.group_multi_company" />
<field name="company_id" invisible="1" />
</tree>
</list>
</field>
</record>
<record id="action_rma_finalization" model="ir.actions.act_window">

View File

@@ -73,7 +73,7 @@
<span t-field="rma.product_uom_qty" />
</td>
<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>
</td>
@@ -93,17 +93,12 @@
/>
</t>
</t>
<t t-call="portal.portal_record_layout">
<t t-set="card_header">
<h5 class="mb-0">
<span>
RMA Order -
<span t-field="rma.name" />
</span>
<span
style="position: absolute; left: 50%;"
class="d-none d-sm-inline"
>
<span style="position: absolute; left: 50%;" class="d-none d-sm-inline">
<a
t-att-href="rma.get_portal_url(report_type='pdf', download=True)"
>
@@ -117,10 +112,7 @@
</span>
<span class="float-right">
<!-- Tags -->
<t
t-set="tags"
t-value="rma.tag_ids.filtered('is_public')"
/>
<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
@@ -129,9 +121,7 @@
/>
</t>
<t t-if="rma.state in ['refunded', 'returned', 'replaced']">
<span
class="small text-success orders_label_text_align"
>
<span class="small text-success orders_label_text_align">
<i class="fa fa-fw fa-check" />
<b>
<span t-field="rma.state" />
@@ -156,30 +146,19 @@
</t>
</span>
</h5>
</t>
<t t-set="card_body">
<div id="general_information">
<div class="row mt4">
<!-- Customer -->
<div
t-if="rma.partner_id"
class="col-12 col-md-6 mb-4 mb-md-0"
>
<div t-if="rma.partner_id" class="col-12 col-md-6 mb-4 mb-md-0">
<h6>
<strong>Customer:</strong>
</h6>
<div class="row">
<div class="col flex-grow-0 pr-3">
<img
t-if="rma.partner_id.image_1024"
class="rounded-circle mt-1 o_portal_contact_img"
t-att-src="image_data_uri(rma.partner_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"
t-if="rma.partner_id.avatar_1024"
class="o_avatar o_portal_contact_img rounded"
t-att-src="image_data_uri(rma.partner_id.avatar_512)"
alt="Contact"
/>
</div>
@@ -202,15 +181,9 @@
<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"
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>
@@ -230,15 +203,9 @@
<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"
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>
@@ -263,23 +230,15 @@
</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 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"
/>
<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 t-if="rma.product_uom_qty" class="row mb-2 mb-sm-1">
<div class="col-12 col-sm-4">
<strong>Quantity</strong>
</div>
@@ -413,10 +372,7 @@
<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"
/>
<span class="text-muted" t-field="refund.invoice_date" />
</div>
</div>
<span
@@ -426,10 +382,7 @@
<i class="fa fa-fw fa-check" />
<b>Paid</b>
</span>
<span
t-else=""
class="small text-info orders_label_text_align"
>
<span t-else="" class="small text-info orders_label_text_align">
<i class="fa fa-fw fa-clock-o" />
<b>Waiting Payment</b>
</span>
@@ -465,32 +418,23 @@
<span t-esc="picking.name" class="mr-lg-3" />
<div class="d-lg-inline-block">
Date:
<span
class="text-muted"
t-field="picking.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"
>
<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"
>
<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"
>
<span class="badge badge-danger label-text-align">
<i class="fa fa-fw fa-times" />
Cancelled
</span>
@@ -512,8 +456,6 @@
<hr class="mt-0 mb-1" />
<t t-out="rma.description" />
</section>
</t>
</t>
<!-- chatter -->
<div id="rma_communication" class="mt-4">
<h2>Communication</h2>

View File

@@ -37,11 +37,11 @@
<field name="model">rma.tag</field>
<field eval="6" name="priority" />
<field name="arch" type="xml">
<tree>
<list>
<field name="name" />
<field name="is_public" />
<field name="active" />
</tree>
</list>
</field>
</record>
<record id="action_rma_tag" model="ir.actions.act_window">

View File

@@ -5,13 +5,13 @@
<record id="rma_team_view_tree" model="ir.ui.view">
<field name="model">rma.team</field>
<field name="arch" type="xml">
<tree>
<list>
<field name="sequence" widget="handle" />
<field name="name" />
<field name="user_id" />
<field name="company_id" groups="base.group_multi_company" />
<field name="company_id" column_invisible="1" />
</tree>
</list>
</field>
</record>
<record id="rma_team_view_form" model="ir.ui.view">
@@ -52,30 +52,32 @@
<field name="id" />
<field name="name" />
<templates>
<t t-name="kanban-box">
<div
class="oe_kanban_global_click"
style="max-width: 200px"
>
<div class="o_kanban_record_top">
<img
t-att-src="kanban_image('res.users', 'avatar_128', record.id.raw_value)"
height="40"
width="40"
class="oe_avatar oe_kanban_avatar_smallbox mb0"
<t t-name="card" class="flex-row">
<aside>
<field
name="avatar_128"
widget="image"
class="o_image_64_cover"
alt="Avatar"
/>
</aside>
<main class="ms-3">
<field
name="name"
class="fw-bold fs-5"
/>
<div
class="o_kanban_record_headings ml8"
class="d-flex align-items-baseline text-break"
>
<strong
class="o_kanban_record_title"
>
<field name="name" />
</strong>
</div>
</div>
<i
class="fa fa-envelope me-1"
role="img"
aria-label="Email"
title="Email"
/>
<field name="email" />
</div>
</main>
</t>
</templates>
</kanban>
@@ -115,17 +117,14 @@
</page>
</notebook>
</sheet>
<div class="oe_chatter">
<field name="message_follower_ids" widget="mail_followers" />
<field name="message_ids" widget="mail_thread" />
</div>
<chatter />
</form>
</field>
</record>
<record id="rma_team_action" model="ir.actions.act_window">
<field name="name">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">
<p class="o_view_nocontent_smiling_face">
Click to add a new RMA.

View File

@@ -103,7 +103,7 @@
<field name="name">rma.view.tree</field>
<field name="model">rma</field>
<field name="arch" type="xml">
<tree
<list
decoration-muted="state in ['cancelled', 'locked']"
decoration-bf="state == 'draft' and product_id == False"
decoration-danger="deadline and (deadline &lt; current_date)"
@@ -119,7 +119,7 @@
<field name="deadline" />
<field name="finalization_id" optional="hide" />
<field name="state" />
</tree>
</list>
</field>
</record>
<record id="rma_view_form" model="ir.ui.view">
@@ -340,11 +340,7 @@
groups="base.group_multi_company"
readonly="state in ['locked', 'cancelled']"
/>
<field
name="company_id"
invisible="1"
readonly="state in ['locked', 'cancelled']"
/>
<field name="company_id" invisible="1" />
</group>
</group>
<notebook>
@@ -373,7 +369,6 @@
widget="priority"
readonly="state != 'draft'"
/>
<field name="origin_split_rma_id" invisible="1" />
</group>
</group>
<group>
@@ -386,23 +381,8 @@
</group>
</page>
</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>
<div class="oe_chatter">
<field name="message_follower_ids" widget="mail_followers" />
<field name="activity_ids" widget="mail_activity" />
<field name="message_ids" widget="mail_thread" />
</div>
<chatter />
</form>
</field>
</record>
@@ -458,7 +438,7 @@
<record id="rma_action" model="ir.actions.act_window">
<field name="name">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="help" type="html">
<p class="o_view_nocontent_smiling_face">

View File

@@ -1,7 +1,7 @@
# Copyright 2020 Tecnativa - Ernesto Tejeda
# 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
@@ -40,7 +40,7 @@ class RmaReDeliveryWizard(models.TransientModel):
self.ensure_one()
rma_ids = self.env.context.get("active_ids")
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
def default_get(self, fields_list):

View File

@@ -18,7 +18,6 @@
/>
</group>
<group>
<field name="uom_category_id" invisible="1" />
<field
name="product_id"
invisible="type != 'replace' or rma_count > 1"
@@ -37,8 +36,6 @@
</div>
</group>
</group>
<field name="rma_count" invisible="1" />
<field name="type" invisible="1" />
<footer>
<button
name="action_deliver"

View File

@@ -1,7 +1,7 @@
# Copyright 2020 Tecnativa - Ernesto Tejeda
# 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):
@@ -60,7 +60,7 @@ class RmaReSplitWizard(models.TransientModel):
self.product_uom_qty, self.product_uom
)
return {
"name": _("Extracted RMA"),
"name": self.env._("Extracted RMA"),
"type": "ir.actions.act_window",
"view_type": "form",
"view_mode": "form",

View File

@@ -14,7 +14,6 @@
<div class="o_row">
<field name="product_uom_qty" />
<field name="product_uom" groups="uom.group_uom" />
<field name="product_uom" invisible="1" />
</div>
</group>
</group>

View File

@@ -1,11 +1,12 @@
# Copyright 2020 Tecnativa - Ernesto Tejeda
# 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).
from copy import deepcopy
from odoo import _, api, fields, models
from odoo import api, fields, models
from odoo.exceptions import ValidationError
from odoo.tools import float_compare
from odoo.tools import float_is_zero
class ReturnPickingLine(models.TransientModel):
@@ -27,12 +28,13 @@ class ReturnPickingLine(models.TransientModel):
def _prepare_rma_vals(self):
self.ensure_one()
warehouse = self.move_id.picking_id.picking_type_id.warehouse_id
return {
"move_id": self.move_id.id,
"product_id": self.move_id.product_id.id,
"product_uom_qty": self.quantity,
"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,
}
@@ -42,47 +44,17 @@ class ReturnPicking(models.TransientModel):
create_rma = fields.Boolean(string="Create RMAs")
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(
comodel_name="rma.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")
def _onchange_create_rma(self):
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
# the delivered quantities in the sale and set them to invoice.
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):
self.ensure_one()
@@ -119,10 +91,8 @@ class ReturnPicking(models.TransientModel):
for return_picking in self:
global_vals = return_picking._prepare_rma_vals()
for line in return_picking.product_return_moves:
if (
not line.move_id
or float_compare(line.quantity, 0, line.product_id.uom_id.rounding)
<= 0
if not line.move_id or float_is_zero(
line.quantity, precision_rounding=line.uom_id.rounding
):
continue
vals = deepcopy(global_vals)
@@ -130,7 +100,7 @@ class ReturnPicking(models.TransientModel):
vals_list.append(vals)
return vals_list
def create_returns(self):
def action_create_returns(self):
"""Override create_returns method for creating one or more
'confirmed' RMAs after return a delivery picking in case
'Create RMAs' checkbox is checked in this wizard.
@@ -141,7 +111,7 @@ class ReturnPicking(models.TransientModel):
if self.create_rma:
if not self.picking_id.partner_id:
raise ValidationError(
_(
self.env._(
"You must specify the 'Customer' in the "
"'Stock Picking' from which RMAs will be created"
)
@@ -165,11 +135,11 @@ class ReturnPicking(models.TransientModel):
}
)
return {
"name": _("Returned Picking"),
"view_mode": "form,tree,calendar",
"name": self.env._("Returned Picking"),
"view_mode": "form,list,calendar",
"res_model": "stock.picking",
"res_id": picking.id,
"type": "ir.actions.act_window",
"context": ctx,
}
return super().create_returns()
return super().action_create_returns()

View File

@@ -8,7 +8,7 @@
<field name="model">stock.return.picking</field>
<field name="inherit_id" ref="stock.view_stock_return_picking_form" />
<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
name="rma_operation_id"
required="parent.create_rma and quantity>0"
@@ -22,10 +22,6 @@
invisible="picking_type_code != 'outgoing'"
/>
<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>
</field>
</field>