# Copyright (C) 2024: Criptomart () # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). from odoo import models, fields, api from odoo.exceptions import ValidationError class PurchaseOrderDesposito(models.Model): _inherit = 'purchase.order' is_deposit = fields.Boolean( help='Éste proveedor nos deja material a depósito.', string='A depósito', ) deposit_last_liquidation_date = fields.Datetime( string='Última liquidación', help="La fecha en la que se realizó la última liquidación de compras de éste depósito." ) @api.model_create_multi def create(self, vals_list): pol = super().create(vals_list) for po in pol: if po.is_deposit: if not po.partner_id.deposit_buy_accept: raise ValidationError("Este proveedor no suministra material en depósito, configúralo antes de crear un depósito para él.") po.deposit_last_liquidation_date = fields.datetime.now() return pol def get_products_sold_sales(self): product_dict = {} if self.deposit_last_liquidation_date: sale_orders = self.env['sale.order'].search([ ('date_order', '>', self.deposit_last_liquidation_date), ('order_line.product_id', 'in', self.order_line.mapped('product_id').ids), ('state', 'in', ['sale', 'done']) ]) else: sale_orders = self.env['sale.order'].search([ ('order_line.product_id', 'in', self.order_line.mapped('product_id').ids), ('state', 'in', ['sale', 'done']) ]) if sale_orders: sale_lines = self.env['sale.order.line'].search([ ('order_id', 'in', sale_orders.ids), ('product_id', 'in', self.order_line.mapped('product_id').ids) ]) for line in sale_lines: product_id = line.product_id.id if product_id in product_dict: product_dict[product_id]['debit'] += line.price_total product_dict[product_id]['quantity'] += line.product_uom_qty else: product_dict[product_id] = { 'product_id': product_id, 'debit': line.price_total, 'name': line.product_id.name, 'price_unit': line.product_id.lst_price, 'tax_ids': [(6, 0, line.product_id.supplier_taxes_id.ids)], 'quantity': line.product_uom_qty } return product_dict def get_products_sold_pos(self): product_dict = {} if self.deposit_last_liquidation_date: pos_orders = self.env['pos.order'].search([ ('date_order', '>', self.deposit_last_liquidation_date), ('lines.product_id', 'in', self.order_line.mapped('product_id').ids), ('state', 'in', ['invoiced', 'done']) ]) else: pos_orders = self.env['pos.order'].search([ ('lines.product_id', 'in', self.order_line.mapped('product_id').ids), ('state', 'in', ['invoiced', 'done']) ]) if pos_orders: pos_lines = self.env['pos.order.line'].search([ ('order_id', 'in', pos_orders.ids), ('product_id', 'in', self.order_line.mapped('product_id').ids) ]) for line in pos_lines: product_id = line.product_id.id if product_id in product_dict: product_dict[product_id]['debit'] += line.price_subtotal_incl product_dict[product_id]['quantity'] += line.qty else: product_dict[product_id] = { 'product_id': product_id, 'debit': line.price_subtotal_incl, 'name': line.product_id.name, 'price_unit': line.product_id.lst_price, 'tax_ids': [(6, 0, line.product_id.supplier_taxes_id.ids)], 'quantity': line.qty } return product_dict def make_liquidation_invoice(self, context = None): invoice_obj = self.env['account.move'] product_dict = self.get_products_sold_sales() product_dict |= self.get_products_sold_pos() # > Python 3.9 if not product_dict: msg = "No se ha vendido ningún producto en depósito de éste proveedor desde la última liquidación.\n\n" if self.deposit_last_liquidation_date: msg += "Fecha última liquidación de compras: %s" % self.deposit_last_liquidation_date.strftime("%d-%m-%Y, %H:%M:%S") else: msg += "Todavía no se ha realizado ninguna liquidación de compras a éste proveedor." raise ValidationError(msg) invoice_vals = invoice_obj.default_get(invoice_obj._fields.keys()) invoice_vals.update({ 'ref': "Liquidación Compras " + self.name, 'move_type': 'in_invoice', 'financial_type': 'payable', 'journal_id': self.env.user.company_id.deposit_journal_id.id, 'partner_id': self.partner_id.id, 'invoice_line_ids': [(0, 0, vals) for vals in product_dict.values()], 'company_id': self.company_id.id, 'purchase_id': self.id, }) invoice = invoice_obj.create(invoice_vals) self.update({'invoice_ids': [(4, invoice.id)]}) self.invoice_count = len(self.invoice_ids) self.deposit_last_liquidation_date = fields.datetime.now() for line in self.order_line: if line: invoice_line = invoice.invoice_line_ids.filtered(lambda x: x.product_id.id == line.product_id.id) if invoice_line: line.invoice_lines = [(4, invoice_line.id)] self.message_post(body="Se ha creado la liquidación de compras %s" % invoice.name) return { 'type': 'ir.actions.act_window', 'res_model': 'account.move', 'res_id': invoice.id, 'target': 'current', 'views': [(self.env.ref('account.view_move_form').id, 'form')], }