diff --git a/product_category_default_pos_cat/views/res_config_settings_views.xml b/product_category_default_pos_cat/views/res_config_settings_views.xml index 4d9d5bf..50d4143 100644 --- a/product_category_default_pos_cat/views/res_config_settings_views.xml +++ b/product_category_default_pos_cat/views/res_config_settings_views.xml @@ -1,7 +1,5 @@ - - + res.config.settings.view.form.inherit.product res.config.settings @@ -24,4 +22,5 @@ + diff --git a/stock_picking_deposito/__manifest__.py b/stock_picking_deposito/__manifest__.py index deb7ad6..7589105 100644 --- a/stock_picking_deposito/__manifest__.py +++ b/stock_picking_deposito/__manifest__.py @@ -2,7 +2,7 @@ # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl) { "name": "Stock Picking Depósito", - "summary": "Permite la gestión de depósitos en el almacén.", + "summary": "Permite la gestión de depósitos en el almacén y su facturación.", "version": "12.0.1.0.1", "development_status": "Alpha", "category": "Warehouse Management", @@ -13,9 +13,11 @@ "installable": True, "depends": [ "stock", + "account", ], "data": [ "views/view_res_partner.xml", "data/data.xml", + "views/res_config_settings_views.xml", ], } diff --git a/stock_picking_deposito/models/__init__.py b/stock_picking_deposito/models/__init__.py index 6192433..6a3700b 100644 --- a/stock_picking_deposito/models/__init__.py +++ b/stock_picking_deposito/models/__init__.py @@ -1,2 +1,4 @@ from . import stock_picking from . import res_partner +from . import res_config_settings +from . import res_company diff --git a/stock_picking_deposito/models/res_company.py b/stock_picking_deposito/models/res_company.py new file mode 100644 index 0000000..36757cc --- /dev/null +++ b/stock_picking_deposito/models/res_company.py @@ -0,0 +1,14 @@ +# Copyright 2021 Criptomart +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class Company(models.Model): + _inherit = 'res.company' + + deposit_journal_id = fields.Many2one( + comodel_name="account.journal", + string="Diario de depósitos", + help="El diario donde se crearán las facturas en las liquidaciones de depósitos.", + ) diff --git a/stock_picking_deposito/models/res_config_settings.py b/stock_picking_deposito/models/res_config_settings.py new file mode 100644 index 0000000..0eaacb4 --- /dev/null +++ b/stock_picking_deposito/models/res_config_settings.py @@ -0,0 +1,13 @@ +# Copyright 2021 Criptomart +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class ResConfigSettings(models.TransientModel): + _inherit = 'res.config.settings' + + deposit_journal_id = fields.Many2one( + related="company_id.deposit_journal_id", + readonly=False, + ) diff --git a/stock_picking_deposito/models/res_partner.py b/stock_picking_deposito/models/res_partner.py index bc3bfc7..1b51b32 100644 --- a/stock_picking_deposito/models/res_partner.py +++ b/stock_picking_deposito/models/res_partner.py @@ -2,13 +2,12 @@ # @author: Criptomart () # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). -import logging - -from collections import Counter +#import logging from odoo import models, fields, api +from odoo.exceptions import ValidationError, Warning -_logger = logging.getLogger(__name__) +#_logger = logging.getLogger(__name__) class ResPartner(models.Model): _inherit = 'res.partner' @@ -31,7 +30,7 @@ class ResPartner(models.Model): string='Ubicación de depósito de compras', help="La ubicación que se usará para gestionar el material que éste proveedor nos deja en depósito." ) - deposit_buy_last_liquidation_date = fields.Date( + deposit_buy_last_liquidation_date = fields.Datetime( string='Fecha de la última liquidación de compras', help="Cuándo se realizó la última liquidación de compras con éste proveedor." ) @@ -60,18 +59,59 @@ class ResPartner(models.Model): 'deposit_buy_location_id': new_loc }) - def make_liquidation_buy(self): - _logger.warning("make_liquidation : %s" %self) + def make_liquidation_buy(self, context = None): + invoice_obj = self.env['account.invoice'] search_vals = [ ('location_id', '=', self.deposit_buy_location_id.id), ('location_dest_id', '=', self.env.ref('stock.stock_location_customers').id), ] if self.deposit_buy_last_liquidation_date: - search_vals += ('date', '>', self.deposit_buy_last_liquidation_date) - _logger.warning("search_vals : %s" %search_vals) + search_vals.append(('date', '>', self.deposit_buy_last_liquidation_date.strftime("%Y-%m-%d %H:%M:%S"))) move_lines = self.env['stock.move.line'].search(search_vals) - product_list = Counter() + product_list = [] for mv in move_lines: - product_list += {'id': mv.product_id.id, 'qty': mv.qty_done} - _logger.warning("product_list : %s" %product_list) + new_prod = True + for p in product_list: + if p[2]['product_id'] == mv.product_id.id: + p[2]['quantity'] += mv.qty_done + new_prod = False + break + if new_prod: + product_list.append([0, False, { + 'product_id': mv.product_id.id, + 'quantity': mv.qty_done, + 'name': mv.product_id.name, + 'price_unit': mv.product_id.lst_price, + 'uom_id': mv.product_id.uom_id.id, + 'account_id': self.env['account.account'].search([('user_type_id', '=', self.env.ref('account.data_account_type_expenses').id)], limit=1).id + } + ]) + if len(product_list): + self.deposit_buy_last_liquidation_date = fields.datetime.now() + invoice_vals = invoice_obj.default_get(invoice_obj._fields.keys()) + invoice_vals.update({ + 'origin': "Liquidación " + self.deposit_buy_last_liquidation_date.strftime("%d-%m-%Y"), + 'type': 'in_invoice', + 'date_invoice': self.deposit_buy_last_liquidation_date.strftime("%Y-%m-%d %H:%M:%S"), + 'journal_id': self.env.user.company_id.deposit_journal_id.id, + 'account_id': self.env['account.account'].search([('user_type_id', '=', self.env.ref('account.data_account_type_receivable').id)], limit=1).id, + 'partner_id': self.id, + 'invoice_line_ids': product_list, + }) + invoice = self.env['account.invoice'].create(invoice_vals) + views = [(self.env.ref('account.invoice_form').id, 'form')] + return { + 'type': 'ir.actions.act_window', + 'res_model': 'account.invoice', + 'res_id': invoice.id, + 'target': 'current', + 'views': views, + } + else: + msg= "No se ha vendido ningún producto en depósito de éste provedor desde la última liquidación.\n\n" + if self.deposit_buy_last_liquidation_date: + msg += "Fecha última liquidación : %s" %self.deposit_buy_last_liquidation_date.strftime("%d-%m-%Y, %H:%M:%S") + else: + msg += "No se ha realizado ninguna liquidación a éste proveedor." + raise ValidationError(msg) diff --git a/stock_picking_deposito/views/res_config_settings_views.xml b/stock_picking_deposito/views/res_config_settings_views.xml new file mode 100644 index 0000000..cc19e6f --- /dev/null +++ b/stock_picking_deposito/views/res_config_settings_views.xml @@ -0,0 +1,26 @@ + + + + + res.config.settings.view.form.inherit.product.deposit + res.config.settings + + +
+

Deposit Settings

+
+
+
+
+
+
+
+
+
+
+
+ +
diff --git a/stock_picking_deposito/views/view_res_partner.xml b/stock_picking_deposito/views/view_res_partner.xml index ee03284..1bb6fa7 100644 --- a/stock_picking_deposito/views/view_res_partner.xml +++ b/stock_picking_deposito/views/view_res_partner.xml @@ -1,30 +1,45 @@ - + Liquidación Depósito Compras True ir.actions.server code - record.make_liquidation_buy() - + action =record.make_liquidation_buy() + + + + Abre Liquidación + account.invoice + form + tree,form + + new + + + + view_open_liquidation_buy_form + account.invoice + + form + res.partner 200 - - + + -
+ />
-
-