From 446814d0c8a5c712d4fbebe38823658a11361af4 Mon Sep 17 00:00:00 2001 From: snt Date: Fri, 13 Sep 2024 19:53:45 +0200 Subject: [PATCH] =?UTF-8?q?Nueva=20forma=20de=20liquidar=20a=20trav=C3=A9s?= =?UTF-8?q?=20de=20las=20compras.=20Busca=20todas=20las=20ventas=20confirm?= =?UTF-8?q?adas=20en=20sale.order=20y=20en=20pos.order=20de=20los=20produc?= =?UTF-8?q?tos=20contenidos=20en=20la=20compra=20y=20genera=20una=20factur?= =?UTF-8?q?a=20con=20esas=20ventas.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- stock_picking_deposito/__manifest__.py | 7 +- stock_picking_deposito/models/__init__.py | 1 + .../models/purchase_order.py | 127 ++++++++++++++++++ .../models/stock_picking.py | 2 +- .../views/purchase_order.xml | 28 ++++ 5 files changed, 162 insertions(+), 3 deletions(-) create mode 100644 stock_picking_deposito/models/purchase_order.py create mode 100644 stock_picking_deposito/views/purchase_order.xml diff --git a/stock_picking_deposito/__manifest__.py b/stock_picking_deposito/__manifest__.py index 3373b27..e3c84e8 100644 --- a/stock_picking_deposito/__manifest__.py +++ b/stock_picking_deposito/__manifest__.py @@ -1,4 +1,4 @@ -# Copyright 2021 Criptomart +# Copyright 2021-2024 Criptomart # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl) { "name": "Stock Picking Depósito", @@ -15,11 +15,14 @@ "stock", "account", "sale_management", + "purchase", + "point_of_sale", ], "data": [ + "data/data.xml", "views/stock_picking.xml", "views/view_res_partner.xml", - "data/data.xml", + "views/purchase_order.xml", "views/res_config_settings_views.xml", ], } diff --git a/stock_picking_deposito/models/__init__.py b/stock_picking_deposito/models/__init__.py index 6a3700b..8ce84b9 100644 --- a/stock_picking_deposito/models/__init__.py +++ b/stock_picking_deposito/models/__init__.py @@ -2,3 +2,4 @@ from . import stock_picking from . import res_partner from . import res_config_settings from . import res_company +from . import purchase_order \ No newline at end of file diff --git a/stock_picking_deposito/models/purchase_order.py b/stock_picking_deposito/models/purchase_order.py new file mode 100644 index 0000000..6c15c69 --- /dev/null +++ b/stock_picking_deposito/models/purchase_order.py @@ -0,0 +1,127 @@ +# 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, Warning + +import pdb +import logging +_logger = logging.getLogger(__name__) + +class PurchaseOrde(models.Model): + _inherit = 'purchase.order' + + is_deposit = fields.Boolean( + help='Éste proveedor nos deja material a depósito.', + string='Es a depósito', + ) + deposit_last_liquidation_date = fields.Datetime( + string='Fecha última liquidación compras', + help="Cuándo se realizó la última liquidación de compras con éste proveedor." + ) + + @api.model + def create(self, vals): + if self.is_deposit: + if not self.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.") + vals['deposit_last_liquidation_date'] = fields.datetime.now() + return super(PurchaseOrde, self).create(vals) + + def make_liquidation_invoice(self, context = None): + invoice_obj = self.env['account.move'] + 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']) + ]) + + product_dict = {} + 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 + } + _logger.warning("product_dict %s", product_dict) + pdb.set_trace() + pos_orders = False + 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 + } + + 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) + _logger.warning("product_dict %s", product_dict) + 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.deposit_last_liquidation_date = fields.datetime.now() + 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')], + } diff --git a/stock_picking_deposito/models/stock_picking.py b/stock_picking_deposito/models/stock_picking.py index 9c4a071..db441f2 100644 --- a/stock_picking_deposito/models/stock_picking.py +++ b/stock_picking_deposito/models/stock_picking.py @@ -40,7 +40,7 @@ class Picking(models.Model): for picking in self: if not picking.partner_id: return - _logger.debug("onchange %s", picking.location_dest_id.name) + _logger.debug("onchange %s", picking.location_dest_id.name) # web cliebt does not update without this, wtf? if picking.picking_type_id.is_deposit: if picking.picking_type_id.code == 'internal': if not picking.partner_id.deposit_sale_accept: diff --git a/stock_picking_deposito/views/purchase_order.xml b/stock_picking_deposito/views/purchase_order.xml new file mode 100644 index 0000000..c1d7257 --- /dev/null +++ b/stock_picking_deposito/views/purchase_order.xml @@ -0,0 +1,28 @@ + + + Liquidación Depósito Compra + ir.actions.server + + code + action =record.make_liquidation_invoice() + + + + purchase.order + + 200 + +
+
+
+
+ +