diff --git a/bemade_quotation_alternative/__init__.py b/bemade_quotation_alternative/__init__.py new file mode 100644 index 0000000..8604020 --- /dev/null +++ b/bemade_quotation_alternative/__init__.py @@ -0,0 +1,4 @@ +# -*- coding: utf-8 -*- + +from . import wizard +from . import models \ No newline at end of file diff --git a/bemade_quotation_alternative/__manifest__.py b/bemade_quotation_alternative/__manifest__.py new file mode 100644 index 0000000..1e2db88 --- /dev/null +++ b/bemade_quotation_alternative/__manifest__.py @@ -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': '0.1', + + # 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_alternative_views.xml', + ], + # only loaded in demonstration mode + 'demo': [ + # 'demo/demo.xml', + ], +} diff --git a/bemade_quotation_alternative/controllers/__init__.py b/bemade_quotation_alternative/controllers/__init__.py new file mode 100644 index 0000000..457bae2 --- /dev/null +++ b/bemade_quotation_alternative/controllers/__init__.py @@ -0,0 +1,3 @@ +# -*- 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 new file mode 100644 index 0000000..ab78d96 --- /dev/null +++ b/bemade_quotation_alternative/controllers/controllers.py @@ -0,0 +1,21 @@ +# -*- 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 new file mode 100644 index 0000000..e9046ff --- /dev/null +++ b/bemade_quotation_alternative/demo/demo.xml @@ -0,0 +1,30 @@ + + + + + \ No newline at end of file diff --git a/bemade_quotation_alternative/models/__init__.py b/bemade_quotation_alternative/models/__init__.py new file mode 100644 index 0000000..3e8b8f8 --- /dev/null +++ b/bemade_quotation_alternative/models/__init__.py @@ -0,0 +1,3 @@ +# -*- coding: utf-8 -*- + +from . import sale_order \ No newline at end of file diff --git a/bemade_quotation_alternative/models/models.py b/bemade_quotation_alternative/models/models.py new file mode 100644 index 0000000..3e82283 --- /dev/null +++ b/bemade_quotation_alternative/models/models.py @@ -0,0 +1,18 @@ +# -*- 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 new file mode 100644 index 0000000..50498d9 --- /dev/null +++ b/bemade_quotation_alternative/models/sale_order.py @@ -0,0 +1,17 @@ +from odoo import fields, models, api + + +class ModelName(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 diff --git a/bemade_quotation_alternative/security/ir.model.access.csv b/bemade_quotation_alternative/security/ir.model.access.csv new file mode 100644 index 0000000..a531b67 --- /dev/null +++ b/bemade_quotation_alternative/security/ir.model.access.csv @@ -0,0 +1,2 @@ +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 diff --git a/bemade_quotation_alternative/views/sale_order_views.xml b/bemade_quotation_alternative/views/sale_order_views.xml new file mode 100644 index 0000000..c28516e --- /dev/null +++ b/bemade_quotation_alternative/views/sale_order_views.xml @@ -0,0 +1,58 @@ + + + + + + bemade_quotation_alternative form + sale.order + + +
+
+
+
+ + + + + + + + + + + + + +
+
\ No newline at end of file diff --git a/bemade_quotation_alternative/views/templates.xml b/bemade_quotation_alternative/views/templates.xml new file mode 100644 index 0000000..cea6b39 --- /dev/null +++ b/bemade_quotation_alternative/views/templates.xml @@ -0,0 +1,24 @@ + + + + + \ No newline at end of file diff --git a/bemade_quotation_alternative/wizard/__init__.py b/bemade_quotation_alternative/wizard/__init__.py new file mode 100644 index 0000000..ca94d45 --- /dev/null +++ b/bemade_quotation_alternative/wizard/__init__.py @@ -0,0 +1,3 @@ +# -*- coding: utf-8 -*- + +from . import sale_order_alternative \ No newline at end of file diff --git a/bemade_quotation_alternative/wizard/sale_order_alternative.py b/bemade_quotation_alternative/wizard/sale_order_alternative.py new file mode 100644 index 0000000..9b2b92b --- /dev/null +++ b/bemade_quotation_alternative/wizard/sale_order_alternative.py @@ -0,0 +1,59 @@ +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 new file mode 100644 index 0000000..1c0f07a --- /dev/null +++ b/bemade_quotation_alternative/wizard/sale_order_alternative_views.xml @@ -0,0 +1,45 @@ + + + + + + bemade_quotation_alternative.sale_order_alternative.form + sale.order.alternative + +
+ +
+
+ + + + + + + +
+
+
+
+ + + + + + + + + + + + + + + + +
+
\ No newline at end of file