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