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
+
+
+
+
+
+
+
+