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.
		
		
		
		
		
			
		
			
				
					
					
						
							189 lines
						
					
					
						
							8.3 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							189 lines
						
					
					
						
							8.3 KiB
						
					
					
				| # -*- coding: utf-8 -*- | |
| ############################################################################# | |
| # | |
| #    Cybrosys Technologies Pvt. Ltd. | |
| # | |
| #    Copyright (C) 2022-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 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 odoo import models, fields, api, _ | |
| from odoo.exceptions import UserError | |
| from odoo.addons.purchase.models.purchase import PurchaseOrder as Purchase | |
| from odoo.exceptions import ValidationError | |
| 
 | |
| 
 | |
| class PurchaseOrder(models.Model): | |
|     """inherited purchase order""" | |
|     _inherit = 'purchase.order' | |
| 
 | |
|     branch_id = fields.Many2one("res.branch", string='Branch', store=True, | |
|                                 readonly=False, | |
|                                 compute="_compute_branch") | |
| 
 | |
|     @api.depends('company_id') | |
|     def _compute_branch(self): | |
|         for order in self: | |
|             company = self.env.company | |
|             so_company = order.company_id if order.company_id else self.env.company | |
|             branch_ids = self.env.user.branch_ids | |
|             branch = branch_ids.filtered( | |
|                 lambda branch: branch.company_id == so_company) | |
|             if branch: | |
|                 order.branch_id = branch.ids[0] | |
|             else: | |
|                 order.branch_id = False | |
| 
 | |
|     @api.model | |
|     def _get_picking_type(self, company_id): | |
|         """methode to set default picking type""" | |
|         if len(self.env.user.branch_ids) == 1: | |
|             picking_type = self.env['stock.picking.type'].search( | |
|                 [('code', '=', 'incoming'), | |
|                  ('warehouse_id.branch_id', '=', company_id)]) | |
|             if not picking_type: | |
|                 picking_type = self.env['stock.picking.type'].search( | |
|                     [('code', '=', 'incoming'), | |
|                      ('warehouse_id.branch_id', '=', False)]) | |
|             if not picking_type: | |
|                 error_msg = _( | |
|                     "No warehouse could be found in the '%s' branch", | |
|                     self.env.user.branch_id.name | |
|                 ) | |
|                 raise UserError(error_msg) | |
|             return picking_type[:1] | |
|         else: | |
|             res = super(PurchaseOrder, self)._get_picking_type(company_id) | |
|             return res | |
| 
 | |
|     @api.model | |
|     def _default_picking_type(self): | |
|         """methode to get default picking type""" | |
|         if len(self.env.user.branch_ids) == 1: | |
|             branch = self.env.user.branch_id | |
|             if branch: | |
|                 return self._get_picking_type(branch.id) | |
|         else: | |
|             return self._get_picking_type(self.env.context.get('company_id') | |
|                                           or self.env.company.id) | |
| 
 | |
|     picking_type_id = fields.Many2one( | |
|         'stock.picking.type', 'Deliver To', | |
|         states=Purchase.READONLY_STATES, | |
|         required=True, | |
|         default=_default_picking_type, | |
|         domain="[('code','=','incoming'), " | |
|                "('warehouse_id.company_id', '=', company_id)," | |
|                "'|', ('warehouse_id.branch_id', '=', branch_id)," | |
|                "('warehouse_id.branch_id', '=', False),]", | |
|         help="This will determine operation type" | |
|              " of incoming shipment") | |
| 
 | |
|     @api.constrains('branch_id', 'partner_id') | |
|     def _check_partner_branch_id(self): | |
|         """methode to check branch of partner and purchase order""" | |
|         for order in self: | |
|             branch = order.partner_id.branch_id | |
|             if branch and branch != order.branch_id: | |
|                 raise ValidationError(_( | |
|                     "Your quotation vendor is from %(partner_branch)s " | |
|                     "branch whereas your quotation belongs to %(quote_branch)s" | |
|                     " branch \n Please change the " | |
|                     "branch of your quotation or remove the vendor from " | |
|                     "other branch.", | |
|                     partner_branch=branch.name, | |
|                     quote_branch=order.branch_id.name, | |
|                 )) | |
| 
 | |
|     @api.constrains('branch_id', 'order_line') | |
|     def _check_order_line_branch_id(self): | |
|         """methode to check branch of products and purchase order""" | |
|         for order in self: | |
|             branches = order.order_line.product_id.branch_id | |
|             if branches and branches != order.branch_id: | |
|                 bad_products = order.order_line.product_id.filtered( | |
|                     lambda p: p.branch_id and p.branch_id != order.branch_id) | |
|                 raise ValidationError(_( | |
|                     "Your quotation contains products from %(product_branch)s " | |
|                     "branch whereas your quotation belongs to %(quote_branch)s" | |
|                     " branch \n Please change the " | |
|                     "branch of your quotation or remove the products from " | |
|                     "other branches (%(bad_products)s).", | |
|                     product_branch=', '.join(branches.mapped('name')), | |
|                     quote_branch=order.branch_id.name, | |
|                     bad_products=', '.join(bad_products.mapped('display_name')), | |
|                 )) | |
| 
 | |
|     def _prepare_invoice(self): | |
|         """override prepare_invoice function to include branch""" | |
|         invoice_vals = super(PurchaseOrder, self)._prepare_invoice() | |
|         branch_id = self.branch_id.id | |
|         domain = [('branch_id', '=', branch_id), | |
|                   ('type', '=', 'purchase'), ('company_id', '=', self.company_id.id)] | |
|         journal = None | |
| 
 | |
|         if self._context.get('default_currency_id'): | |
|             currency_domain = domain + [ | |
|                 ('currency_id', '=', self._context['default_currency_id'])] | |
|             journal = self.env['account.journal'].search(currency_domain, | |
|                                                          limit=1) | |
| 
 | |
|         if not journal: | |
|             journal = self.env['account.journal'].search(domain, limit=1) | |
|         if not journal: | |
|             domain = [('type', '=', 'purchase'), | |
|                       ('branch_id', '=', False), ('company_id', '=', self.company_id.id)] | |
|             journal = self.env['account.journal'].search(domain, limit=1) | |
|         if not journal: | |
|             error_msg = _( | |
|                 "No journal could be found in the'%s' branch" | |
|                 " for any of those types: purchase", self.branch_id.name,) | |
|             raise UserError(error_msg) | |
|         invoice_vals['branch_id'] = self.branch_id.id or False | |
|         invoice_vals['journal_id'] = journal.id | |
|         return invoice_vals | |
| 
 | |
|     @api.onchange('branch_id') | |
|     def onchange_branch_id(self): | |
|         """onchange function""" | |
|         if self.branch_id and self.branch_id not in self.env.user.branch_ids and self.env.user.branch_ids: | |
|             raise UserError("Unauthorised Branch") | |
|         self.picking_type_id = False | |
|         if self.branch_id: | |
|             picking_type = self.env['stock.picking.type'].sudo().search( | |
|                 [('branch_id', '=', self.branch_id.id), ('company_id', '=', self.company_id.id)], limit=1) | |
|             self.picking_type_id = picking_type | |
|             if not picking_type: | |
|                 picking_type = self.env['stock.picking.type'].sudo().search( | |
|                     [('branch_id', '=', False), ('company_id', '=', self.company_id.id)], limit=1) | |
|             self.picking_type_id = picking_type | |
|             if not picking_type: | |
|                 error_msg = _( | |
|                     "No warehouse could be found in the '%s' branch", | |
|                     self.branch_id.name | |
|                 ) | |
|                 raise UserError(error_msg) | |
|         else: | |
|             self.picking_type_id = self.env['stock.picking.type'].sudo().search( | |
|                 [('branch_id', '=', False), ('company_id', '=', self.company_id.id)], limit=1) | |
| 
 | |
| 
 | |
| class PurchaseOrderLine(models.Model): | |
|     """inherited purchase order line""" | |
|     _inherit = 'purchase.order.line' | |
| 
 | |
|     branch_id = fields.Many2one(related='order_id.branch_id', string='Branch', | |
|                                 store=True)
 | |
| 
 |