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.
		
		
		
		
		
			
		
			
				
					
					
						
							208 lines
						
					
					
						
							11 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							208 lines
						
					
					
						
							11 KiB
						
					
					
				| # -*- coding: utf-8 -*- | |
| ############################################################################# | |
| # | |
| #    Cybrosys Technologies Pvt. Ltd. | |
| # | |
| #    Copyright (C) 2020-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). | |
| #    Author: Sayooj A O(<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') | |
|     operation_code = fields.Selection(related='picking_type_id.code') | |
|     is_return = fields.Boolean() | |
| 
 | |
|     def _compute_invoice_count(self): | |
|         """This compute function used to count the number of invoice for the picking""" | |
|         for picking_id in self: | |
|             move_ids = picking_id.env['account.move'].search([('invoice_origin', '=', picking_id.name)]) | |
|             if move_ids: | |
|                 self.invoice_count = len(move_ids) | |
|             else: | |
|                 self.invoice_count = 0 | |
| 
 | |
|     def 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_done, | |
|                     }) | |
|                     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 | |
|                 }) | |
|                 return invoice | |
| 
 | |
|     def 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_done, | |
|                     }) | |
|                     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 | |
|                 }) | |
|                 return invoice | |
| 
 | |
|     def 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_done, | |
|                     }) | |
|                     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 | |
|                 }) | |
|                 return invoice | |
| 
 | |
|     def 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_done, | |
|                     }) | |
|                     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 | |
|                 }) | |
|                 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': 'tree,form', | |
|             'res_model': 'account.move', | |
|             'domain': [('invoice_origin', '=', self.name)], | |
|             'context': {'create': False}, | |
|             'target': 'current' | |
|         } | |
| 
 | |
| 
 | |
| class StockReturnInvoicePicking(models.TransientModel): | |
|     _inherit = 'stock.return.picking' | |
| 
 | |
|     def _create_returns(self): | |
|         """in this function the picking is marked as return""" | |
|         new_picking, pick_type_id = super(StockReturnInvoicePicking, self)._create_returns() | |
|         picking = self.env['stock.picking'].browse(new_picking) | |
|         picking.write({'is_return': True}) | |
|         return new_picking, pick_type_id
 | |
| 
 |