You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
99 lines
4.6 KiB
99 lines
4.6 KiB
# -*- coding: utf-8 -*-
|
|
#############################################################################
|
|
#
|
|
# Cybrosys Technologies Pvt. Ltd.
|
|
#
|
|
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
|
|
# Author: Cybrosys Techno Solutions (odoo@cybrosys.com)
|
|
#
|
|
# You can modify it under the terms of the GNU LESSER
|
|
# GENERAL PUBLIC LICENSE (LGPL 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 LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
|
|
#
|
|
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
|
|
# (LGPL v3) along with this program.
|
|
# If not, see <http://www.gnu.org/licenses/>.
|
|
#
|
|
#############################################################################
|
|
from datetime import timedelta
|
|
from odoo import api, fields, models, _
|
|
from odoo.exceptions import UserError
|
|
|
|
|
|
class InvoiceProductDetails(models.TransientModel):
|
|
""" Wizard model to display invoice product details."""
|
|
_name = 'invoice.product.details'
|
|
_description = 'Invoice Product Details'
|
|
|
|
product_id = fields.Many2one('product.product', string='Product',
|
|
readonly=True,
|
|
help="Select the product for this record.")
|
|
qty = fields.Float(string='Quantity', default=1,
|
|
help="Enter the quantity of the selected product.")
|
|
account_move_id = fields.Many2one('account.move', readonly=True,
|
|
help="Link to the corresponding "
|
|
"account move.")
|
|
price_unit = fields.Float(string='Unit Price',
|
|
help="Enter the unit price of the product.")
|
|
invoice_history_ids = fields.One2many('product.invoice.history',
|
|
'product_details_id', readonly=True,
|
|
help="History of invoices related"
|
|
" to this product.")
|
|
date_from = fields.Date(default=fields.Date.today() - timedelta(days=30),
|
|
help="Default date from which a record is "
|
|
"created.")
|
|
limit = fields.Integer(string='Limit', default=20,
|
|
help="Set the limit for product")
|
|
|
|
@api.onchange('date_from', 'limit')
|
|
def _onchange_date_from(self):
|
|
"""Update invoice history based on selected date range and limit.
|
|
This method is triggered when the 'date_from' or 'limit' field changes.
|
|
It retrieves invoice lines matching the specified criteria and
|
|
updates the invoice history. """
|
|
invoice_lines = self.env['account.move.line'].search([
|
|
('product_id', '=', self.product_id.id),
|
|
('move_id.state', '=', 'posted'),
|
|
('move_id.invoice_date', '>=', self.date_from),
|
|
('move_id.move_type', 'in', ('out_invoice', 'in_invoice'))
|
|
], limit=self.limit)
|
|
vals = [fields.Command.clear()]
|
|
for line in invoice_lines:
|
|
vals.append(fields.Command.create({
|
|
'date': line.move_id.invoice_date,
|
|
'partner_id': line.move_id.partner_id.id,
|
|
'qty': line.quantity,
|
|
'account_move_number': line.move_id.name,
|
|
'price_unit': line.price_unit,
|
|
'total': line.price_subtotal,
|
|
'type': line.move_id.move_type,
|
|
'move_id': line.move_id.id
|
|
}))
|
|
self.invoice_history_ids = vals
|
|
|
|
def action_add_to_invoice(self):
|
|
"""Add the product to the invoice.
|
|
This method is used to add the current product to the associated
|
|
invoice.It creates an invoice line and adds it to the invoice."""
|
|
account_id = self.product_id._get_invoice_account(self.account_move_id)
|
|
tax_ids = self.product_id._get_invoice_taxes \
|
|
(self.account_move_id, account_id)
|
|
invoice_line_vals = {
|
|
'product_id': self.product_id.id,
|
|
'product_uom_id': self.product_id.uom_id.id,
|
|
'quantity': self.qty,
|
|
'price_unit': self.price_unit,
|
|
'account_id': account_id.id,
|
|
'tax_ids': tax_ids,
|
|
'move_id': self.account_move_id.id,
|
|
}
|
|
invoice_line = self.env['account.move.line'].create(invoice_line_vals)
|
|
if invoice_line:
|
|
self.account_move_id.write(
|
|
{'invoice_line_ids': [fields.Command.link(invoice_line.id)]})
|
|
else:
|
|
raise UserError(_("Failed to create invoice line."))
|
|
|