diff --git a/.gitignore b/.gitignore index b6e47617de1..36e9db67f87 100644 --- a/.gitignore +++ b/.gitignore @@ -127,3 +127,4 @@ dmypy.json # Pyre type checker .pyre/ +/shop \ No newline at end of file diff --git a/rental_deposit/__init__.py b/rental_deposit/__init__.py new file mode 100644 index 00000000000..4920c6bc8a0 --- /dev/null +++ b/rental_deposit/__init__.py @@ -0,0 +1 @@ +from .import models diff --git a/rental_deposit/__manifest__.py b/rental_deposit/__manifest__.py new file mode 100644 index 00000000000..b7b32fee887 --- /dev/null +++ b/rental_deposit/__manifest__.py @@ -0,0 +1,11 @@ +{ + 'name': 'rental_deposit', + 'author': "vikvi", + 'license': 'LGPL-3', + 'depends': ['sale_renting'], + "category": "Tutorials", + 'data': [ + 'views/product_template_view.xml', + 'views/res_config_settings_view.xml', + ] +} diff --git a/rental_deposit/models/__init__.py b/rental_deposit/models/__init__.py new file mode 100644 index 00000000000..b75a072bb27 --- /dev/null +++ b/rental_deposit/models/__init__.py @@ -0,0 +1,3 @@ +from .import res_config_settings +from .import product_template +from .import rental_order_line diff --git a/rental_deposit/models/product_template.py b/rental_deposit/models/product_template.py new file mode 100644 index 00000000000..45371b366d1 --- /dev/null +++ b/rental_deposit/models/product_template.py @@ -0,0 +1,8 @@ +from odoo import models, fields + + +class ProductTemplate(models.Model): + _inherit = 'product.template' + + is_deposit = fields.Boolean() + deposit_amount = fields.Float() diff --git a/rental_deposit/models/rental_order_line.py b/rental_deposit/models/rental_order_line.py new file mode 100644 index 00000000000..a0fced88f31 --- /dev/null +++ b/rental_deposit/models/rental_order_line.py @@ -0,0 +1,58 @@ +from odoo import models, fields, api + + +class RentalOrderLine(models.Model): + _inherit = 'sale.order.line' + + is_deposit_line = fields.Boolean(default=False) + linked_deposit_line_id = fields.Many2one('sale.order.line') + + @api.model_create_multi + def create(self, vals_list): + order_lines = super().create(vals_list) + + for line in order_lines: + if (line.product_id.is_deposit and not line.is_deposit_line): + product_id_txt = self.env['ir.config_parameter'].sudo().get_param('sale_renting.deposit_product_id') + product_id = int(product_id_txt) + amount_to_deposit = line.product_id.deposit_amount + + self.create({ + 'product_id': product_id, + 'name': f"Deposit for {line.product_id.name}", + 'order_id': line.order_id.id, + 'price_unit': amount_to_deposit, + 'product_uom_qty': line.product_uom_qty, + 'is_deposit_line': True, + 'linked_deposit_line_id': line.id + }) + + return order_lines + + @api.ondelete(at_uninstall=False) + def _unlink_order_line(self): + deposits = self.env["sale.order.line"].search( + [("linked_deposit_line_id", "in", self.ids)] + ) + if deposits: + deposits.unlink() + return True + + def write(self, vals): + result = super().write(vals) + deposit_lines = self.env['sale.order.line'].search([('linked_deposit_line_id', 'in', self.ids)]) + + for line in self: + if (line.is_deposit_line): + continue + + filtered_deposit_line = deposit_lines.filtered(lambda d_line: d_line.linked_deposit_line_id == line) + + if not filtered_deposit_line: + continue + filtered_deposit_line.write({ + 'product_uom_qty': line.product_uom_qty, + 'price_unit': line.product_uom_qty * line.product_id.deposit_amount + + }) + return result diff --git a/rental_deposit/models/res_config_settings.py b/rental_deposit/models/res_config_settings.py new file mode 100644 index 00000000000..5dcddae64de --- /dev/null +++ b/rental_deposit/models/res_config_settings.py @@ -0,0 +1,10 @@ +from odoo import models, fields + + +class ResConfigSettings(models.TransientModel): + _inherit = 'res.config.settings' + + deposit_product_id = fields.Many2one( + 'product.product', + config_parameter="sale_renting.deposit_product_id" + ) diff --git a/rental_deposit/views/product_template_view.xml b/rental_deposit/views/product_template_view.xml new file mode 100644 index 00000000000..0e2d35e0643 --- /dev/null +++ b/rental_deposit/views/product_template_view.xml @@ -0,0 +1,14 @@ + + + + product.template.rental.form.view + product.template + + + + + + + + + diff --git a/rental_deposit/views/res_config_settings_view.xml b/rental_deposit/views/res_config_settings_view.xml new file mode 100644 index 00000000000..554c11bedd0 --- /dev/null +++ b/rental_deposit/views/res_config_settings_view.xml @@ -0,0 +1,16 @@ + + + + res.config.settings.deposit + res.config.settings + + + +
+
+
+
+
+
diff --git a/rental_deposit_website/__manifest__.py b/rental_deposit_website/__manifest__.py new file mode 100644 index 00000000000..124f3d9a9b2 --- /dev/null +++ b/rental_deposit_website/__manifest__.py @@ -0,0 +1,16 @@ +{ + 'name': 'rental_deposit_website', + 'author': "vikvi", + 'license': 'LGPL-3', + 'depends': ['sale_renting', 'website_sale'], + "category": "Tutorials", + 'auto_install': True, + 'data': [ + 'views/website_cart_overview.xml', + ], + "assets": { + "web.assets_frontend": [ + "rental_deposit_website/static/src/website_rental_deposit_amount.js" + ], + }, +} diff --git a/rental_deposit_website/static/src/website_rental_deposit_amount.js b/rental_deposit_website/static/src/website_rental_deposit_amount.js new file mode 100644 index 00000000000..6ac4c48dbdf --- /dev/null +++ b/rental_deposit_website/static/src/website_rental_deposit_amount.js @@ -0,0 +1,18 @@ +document.addEventListener('change', function (event) { + const input = event.target; + if (!input.matches('input[name="add_qty"]')) { + return; + } + const productEl = input.closest('.js_product'); + const depositEl = productEl?.querySelector('.deposit_div'); + if (!depositEl) { + return; + } + const unit_deposit_price = parseFloat(depositEl.dataset.depositUnit) || 0; + const quantity = parseFloat(input.value) || 0; + const total = (unit_deposit_price * quantity).toFixed(2); + const target = depositEl.querySelector('.deposit_value'); + if (target) { + target.textContent = total; + } +}); diff --git a/rental_deposit_website/views/website_cart_overview.xml b/rental_deposit_website/views/website_cart_overview.xml new file mode 100644 index 00000000000..b7e9609c9d6 --- /dev/null +++ b/rental_deposit_website/views/website_cart_overview.xml @@ -0,0 +1,37 @@ + + + + +