Initial import pre-upgrade for bemade_quotation_alternative:18.0
This commit is contained in:
parent
f6cdd94f5f
commit
3cc5889ea4
10 changed files with 285 additions and 0 deletions
4
bemade_quotation_alternative/__init__.py
Normal file
4
bemade_quotation_alternative/__init__.py
Normal file
|
|
@ -0,0 +1,4 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
from . import wizard
|
||||||
|
from . import models
|
||||||
37
bemade_quotation_alternative/__manifest__.py
Normal file
37
bemade_quotation_alternative/__manifest__.py
Normal 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',
|
||||||
|
],
|
||||||
|
}
|
||||||
3
bemade_quotation_alternative/models/__init__.py
Normal file
3
bemade_quotation_alternative/models/__init__.py
Normal file
|
|
@ -0,0 +1,3 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
from . import sale_order
|
||||||
19
bemade_quotation_alternative/models/sale_order.py
Normal file
19
bemade_quotation_alternative/models/sale_order.py
Normal 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
|
||||||
|
|
@ -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
|
||||||
|
62
bemade_quotation_alternative/views/sale_order_views.xml
Normal file
62
bemade_quotation_alternative/views/sale_order_views.xml
Normal 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>
|
||||||
4
bemade_quotation_alternative/wizard/__init__.py
Normal file
4
bemade_quotation_alternative/wizard/__init__.py
Normal file
|
|
@ -0,0 +1,4 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
from . import sale_order_duplication_wizard
|
||||||
|
from . import sale_oder_line_duplication_wizard
|
||||||
|
|
@ -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)
|
||||||
|
|
@ -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))
|
||||||
|
|
@ -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>
|
||||||
Loading…
Reference in a new issue