From 988a28a9d31a485f17dc91530b4fd881a4108ad8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beno=C3=AEt=20V=C3=A9zina?= Date: Mon, 11 Mar 2024 14:29:46 -0400 Subject: [PATCH] quot alt --- bemade_quotation_alternative/__init__.py | 2 +- bemade_quotation_alternative/__manifest__.py | 4 +- .../controllers/__init__.py | 3 - .../controllers/controllers.py | 21 ----- bemade_quotation_alternative/demo/demo.xml | 30 ------- .../models/__init__.py | 2 +- bemade_quotation_alternative/models/models.py | 18 ----- .../models/sale_order.py | 20 ++--- .../security/ir.model.access.csv | 3 +- .../views/sale_order_views.xml | 43 +++++++--- .../views/templates.xml | 24 ------ .../wizard/__init__.py | 3 +- .../sale_oder_line_duplication_wizard.py | 9 +++ .../wizard/sale_order_alternative.py | 59 -------------- .../wizard/sale_order_alternative_views.xml | 45 ----------- .../wizard/sale_order_duplication_wizard.py | 78 +++++++++++++++++++ .../sale_order_duplication_wizard_view.xml | 44 +++++++++++ 17 files changed, 180 insertions(+), 228 deletions(-) delete mode 100644 bemade_quotation_alternative/controllers/__init__.py delete mode 100644 bemade_quotation_alternative/controllers/controllers.py delete mode 100644 bemade_quotation_alternative/demo/demo.xml delete mode 100644 bemade_quotation_alternative/models/models.py delete mode 100644 bemade_quotation_alternative/views/templates.xml create mode 100644 bemade_quotation_alternative/wizard/sale_oder_line_duplication_wizard.py delete mode 100644 bemade_quotation_alternative/wizard/sale_order_alternative.py delete mode 100644 bemade_quotation_alternative/wizard/sale_order_alternative_views.xml create mode 100644 bemade_quotation_alternative/wizard/sale_order_duplication_wizard.py create mode 100644 bemade_quotation_alternative/wizard/sale_order_duplication_wizard_view.xml diff --git a/bemade_quotation_alternative/__init__.py b/bemade_quotation_alternative/__init__.py index 8604020..3c4e748 100644 --- a/bemade_quotation_alternative/__init__.py +++ b/bemade_quotation_alternative/__init__.py @@ -1,4 +1,4 @@ # -*- coding: utf-8 -*- from . import wizard -from . import models \ No newline at end of file +from . import models diff --git a/bemade_quotation_alternative/__manifest__.py b/bemade_quotation_alternative/__manifest__.py index 1e2db88..bcb23b9 100644 --- a/bemade_quotation_alternative/__manifest__.py +++ b/bemade_quotation_alternative/__manifest__.py @@ -26,9 +26,9 @@ # always loaded 'data': [ - # 'security/ir.model.access.csv', + 'security/ir.model.access.csv', 'views/sale_order_views.xml', - 'wizard/sale_order_alternative_views.xml', + 'wizard/sale_order_duplication_wizard_view.xml', ], # only loaded in demonstration mode 'demo': [ diff --git a/bemade_quotation_alternative/controllers/__init__.py b/bemade_quotation_alternative/controllers/__init__.py deleted file mode 100644 index 457bae2..0000000 --- a/bemade_quotation_alternative/controllers/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -# -*- coding: utf-8 -*- - -from . import controllers \ No newline at end of file diff --git a/bemade_quotation_alternative/controllers/controllers.py b/bemade_quotation_alternative/controllers/controllers.py deleted file mode 100644 index ab78d96..0000000 --- a/bemade_quotation_alternative/controllers/controllers.py +++ /dev/null @@ -1,21 +0,0 @@ -# -*- coding: utf-8 -*- -# from odoo import http - - -# class .repos/bemade-addons/bemadeQuotationAlternative(http.Controller): -# @http.route('/.repos/bemade-addons/bemade_quotation_alternative/.repos/bemade-addons/bemade_quotation_alternative', auth='public') -# def index(self, **kw): -# return "Hello, world" - -# @http.route('/.repos/bemade-addons/bemade_quotation_alternative/.repos/bemade-addons/bemade_quotation_alternative/objects', auth='public') -# def list(self, **kw): -# return http.request.render('.repos/bemade-addons/bemade_quotation_alternative.listing', { -# 'root': '/.repos/bemade-addons/bemade_quotation_alternative/.repos/bemade-addons/bemade_quotation_alternative', -# 'objects': http.request.env['.repos/bemade-addons/bemade_quotation_alternative..repos/bemade-addons/bemade_quotation_alternative'].search([]), -# }) - -# @http.route('/.repos/bemade-addons/bemade_quotation_alternative/.repos/bemade-addons/bemade_quotation_alternative/objects/', auth='public') -# def object(self, obj, **kw): -# return http.request.render('.repos/bemade-addons/bemade_quotation_alternative.object', { -# 'object': obj -# }) diff --git a/bemade_quotation_alternative/demo/demo.xml b/bemade_quotation_alternative/demo/demo.xml deleted file mode 100644 index e9046ff..0000000 --- a/bemade_quotation_alternative/demo/demo.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - \ No newline at end of file diff --git a/bemade_quotation_alternative/models/__init__.py b/bemade_quotation_alternative/models/__init__.py index 3e8b8f8..6064afe 100644 --- a/bemade_quotation_alternative/models/__init__.py +++ b/bemade_quotation_alternative/models/__init__.py @@ -1,3 +1,3 @@ # -*- coding: utf-8 -*- -from . import sale_order \ No newline at end of file +from . import sale_order diff --git a/bemade_quotation_alternative/models/models.py b/bemade_quotation_alternative/models/models.py deleted file mode 100644 index 3e82283..0000000 --- a/bemade_quotation_alternative/models/models.py +++ /dev/null @@ -1,18 +0,0 @@ -# -*- coding: utf-8 -*- - -# from odoo import models, fields, api - - -# class .repos/bemade-addons/bemade_quotation_alternative(models.Model): -# _name = '.repos/bemade-addons/bemade_quotation_alternative..repos/bemade-addons/bemade_quotation_alternative' -# _description = '.repos/bemade-addons/bemade_quotation_alternative..repos/bemade-addons/bemade_quotation_alternative' - -# name = fields.Char() -# value = fields.Integer() -# value2 = fields.Float(compute="_value_pc", store=True) -# description = fields.Text() -# -# @api.depends('value') -# def _value_pc(self): -# for record in self: -# record.value2 = float(record.value) / 100 diff --git a/bemade_quotation_alternative/models/sale_order.py b/bemade_quotation_alternative/models/sale_order.py index 50498d9..c5bb2dd 100644 --- a/bemade_quotation_alternative/models/sale_order.py +++ b/bemade_quotation_alternative/models/sale_order.py @@ -1,17 +1,13 @@ from odoo import fields, models, api -class ModelName(models.Model): +class SaleOrder(models.Model): _inherit = 'sale.order' - def action_create_alternative(self): - return { - 'name': 'Create Alternative', - 'type': 'ir.actions.act_window', - 'res_model': 'bemade.quotation.alternative', - 'view_mode': 'form', - 'target': 'new', - 'context': { - 'default_sale_order_id': self.id, - } - } \ No newline at end of file + def action_duplicate_order(self): + self.ensure_one() + action = self.env.ref('bemade_quotation_alternative.sale_order_duplication_wizard_action').read()[0] + action['context'] = { + 'default_original_order_id': self.id, + } + return action diff --git a/bemade_quotation_alternative/security/ir.model.access.csv b/bemade_quotation_alternative/security/ir.model.access.csv index a531b67..29adc9a 100644 --- a/bemade_quotation_alternative/security/ir.model.access.csv +++ b/bemade_quotation_alternative/security/ir.model.access.csv @@ -1,2 +1,3 @@ id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink -access_.repos/bemade-addons/bemade_quotation_alternative_.repos/bemade-addons/bemade_quotation_alternative,.repos/bemade-addons/bemade_quotation_alternative..repos/bemade-addons/bemade_quotation_alternative,model_.repos/bemade-addons/bemade_quotation_alternative_.repos/bemade-addons/bemade_quotation_alternative,base.group_user,1,1,1,1 \ No newline at end of file +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 diff --git a/bemade_quotation_alternative/views/sale_order_views.xml b/bemade_quotation_alternative/views/sale_order_views.xml index c28516e..060f116 100644 --- a/bemade_quotation_alternative/views/sale_order_views.xml +++ b/bemade_quotation_alternative/views/sale_order_views.xml @@ -1,17 +1,40 @@ + + sale.order.form.inherit + sale.order + + +
+
+
+
+ + + + + + + + - - bemade_quotation_alternative form - sale.order - - -
-
-
-
+ + + + + + + + + + -
-
\ No newline at end of file diff --git a/bemade_quotation_alternative/wizard/__init__.py b/bemade_quotation_alternative/wizard/__init__.py index ca94d45..c8bd2b8 100644 --- a/bemade_quotation_alternative/wizard/__init__.py +++ b/bemade_quotation_alternative/wizard/__init__.py @@ -1,3 +1,4 @@ # -*- coding: utf-8 -*- -from . import sale_order_alternative \ No newline at end of file +from . import sale_order_duplication_wizard +from . import sale_oder_line_duplication_wizard diff --git a/bemade_quotation_alternative/wizard/sale_oder_line_duplication_wizard.py b/bemade_quotation_alternative/wizard/sale_oder_line_duplication_wizard.py new file mode 100644 index 0000000..c21a696 --- /dev/null +++ b/bemade_quotation_alternative/wizard/sale_oder_line_duplication_wizard.py @@ -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) diff --git a/bemade_quotation_alternative/wizard/sale_order_alternative.py b/bemade_quotation_alternative/wizard/sale_order_alternative.py deleted file mode 100644 index 9b2b92b..0000000 --- a/bemade_quotation_alternative/wizard/sale_order_alternative.py +++ /dev/null @@ -1,59 +0,0 @@ -from odoo import fields, models, api -import string - - -class AlternativeQuotation(models.TransientModel): - _name = 'sale.order.alternative' - _description = 'Quotation Alternative' - - name = fields.Char() - original_sale_order_id = fields.Many2one('sale.order') - - clone_all_lines = fields.Boolean('Clone all lines', default=True) - origin = fields.Text('Why this alternative ?') - internal_note = fields.Text('Internal Note') - - def action_create_alternative(self): - name = self.original_sale_order_id.name - - if name and name[-1] not in string.ascii_letters: - self.original_sale_order_id.name = name + "A" - name = self.name + "B" - else: - # Assuming 'all_names' is a list of all names - # Add a domain to filter names starting with 'name' (less the last letter) - all_names = [record.name for record in self.env['sale.order'].search([('name', 'like', name[:-1] + '%')])] - if name in all_names: - # Get the index of the current name in the list - index = all_names.index(name) - # If this is not the last name in the list, get the next one - if index < len(all_names) - 1: - name = all_names[index + 1] - else: - # If this is the last name, just add 'B' to it - name = name + "B" - - new_quot = quot.original_sale_order_id.copy({ - 'name': quot.name, - 'origin': quot.original_sale_order_id.name, - 'alternative_sale_order_id': quot.original_sale_order_id.id, - 'alternative': True, - 'alternative_origine': quot.origine, - 'alternative_internal_note': quot.internal_note, - -# # Lines and line based computes -# order_line = fields.One2many( -# comodel_name='sale.order.alternative.line', -# inverse_name='order_id', -# string="Order Lines", -# copy=True, auto_join=True) -# -# class AlternativeQuotation(models.TransientModel): -# _name = 'sale.order.alternative.line' -# # _inherit = 'sale.order.line' -# _description = 'Quotation Alternative Line' -# -# order_id = fields.Many2one( -# comodel_name='sale.order.alternative', -# string="Alternative Quotation Reference", -# required=True, ondelete='cascade', index=True, copy=False) diff --git a/bemade_quotation_alternative/wizard/sale_order_alternative_views.xml b/bemade_quotation_alternative/wizard/sale_order_alternative_views.xml deleted file mode 100644 index 1c0f07a..0000000 --- a/bemade_quotation_alternative/wizard/sale_order_alternative_views.xml +++ /dev/null @@ -1,45 +0,0 @@ - - - - - - bemade_quotation_alternative.sale_order_alternative.form - sale.order.alternative - -
- -
-
- - - - - - - -
-
-
-
- - - - - - - - - - - - - - - - -
-
\ No newline at end of file diff --git a/bemade_quotation_alternative/wizard/sale_order_duplication_wizard.py b/bemade_quotation_alternative/wizard/sale_order_duplication_wizard.py new file mode 100644 index 0000000..a4e070b --- /dev/null +++ b/bemade_quotation_alternative/wizard/sale_order_duplication_wizard.py @@ -0,0 +1,78 @@ +from odoo import models, fields, api + +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 = f"A new quotation #{new_order.name} 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 = f"This quotation has been created by {user_name} duplicating the original Quotation #{self.original_order_id.name}." + 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)) diff --git a/bemade_quotation_alternative/wizard/sale_order_duplication_wizard_view.xml b/bemade_quotation_alternative/wizard/sale_order_duplication_wizard_view.xml new file mode 100644 index 0000000..81cb710 --- /dev/null +++ b/bemade_quotation_alternative/wizard/sale_order_duplication_wizard_view.xml @@ -0,0 +1,44 @@ + + + + + + sale.order.duplication.wizard.form + sale.order.duplication.wizard + +
+ + + + + + + + + + + + + + + + + +
+
+ +
+
+ + + Duplicate Sale Order + ir.actions.act_window + sale.order.duplication.wizard + form + new + + +
+
\ No newline at end of file