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.
		
		
		
		
		
			
		
			
				
					
					
						
							205 lines
						
					
					
						
							9.0 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							205 lines
						
					
					
						
							9.0 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.exceptions import ValidationError
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								class AccountMove(models.Model):
							 | 
						|
								    """inherited account move"""
							 | 
						|
								    _inherit = "account.move"
							 | 
						|
								
							 | 
						|
								    @api.model
							 | 
						|
								    def _search_default_journal(self, journal_types):
							 | 
						|
								        """methode to set default journal"""
							 | 
						|
								        if len(self.env.user.branch_ids) == 1:
							 | 
						|
								            branch_id = self.env.user.branch_id.id
							 | 
						|
								            domain = [('branch_id', '=', branch_id),
							 | 
						|
								                      ('type', 'in', journal_types)]
							 | 
						|
								            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', 'in', journal_types),
							 | 
						|
								                          ('branch_id', '=', False)]
							 | 
						|
								                journal = self.env['account.journal'].search(domain, limit=1)
							 | 
						|
								            if not journal:
							 | 
						|
								                branch = self.env.user.branch_id
							 | 
						|
								                error_msg = _(
							 | 
						|
								                    "No journal could be found in  %(branch)s branch for "
							 | 
						|
								                    "any of those types: %(journal_types)s",
							 | 
						|
								                    branch=branch.name,
							 | 
						|
								                    journal_types=', '.join(journal_types),
							 | 
						|
								                )
							 | 
						|
								                raise UserError(error_msg)
							 | 
						|
								            return journal
							 | 
						|
								        else:
							 | 
						|
								            company_id = self.company_id.id if self.company_id else self._context.get('default_company_id',
							 | 
						|
								                                           self.env.company.id)
							 | 
						|
								            domain = [('company_id', '=', company_id),
							 | 
						|
								                      ('type', 'in', journal_types)]
							 | 
						|
								            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:
							 | 
						|
								                company = self.env['res.company'].browse(company_id)
							 | 
						|
								                error_msg = _(
							 | 
						|
								                    "No journal could be found in company %(company_name)s for "
							 | 
						|
								                    "any of those types: %(journal_types)s",
							 | 
						|
								                    company_name=company.display_name,
							 | 
						|
								                    journal_types=', '.join(journal_types),
							 | 
						|
								                )
							 | 
						|
								                raise UserError(error_msg)
							 | 
						|
								
							 | 
						|
								            return journal
							 | 
						|
								
							 | 
						|
								    @api.depends('journal_id')
							 | 
						|
								    def _compute_default_branch(self):
							 | 
						|
								        for record in self:
							 | 
						|
								            if record.journal_id:
							 | 
						|
								                record.branch_id = record.journal_id.branch_id.id
							 | 
						|
								            else:
							 | 
						|
								                record.branch_id = False
							 | 
						|
								
							 | 
						|
								    def _get_default_branch(self):
							 | 
						|
								        branch = False
							 | 
						|
								        if len(self.env.user.branch_ids) == 1:
							 | 
						|
								            branch = self.env.user.branch_id
							 | 
						|
								            return branch
							 | 
						|
								
							 | 
						|
								    def _get_branch_domain(self):
							 | 
						|
								        """methode to get branch domain"""
							 | 
						|
								        company = self.env.company
							 | 
						|
								        branch_ids = self.env.user.branch_ids
							 | 
						|
								        branch = branch_ids.filtered(
							 | 
						|
								            lambda branch: branch.company_id == company)
							 | 
						|
								        return [('id', 'in', branch.ids)]
							 | 
						|
								
							 | 
						|
								    branch_id = fields.Many2one('res.branch', string='Branch', store=True,
							 | 
						|
								                                readonly=False,
							 | 
						|
								                                default=_get_default_branch,
							 | 
						|
								                                domain=_get_branch_domain,
							 | 
						|
								                                compute=_compute_default_branch)
							 | 
						|
								
							 | 
						|
								    @api.onchange('branch_id')
							 | 
						|
								    def onchange_branch_id(self):
							 | 
						|
								        """onchange methode"""
							 | 
						|
								        move_type = self._context.get('default_move_type', 'entry')
							 | 
						|
								        if move_type in self.get_sale_types(include_receipts=True):
							 | 
						|
								            journal_types = ['sale']
							 | 
						|
								        elif move_type in self.get_purchase_types(include_receipts=True):
							 | 
						|
								            journal_types = ['purchase']
							 | 
						|
								        else:
							 | 
						|
								            journal_types = self._context.get('default_move_journal_types', ['general'])
							 | 
						|
								        branch_id = self.branch_id.id
							 | 
						|
								        domain = [('branch_id', '=', branch_id),
							 | 
						|
								                  ('type', 'in', journal_types)]
							 | 
						|
								        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', 'in', journal_types),
							 | 
						|
								                      ('branch_id', '=', False)]
							 | 
						|
								            journal = self.env['account.journal'].search(domain, limit=1)
							 | 
						|
								        if not journal and journal_types:
							 | 
						|
								            branch = self.branch_id
							 | 
						|
								            error_msg = _(
							 | 
						|
								                "No journal could be found in %(branch)s branch for "
							 | 
						|
								                "any of those types: %(journal_types)s",
							 | 
						|
								                branch=branch.name,
							 | 
						|
								                journal_types=', '.join(journal_types),
							 | 
						|
								            )
							 | 
						|
								            raise UserError(error_msg)
							 | 
						|
								        self.journal_id = journal
							 | 
						|
								
							 | 
						|
								    @api.depends('company_id', 'invoice_filter_type_domain')
							 | 
						|
								    def _compute_suitable_journal_ids(self):
							 | 
						|
								        """methode to compute suitable journal ids"""
							 | 
						|
								        if self.branch_id:
							 | 
						|
								            for m in self:
							 | 
						|
								                journal_type = m.invoice_filter_type_domain or 'general'
							 | 
						|
								                branch_id = m.branch_id.id #or self.env.user.branch_id.id
							 | 
						|
								                domain = [('type', '=', journal_type),
							 | 
						|
								                          '|', ('branch_id', '=', branch_id),
							 | 
						|
								                          ('branch_id', '=', False)]
							 | 
						|
								                m.suitable_journal_ids = self.env['account.journal'].search(
							 | 
						|
								                    domain)
							 | 
						|
								
							 | 
						|
								        else:
							 | 
						|
								            for m in self:
							 | 
						|
								                journal_type = m.invoice_filter_type_domain or 'general'
							 | 
						|
								                company_id = m.company_id.id if m.company_id else self.env.company.id
							 | 
						|
								                domain = [('company_id', '=', company_id),
							 | 
						|
								                          ('type', '=', journal_type)]
							 | 
						|
								                m.suitable_journal_ids = self.env['account.journal'].search(
							 | 
						|
								                    domain)
							 | 
						|
								
							 | 
						|
								    @api.constrains('branch_id', 'line_ids')
							 | 
						|
								    def _check_move_line_branch_id(self):
							 | 
						|
								        """methode to check branch of accounts and entry"""
							 | 
						|
								        for move in self:
							 | 
						|
								            branches = move.line_ids.account_id.branch_id
							 | 
						|
								            if branches and branches != move.branch_id:
							 | 
						|
								                bad_accounts = move.line_ids.account_id.filtered(
							 | 
						|
								                    lambda a: a.branch_id and a.branch_id != move.branch_id)
							 | 
						|
								                raise ValidationError(_(
							 | 
						|
								                    "Your items contains accounts from %(line_branch)s branch"
							 | 
						|
								                    " whereas your entry belongs to %(move_branch)s branch. "
							 | 
						|
								                    "\n Please change the branch of your entry or remove the "
							 | 
						|
								                    "accounts from other branches (%(bad_accounts)s).",
							 | 
						|
								                    line_branch=', '.join(branches.mapped('name')),
							 | 
						|
								                    move_branch=move.branch_id.name,
							 | 
						|
								                    bad_accounts=', '.join(bad_accounts.mapped('name')),
							 | 
						|
								                ))
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								class AccountMoveLine(models.Model):
							 | 
						|
								    """inherited account move line"""
							 | 
						|
								    _inherit = "account.move.line"
							 | 
						|
								
							 | 
						|
								    branch_id = fields.Many2one('res.branch', related='move_id.branch_id',
							 | 
						|
								                                string='Branch', store=True)
							 | 
						|
								
							 | 
						|
								    account_id = fields.Many2one(
							 | 
						|
								        'account.account', string='Account',
							 | 
						|
								        index=True, ondelete="cascade",
							 | 
						|
								        domain="[('deprecated', '=', False), ('company_id', '=', 'company_id'),"
							 | 
						|
								               "('is_off_balance', '=', False), '|', "
							 | 
						|
								               "('branch_id', '=', branch_id), ('branch_id', '=', False)]",
							 | 
						|
								        check_company=True,
							 | 
						|
								        tracking=True)
							 | 
						|
								
							 |