Initial import pre-upgrade for bemade_quotation_alternative:18.0

This commit is contained in:
Denis Durepos 2025-09-19 13:45:28 -04:00
parent f6cdd94f5f
commit 3cc5889ea4
10 changed files with 285 additions and 0 deletions

View file

@ -0,0 +1,4 @@
# -*- coding: utf-8 -*-
from . import wizard
from . import models

View file

@ -0,0 +1,37 @@
# -*- coding: utf-8 -*-
{
'name': "Create Quotation Alternative",
'summary': """
Short (1 phrase/line) summary of the module's purpose, used as
subtitle on modules listing or apps.openerp.com""",
'description': """
Long description of module's purpose
""",
'author': "Bemade.org",
'website': "https://odoo.bemade.org",
'license': 'LGPL-3',
# Categories can be used to filter modules in modules listing
# Check https://github.com/odoo/odoo/blob/15.0/odoo/addons/base/data/ir_module_category_data.xml
# for the full list
'category': 'Uncategorized',
'version': '17.0.1.0.0',
# any module necessary for this one to work correctly
'depends': [
'sale_management'
],
# always loaded
'data': [
'security/ir.model.access.csv',
'views/sale_order_views.xml',
'wizard/sale_order_duplication_wizard_view.xml',
],
# only loaded in demonstration mode
'demo': [
# 'demo/demo.xml',
],
}

View file

@ -0,0 +1,3 @@
# -*- coding: utf-8 -*-
from . import sale_order

View file

@ -0,0 +1,19 @@
from odoo import models
class SaleOrder(models.Model):
_inherit = "sale.order"
def action_duplicate_order(self):
self.ensure_one()
action = (
self.env.ref(
"bemade_quotation_alternative.sale_order_duplication_wizard_action"
)
.sudo()
.read()[0]
)
action["context"] = {
"default_original_order_id": self.id,
}
return action

View file

@ -0,0 +1,3 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
bemade_quotation_alternative.access_sale_order_duplication_wizard,access_sale_order_duplication_wizard,bemade_quotation_alternative.model_sale_order_duplication_wizard,base.group_user,1,1,1,1
bemade_quotation_alternative.access_sale_order_line_duplication_wizard,access_sale_order_line_duplication_wizard,bemade_quotation_alternative.model_sale_order_line_duplication_wizard,base.group_user,1,1,1,1
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 bemade_quotation_alternative.access_sale_order_duplication_wizard access_sale_order_duplication_wizard bemade_quotation_alternative.model_sale_order_duplication_wizard base.group_user 1 1 1 1
3 bemade_quotation_alternative.access_sale_order_line_duplication_wizard access_sale_order_line_duplication_wizard bemade_quotation_alternative.model_sale_order_line_duplication_wizard base.group_user 1 1 1 1

View file

@ -0,0 +1,62 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data>
<record id="view_sale_order_form_inherit" model="ir.ui.view">
<field name="name">sale.order.form.inherit</field>
<field name="model">sale.order</field>
<field name="inherit_id" ref="sale.view_order_form"/>
<field name="arch" type="xml">
<header>
<button class="oe_highlight" name="action_duplicate_order" string="Duplicate Order" type="object"/>
</header></field>
</record>
<!-- explicit list view definition -->
<!-- <record model="ir.ui.view" id="bemade_quotation_alternative_form">-->
<!-- <field name="name">bemade_quotation_alternative form</field>-->
<!-- <field name="model">sale.order</field>-->
<!-- <field name="inherit_id" ref="sale.view_order_form"/>-->
<!-- <field name="arch" type="xml">-->
<!-- <header position="inside">-->
<!-- <button name="action_create_alternative" type="object" string="Create Alternative" class="oe_highlight" />-->
<!-- </header>-->
<!--</field>-->
<!-- </record>-->
<!-- actions opening views on models -->
<!--
<record model="ir.actions.act_window" id=".repos/bemade-addons/bemade_quotation_alternative.action_window">
<field name="name">.repos/bemade-addons/bemade_quotation_alternative window</field>
<field name="res_model">.repos/bemade-addons/bemade_quotation_alternative..repos/bemade-addons/bemade_quotation_alternative</field>
<field name="view_mode">tree,form</field>
</record>
-->
<!-- server action to the one above -->
<!--
<record model="ir.actions.server" id=".repos/bemade-addons/bemade_quotation_alternative.action_server">
<field name="name">.repos/bemade-addons/bemade_quotation_alternative server</field>
<field name="model_id" ref="model_.repos/bemade-addons/bemade_quotation_alternative_.repos/bemade-addons/bemade_quotation_alternative"/>
<field name="state">code</field>
<field name="code">action = {
"type": "ir.actions.act_window",
"view_mode": "tree,form",
"res_model": model._name,
}</field>
</record>
-->
<!-- Top menu item -->
<!--
<menuitem name=".repos/bemade-addons/bemade_quotation_alternative" id=".repos/bemade-addons/bemade_quotation_alternative.menu_root"/>
-->
<!-- menu categories -->
<!--
<menuitem name="Menu 1" id=".repos/bemade-addons/bemade_quotation_alternative.menu_1" parent=".repos/bemade-addons/bemade_quotation_alternative.menu_root"/>
<menuitem name="Menu 2" id=".repos/bemade-addons/bemade_quotation_alternative.menu_2" parent=".repos/bemade-addons/bemade_quotation_alternative.menu_root"/>
-->
<!-- actions -->
<!--
<menuitem name="List" id=".repos/bemade-addons/bemade_quotation_alternative.menu_1_list" parent=".repos/bemade-addons/bemade_quotation_alternative.menu_1"
action=".repos/bemade-addons/bemade_quotation_alternative.action_window"/>
<menuitem name="Server to list" id=".repos/bemade-addons/bemade_quotation_alternative" parent=".repos/bemade-addons/bemade_quotation_alternative.menu_2"
action=".repos/bemade-addons/bemade_quotation_alternative.action_server"/>
-->
</data>
</odoo>

View file

@ -0,0 +1,4 @@
# -*- coding: utf-8 -*-
from . import sale_order_duplication_wizard
from . import sale_oder_line_duplication_wizard

View file

@ -0,0 +1,9 @@
from odoo import models, fields
class SaleOrderLineDuplicationWizard(models.TransientModel):
_name = 'sale.order.line.duplication.wizard'
_description = 'Wizard for selecting sale order lines to duplicate'
wizard_id = fields.Many2one('sale.order.duplication.wizard', required=True, ondelete='cascade', string="Wizard")
sale_order_line_id = fields.Many2one('sale.order.line', string="Sale Order Line", required=True)
to_duplicate = fields.Boolean(string="Duplicate?", default=True)

View file

@ -0,0 +1,105 @@
from odoo import models, fields, api
from markupsafe import Markup
class SaleOrderDuplicationWizard(models.TransientModel):
_name = "sale.order.duplication.wizard"
_description = "Wizard for duplicating a sale order"
original_order_id = fields.Many2one(
"sale.order", string="Original Order", required=True
)
new_quot = fields.Char(
string="New Quotation Name", compute="_compute_new_quot", store=True
)
duplicate_all_lines = fields.Boolean(string="Duplicate All Lines?", default=True)
lines_to_duplicate = fields.One2many(
"sale.order.line.duplication.wizard",
"wizard_id",
string="Lines to Duplicate",
context={"default_original_order_id": original_order_id},
)
purpose = fields.Text(string="Purpose")
note = fields.Html(string="Note")
@api.model
def default_get(self, fields_list):
res = super(SaleOrderDuplicationWizard, self).default_get(fields_list)
if "default_original_order_id" in self.env.context:
original_order_id = self.env.context["default_original_order_id"]
original_order = self.env["sale.order"].browse(original_order_id)
lines_vals = []
for line in original_order.order_line:
lines_vals.append((0, 0, {"sale_order_line_id": line.id}))
res.update(
{
"lines_to_duplicate": lines_vals,
"purpose": (
original_order.purpose if "purpose" in fields_list else ""
),
"note": original_order.note if "note" in fields_list else "",
}
)
return res
def action_duplicate_order(self):
self.ensure_one()
# Duplication de la commande de vente
new_order = self.original_order_id.copy(
{
"purpose": self.purpose,
"note": self.note,
# Assurez-vous que 'new_quot' est défini correctement dans votre modèle
"name": self.new_quot,
}
)
if not self.duplicate_all_lines:
new_order.order_line.unlink()
for line_wiz in self.lines_to_duplicate.filtered("to_duplicate"):
line_wiz.sale_order_line_id.copy({"order_id": new_order.id})
# Préparation et envoi des messages de notification dans le chatter
user_name = self.env.user.name
now = fields.Datetime.now()
# Message pour la commande originale
original_msg_body = Markup(
f"A new quotation <a href='#' data-oe-model='sale.order' "
f"data-oe-id='{new_order.id}'>#{new_order.name}</a> "
f"created by {user_name} duplicating this Quotation."
)
self.original_order_id.message_post(body=original_msg_body)
# Message pour la nouvelle commande dupliquée
new_msg_body = Markup(
f"This quotation has been created by {user_name} duplicating the original "
f"Quotation <a href='#' data-oe-model='sale.order' "
f"data-oe-id='{self.original_order_id.id}'>#{self.original_order_id.name}"
f"</a>."
)
new_order.message_post(body=new_msg_body)
return {
"type": "ir.actions.act_window",
"name": "Duplicated Order",
"res_model": "sale.order",
"res_id": new_order.id,
"view_mode": "form",
"target": "current",
}
@api.depends("original_order_id")
def _compute_new_quot(self):
for rec in self:
original_order_name = (
rec.original_order_id.name.split("-")[0]
if "-" in rec.original_order_id.name
else rec.original_order_id.name
)
other_quotes = self.env["sale.order"].search(
[("name", "like", original_order_name + "%")]
)
rec.new_quot = original_order_name + "-REV" + str(len(other_quotes))

View file

@ -0,0 +1,39 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data>
<record id="sale_order_duplication_wizard_form_view" model="ir.ui.view">
<field name="name">sale.order.duplication.wizard.form</field>
<field name="model">sale.order.duplication.wizard</field>
<field name="arch" type="xml">
<form string="Duplicate Sale Order">
<group>
<group>
<field invisible="1" name="original_order_id"/>
<field invisible="1" name="new_quot"/>
<field name="purpose"/>
</group>
<group>
<field name="duplicate_all_lines"/>
</group>
</group>
<field invisible="duplicate_all_lines == True" name="lines_to_duplicate">
<tree editable="bottom">
<field name="to_duplicate"/>
<field name="sale_order_line_id" options="{'no_create': True}"/>
</tree></field>
<field name="note"/>
<footer>
<button class="btn-primary" name="action_duplicate_order" string="Duplicate" type="object"/>
<button class="btn-default" special="cancel" string="Cancel"/>
</footer>
</form></field>
</record>
<record id="sale_order_duplication_wizard_action" model="ir.actions.act_window">
<field name="name">Duplicate Sale Order</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">sale.order.duplication.wizard</field>
<field name="view_mode">form</field>
<field name="target">new</field>
</record>
</data>
</odoo>