From 62a64bcadcca5669a97edf208adae07a7cc0ff37 Mon Sep 17 00:00:00 2001 From: git_admin Date: Fri, 1 May 2026 15:01:15 +0000 Subject: [PATCH] Tower: upload laundry_management 19.0.19.0.4 (via marketplace) --- .../models/sale_advance_payment.py | 139 ++++++++++++++++++ 1 file changed, 139 insertions(+) create mode 100644 addons/laundry_management/models/sale_advance_payment.py diff --git a/addons/laundry_management/models/sale_advance_payment.py b/addons/laundry_management/models/sale_advance_payment.py new file mode 100644 index 0000000..b6baff9 --- /dev/null +++ b/addons/laundry_management/models/sale_advance_payment.py @@ -0,0 +1,139 @@ +# -*- coding: utf-8 -*- +############################################################################### +# +# Cybrosys Technologies Pvt. Ltd. +# +# Copyright (C) 2026-TODAY Cybrosys Technologies() +# Author: Anaswara S (odoo@cybrosys.com) +# +# You can modify it under the terms of the GNU AFFERO +# GENERAL PUBLIC LICENSE (AGPL v3), Version 3. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details. +# +# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE +# (AGPL v3) along with this program. +# If not, see . +# +############################################################################### +import time +from odoo import models, _ +from odoo.exceptions import UserError + + +class SaleAdvancePaymentInv(models.TransientModel): + """Inheriting the model of sale.advance.payment.inv to generate advance + payment of invoice""" + _inherit = 'sale.advance.payment.inv' + + def create_invoices(self): + """Function for creating invoices for the advance payment.""" + laundry_sale_id = self._context.get('laundry_sale_id') + sale_order = self.env['sale.order'] + if laundry_sale_id: + sale_orders = sale_order.browse(laundry_sale_id) + else: + sale_orders = sale_order.browse( + self._context.get('active_ids', [])) + if self.advance_payment_method == 'delivered': + sale_orders._create_invoices() + elif self.advance_payment_method == 'all': + sale_orders._create_invoices()(final=True) + else: + # Create deposit product if necessary + if not self.product_id: + vals = self._prepare_deposit_product() + self.product_id = self.env['product.product'].create(vals) + self.env['ir.config_parameter'].sudo().set_param( + 'sale.default_deposit_product_id', self.product_id.id) + for order in sale_orders: + if self.advance_payment_method == 'percentage': + amount = order.amount_untaxed * self.amount / 100 + else: + amount = self.amount + if self.product_id.invoice_policy != 'order': + raise UserError(_( + 'The product used to invoice a down payment should have' + ' an invoice policy set to "Ordered' + ' quantities". Please update your deposit product to be' + ' able to create a deposit invoice.')) + if self.product_id.type != 'service': + raise UserError(_( + "The product used to invoice a down payment should be" + " of type 'Service'. Please use another " + "product or update this product.")) + taxes = self.product_id.taxes_id.filtered( + lambda + r: not order.company_id or r.company_id == + order.company_id) + if order.fiscal_position_id and taxes: + tax_ids = order.fiscal_position_id.map_tax(taxes).ids + else: + tax_ids = taxes.ids + so_line = self.env['sale.order.line'].create({ + 'name': _('Advance: %s') % (time.strftime('%m %Y'),), + 'price_unit': amount, + 'product_uom_qty': 0.0, + 'order_id': order.id, + 'discount': 0.0, + 'product_uom': self.product_id.uom_id.id, + 'product_id': self.product_id.id, + 'tax_id': [(6, 0, tax_ids)], + }) + self._create_invoice(order, so_line, amount) + if self._context.get('open_invoices', False): + return sale_orders.action_view_invoice() + return {'type': 'ir.actions.act_window_close'} + + def _create_invoice(self, order, so_line): + """Function for creating invoice""" + if (self.advance_payment_method == 'percentage' and + self.amount <= 0.00) or (self.advance_payment_method == 'fixed' and + self.fixed_amount <= 0.00): + raise UserError( + _('The value of the down payment amount must be positive.')) + if self.advance_payment_method == 'percentage': + amount = order.amount_untaxed * self.amount / 100 + name = _("Down payment of %s%%") % (self.amount,) + else: + amount = self.fixed_amount + name = _('Down Payment') + + invoice_vals = { + 'move_type': 'out_invoice', + 'invoice_origin': order.name, + 'invoice_user_id': order.user_id.id, + 'narration': order.note, + 'partner_id': order.partner_invoice_id.id, + 'fiscal_position_id': order.fiscal_position_id.id or order. + partner_id.property_account_position_id.id, + 'partner_shipping_id': order.partner_shipping_id.id, + 'currency_id': order.pricelist_id.currency_id.id, + 'ref': order.client_order_ref, + 'invoice_payment_term_id': order.payment_term_id.id, + 'team_id': order.team_id.id, + 'campaign_id': order.campaign_id.id, + 'medium_id': order.medium_id.id, + 'source_id': order.source_id.id, + 'invoice_line_ids': [(0, 0, { + 'name': name, + 'price_unit': amount, + 'quantity': 1.0, + 'product_id': self.product_id.id, + 'product_uom_id': so_line.product_uom.id, + 'sale_line_ids': [(6, 0, [so_line.id])], + 'analytic_tag_ids': [(6, 0, so_line.analytic_tag_ids.ids)], + 'analytic_account_id': order.analytic_account_id.id or False, + })], + } + if order.fiscal_position_id: + invoice_vals['fiscal_position_id'] = order.fiscal_position_id.id + invoice = self.env['account.move'].create(invoice_vals) + invoice.message_post_with_view('mail.message_origin_link', + values={'self': invoice, + 'origin': order}, + subtype_id=self.env.ref( + 'mail.mt_note').id)