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.
		
		
		
		
		
			
		
			
				
					
					
						
							370 lines
						
					
					
						
							19 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							370 lines
						
					
					
						
							19 KiB
						
					
					
				| # -*- coding: utf-8 -*- | |
| ############################################################################# | |
| # | |
| #    Cybrosys Technologies Pvt. Ltd. | |
| # | |
| #    Copyright (C) 2025-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). | |
| #    Author: Cybrosys Techno Solutions(<https://www.cybrosys.com>) | |
| # | |
| #    You can modify it under the terms of the GNU AFFERO | |
| #    GENERAL PUBLIC LICENSE (AGPL 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 AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details. | |
| # | |
| #    You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE | |
| #    (AGPL v3) along with this program. | |
| #    If not, see <http://www.gnu.org/licenses/>. | |
| # | |
| ############################################################################# | |
| from odoo import fields, models, _ | |
| from odoo.exceptions import UserError | |
| 
 | |
| 
 | |
| class StockPicking(models.Model): | |
|     _inherit = 'stock.picking' | |
| 
 | |
|     invoice_count = fields.Integer(string='Invoices', | |
|                                    compute='_compute_invoice_count', | |
|                                    help='The number of associated invoices for ' | |
|                                         'this picking.') | |
|     operation_code = fields.Selection(related='picking_type_id.code', | |
|                                       string='Operation Code', | |
|                                       help='The code related to the operation ' | |
|                                            'of this picking.') | |
|     is_return = fields.Boolean(string='Return', | |
|                                help='Indicates whether this picking is a ' | |
|                                     'return.') | |
| 
 | |
|     def _compute_invoice_count(self): | |
|         """This computes function used to count the number of invoice for | |
|         the picking""" | |
|         for picking_id in self: | |
|             move_ids = picking_id.env['account.move'].search( | |
|                 [('transfer_ids', 'in', picking_id.id)]) | |
|             if move_ids: | |
|                 self.invoice_count = len(move_ids) | |
|             else: | |
|                 self.invoice_count = 0 | |
| 
 | |
|     def action_create_invoice(self): | |
|         """This is the function for creating customer invoice | |
|         from the picking""" | |
|         for picking_id in self: | |
|             current_user = self.env.uid | |
|             if picking_id.picking_type_id.code == 'outgoing': | |
|                 customer_journal_id = \ | |
|                     picking_id.env['ir.config_parameter'].sudo(). \ | |
|                         get_param('stock_move_invoice.customer_journal_id') or \ | |
|                     False | |
|                 if not customer_journal_id: | |
|                     raise UserError( | |
|                         _("Please configure the journal from settings")) | |
|                 invoice_line_list = [] | |
|                 for move_ids_without_package in picking_id. \ | |
|                         move_ids_without_package: | |
|                     vals = (0, 0, { | |
|                         'name': move_ids_without_package.description_picking, | |
|                         'product_id': move_ids_without_package.product_id.id, | |
|                         'price_unit': | |
|                             move_ids_without_package.product_id.lst_price, | |
|                         'account_id': | |
|                             move_ids_without_package.product_id. | |
|                             property_account_income_id.id if | |
|                             move_ids_without_package. | |
|                             product_id.property_account_income_id | |
|                             else move_ids_without_package. | |
|                             product_id.categ_id. | |
|                             property_account_income_categ_id.id, | |
|                         'tax_ids': [(6, 0, [ | |
|                             picking_id.company_id.account_sale_tax_id.id])], | |
|                         'quantity': move_ids_without_package.quantity, | |
|                     }) | |
|                     invoice_line_list.append(vals) | |
|                     invoice = picking_id.env['account.move'].create({ | |
|                         'move_type': 'out_invoice', | |
|                         'invoice_origin': picking_id.name, | |
|                         'invoice_user_id': current_user, | |
|                         'narration': picking_id.name, | |
|                         'partner_id': picking_id.partner_id.id, | |
|                         'currency_id': | |
|                             picking_id.env.user.company_id.currency_id.id, | |
|                         'journal_id': int(customer_journal_id), | |
|                         'payment_reference': picking_id.name, | |
|                         'picking_id': picking_id.id, | |
|                         'invoice_line_ids': invoice_line_list, | |
|                         'transfer_ids': self | |
|                     }) | |
|                     return invoice | |
| 
 | |
|     def action_create_bill(self): | |
|         """This is the function for creating vendor bill | |
|                 from the picking""" | |
|         for picking_id in self: | |
|             current_user = self.env.uid | |
|             if picking_id.picking_type_id.code == 'incoming': | |
|                 vendor_journal_id = picking_id.env[ | |
|                                         'ir.config_parameter'].sudo().get_param( | |
|                     'stock_move_invoice.vendor_journal_id') or False | |
|                 if not vendor_journal_id: | |
|                     raise UserError( | |
|                         _("Please configure the journal from the settings.")) | |
|                 invoice_line_list = [] | |
|                 for move_ids_without_package in picking_id. \ | |
|                         move_ids_without_package: | |
|                     vals = (0, 0, { | |
|                         'name': move_ids_without_package.description_picking, | |
|                         'product_id': move_ids_without_package.product_id.id, | |
|                         'price_unit': | |
|                             move_ids_without_package.product_id.lst_price, | |
|                         'account_id': | |
|                             move_ids_without_package.product_id. | |
|                             property_account_income_id.id if | |
|                             move_ids_without_package.product_id. | |
|                             property_account_income_id | |
|                             else move_ids_without_package.product_id.categ_id. | |
|                             property_account_income_categ_id.id, | |
|                         'tax_ids': [(6, 0, [ | |
|                             picking_id.company_id.account_purchase_tax_id.id])], | |
|                         'quantity': move_ids_without_package.quantity, | |
|                     }) | |
|                     invoice_line_list.append(vals) | |
|                     invoice = picking_id.env['account.move'].create({ | |
|                         'move_type': 'in_invoice', | |
|                         'invoice_origin': picking_id.name, | |
|                         'invoice_user_id': current_user, | |
|                         'narration': picking_id.name, | |
|                         'partner_id': picking_id.partner_id.id, | |
|                         'currency_id': | |
|                             picking_id.env.user.company_id.currency_id.id, | |
|                         'journal_id': int(vendor_journal_id), | |
|                         'payment_reference': picking_id.name, | |
|                         'picking_id': picking_id.id, | |
|                         'invoice_line_ids': invoice_line_list, | |
|                         'transfer_ids': self | |
|                     }) | |
|                     return invoice | |
| 
 | |
|     def action_create_customer_credit(self): | |
|         """This is the function for creating customer credit note | |
|                 from the picking""" | |
|         for picking_id in self: | |
|             current_user = picking_id.env.uid | |
|             if picking_id.picking_type_id.code == 'incoming': | |
|                 customer_journal_id = \ | |
|                     picking_id.env['ir.config_parameter'].sudo(). \ | |
|                         get_param('stock_move_invoice.customer_journal_id') or \ | |
|                     False | |
|                 if not customer_journal_id: | |
|                     raise UserError( | |
|                         _("Please configure the journal from settings")) | |
|                 invoice_line_list = [] | |
|                 for move_ids_without_package in picking_id. \ | |
|                         move_ids_without_package: | |
|                     vals = (0, 0, { | |
|                         'name': move_ids_without_package.description_picking, | |
|                         'product_id': move_ids_without_package.product_id.id, | |
|                         'price_unit': | |
|                             move_ids_without_package.product_id.lst_price, | |
|                         'account_id': move_ids_without_package.product_id. | |
|                             property_account_income_id.id if | |
|                         move_ids_without_package.product_id. | |
|                             property_account_income_id | |
|                         else move_ids_without_package.product_id.categ_id. | |
|                             property_account_income_categ_id.id, | |
|                         'tax_ids': [(6, 0, [ | |
|                             picking_id.company_id.account_sale_tax_id.id])], | |
|                         'quantity': move_ids_without_package.quantity, | |
|                     }) | |
|                     invoice_line_list.append(vals) | |
|                     invoice = picking_id.env['account.move'].create({ | |
|                         'move_type': 'out_refund', | |
|                         'invoice_origin': picking_id.name, | |
|                         'invoice_user_id': current_user, | |
|                         'narration': picking_id.name, | |
|                         'partner_id': picking_id.partner_id.id, | |
|                         'currency_id': | |
|                             picking_id.env.user.company_id.currency_id.id, | |
|                         'journal_id': int(customer_journal_id), | |
|                         'payment_reference': picking_id.name, | |
|                         'picking_id': picking_id.id, | |
|                         'invoice_line_ids': invoice_line_list, | |
|                         'transfer_ids': self | |
|                     }) | |
|                     return invoice | |
| 
 | |
|     def action_create_vendor_credit(self): | |
|         """This is the function for creating refund | |
|                 from the picking""" | |
|         for picking_id in self: | |
|             current_user = self.env.uid | |
|             if picking_id.picking_type_id.code == 'outgoing': | |
|                 vendor_journal_id = picking_id.env[ | |
|                                         'ir.config_parameter'].sudo().get_param( | |
|                     'stock_move_invoice.vendor_journal_id') or False | |
|                 if not vendor_journal_id: | |
|                     raise UserError( | |
|                         _("Please configure the journal from the settings.")) | |
|                 invoice_line_list = [] | |
|                 for move_ids_without_package in picking_id. \ | |
|                         move_ids_without_package: | |
|                     vals = (0, 0, { | |
|                         'name': move_ids_without_package.description_picking, | |
|                         'product_id': move_ids_without_package.product_id.id, | |
|                         'price_unit': | |
|                             move_ids_without_package.product_id.lst_price, | |
|                         'account_id': move_ids_without_package.product_id. | |
|                             property_account_income_id.id if | |
|                         move_ids_without_package.product_id. | |
|                             property_account_income_id | |
|                         else move_ids_without_package.product_id.categ_id. | |
|                             property_account_income_categ_id.id, | |
|                         'tax_ids': [(6, 0, [ | |
|                             picking_id.company_id.account_purchase_tax_id.id])], | |
|                         'quantity': move_ids_without_package.quantity, | |
|                     }) | |
|                     invoice_line_list.append(vals) | |
|                     invoice = picking_id.env['account.move'].create({ | |
|                         'move_type': 'in_refund', | |
|                         'invoice_origin': picking_id.name, | |
|                         'invoice_user_id': current_user, | |
|                         'narration': picking_id.name, | |
|                         'partner_id': picking_id.partner_id.id, | |
|                         'currency_id': | |
|                             picking_id.env.user.company_id.currency_id.id, | |
|                         'journal_id': int(vendor_journal_id), | |
|                         'payment_reference': picking_id.name, | |
|                         'picking_id': picking_id.id, | |
|                         'invoice_line_ids': invoice_line_list, | |
|                         'transfer_ids': self | |
|                     }) | |
|                     return invoice | |
| 
 | |
|     def action_open_picking_invoice(self): | |
|         """This is the function of the smart button which redirect to the | |
|         invoice related to the current picking""" | |
|         return { | |
|             'name': 'Invoices', | |
|             'type': 'ir.actions.act_window', | |
|             'view_mode': 'list,form', | |
|             'res_model': 'account.move', | |
|             'domain': [('transfer_ids', 'in', self.id)], | |
|             'context': {'create': False}, | |
|             'target': 'current' | |
|         } | |
| 
 | |
|     def action_create_multi_invoice_for_multi_transfer(self): | |
|         """This is the function for creating customer invoice | |
|         from the picking""" | |
|         picking_type = list(self.picking_type_id) | |
|         if all(first == picking_type[0] for first in picking_type): | |
|             if self.picking_type_id.code == 'outgoing': | |
|                 partner = list(self.partner_id) | |
|                 if all(first == partner[0] for first in partner): | |
|                     partner_id = self.partner_id | |
|                     invoice_line_list = [] | |
|                     customer_journal_id = \ | |
|                         self.env['ir.config_parameter'].sudo(). \ | |
|                             get_param('stock_move_invoice.customer_journal_id') \ | |
|                         or False | |
|                     if not customer_journal_id: | |
|                         raise UserError( | |
|                             _("Please configure the journal from settings")) | |
|                     for picking_id in self: | |
|                         for move_ids_without_package in picking_id. \ | |
|                                 move_ids_without_package: | |
|                             vals = (0, 0, { | |
|                                 'name': | |
|                                     move_ids_without_package.description_picking | |
|                                 , | |
|                                 'product_id': | |
|                                     move_ids_without_package.product_id.id, | |
|                                 'price_unit': move_ids_without_package. | |
|                                     product_id.lst_price, | |
|                                 'account_id': move_ids_without_package. | |
|                                     product_id.property_account_income_id.id if | |
|                                 move_ids_without_package.product_id. | |
|                                     property_account_income_id | |
|                                 else move_ids_without_package. | |
|                                     product_id.categ_id. | |
|                                     property_account_income_categ_id.id, | |
|                                 'tax_ids': [(6, 0, [picking_id.company_id. | |
|                                              account_purchase_tax_id.id])], | |
|                                 'quantity': | |
|                                     move_ids_without_package.quantity, | |
|                             }) | |
|                             invoice_line_list.append(vals) | |
|                     invoice = self.env['account.move'].create({ | |
|                         'move_type': 'out_invoice', | |
|                         'invoice_origin': picking_id.name, | |
|                         'invoice_user_id': self.env.uid, | |
|                         'narration': picking_id.name, | |
|                         'partner_id': partner_id.id, | |
|                         'currency_id': | |
|                             picking_id.env.user.company_id.currency_id.id, | |
|                         'journal_id': int(customer_journal_id), | |
|                         'payment_reference': picking_id.name, | |
|                         'invoice_line_ids': invoice_line_list, | |
|                         'transfer_ids': self | |
|                     }) | |
|                 else: | |
|                     for picking_id in self: | |
|                         picking_id.create_invoice() | |
|             elif self.picking_type_id.code == 'incoming': | |
|                 partner = list(self.partner_id) | |
|                 if all(first == partner[0] for first in partner): | |
|                     partner_id = self.partner_id | |
|                     bill_line_list = [] | |
|                     vendor_journal_id = \ | |
|                         self.env['ir.config_parameter'].sudo(). \ | |
|                             get_param('stock_move_invoice.vendor_journal_id') \ | |
|                         or False | |
|                     if not vendor_journal_id: | |
|                         raise UserError(_("Please configure the journal from " | |
|                                           "the settings.")) | |
|                     for picking_id in self: | |
|                         for move_ids_without_package in picking_id. \ | |
|                                 move_ids_without_package: | |
|                             vals = (0, 0, { | |
|                                 'name': | |
|                                     move_ids_without_package.description_picking | |
|                                 , | |
|                                 'product_id': | |
|                                     move_ids_without_package.product_id.id, | |
|                                 'price_unit': move_ids_without_package. | |
|                                     product_id.lst_price, | |
|                                 'account_id': move_ids_without_package. | |
|                                     product_id.property_account_income_id.id if | |
|                                 move_ids_without_package.product_id. | |
|                                     property_account_income_id | |
|                                 else move_ids_without_package. | |
|                                     product_id.categ_id. | |
|                                     property_account_income_categ_id.id, | |
|                                 'tax_ids': [(6, 0, [picking_id.company_id. | |
|                                              account_purchase_tax_id.id])], | |
|                                 'quantity': | |
|                                     move_ids_without_package.quantity, | |
|                             }) | |
|                             bill_line_list.append(vals) | |
|                     invoice = self.env['account.move'].create({ | |
|                         'move_type': 'in_invoice', | |
|                         'invoice_origin': picking_id.name, | |
|                         'invoice_user_id': self.env.uid, | |
|                         'narration': picking_id.name, | |
|                         'partner_id': partner_id.id, | |
|                         'currency_id': | |
|                             picking_id.env.user.company_id.currency_id.id, | |
|                         'journal_id': int(vendor_journal_id), | |
|                         'payment_reference': picking_id.name, | |
|                         'picking_id': picking_id.id, | |
|                         'invoice_line_ids': bill_line_list, | |
|                         'transfer_ids': self | |
|                     }) | |
|                 else: | |
|                     for picking_id in self: | |
|                         picking_id.create_bill() | |
|         else: | |
|             raise UserError( | |
|                 _("Please select single type transfer"))
 | |
| 
 |