from odoo import models, fields, api from odoo.exceptions import UserError from odoo.http import request import logging _logger = logging.getLogger(__name__) class UserCompanyRequest(models.Model): _name = 'user.company.request' _rec_name = 'user_id' user_id = fields.Many2one('res.partner', string='User') user_company_id = fields.Many2one('res.partner', string='Company') user_input = fields.Char(string='User Input') is_approve = fields.Selection([ ('approved', 'Approve'), ('rejected', 'Reject'), ], string='Approval') similar_company_ids = fields.Many2many('res.partner', compute="_compute_similar_companies", string="Similar Companies") is_switch_account = fields.Boolean( string='Switch Account', default=False) @api.depends('user_input') def _compute_similar_companies(self): for record in self: if record.user_input: record.similar_company_ids = [(6, 0, self.get_similar_companies(record.user_input))] else: record.similar_company_ids = [(6, 0, [])] # def get_similar_companies(self, user_input): # query = """ # SELECT id # FROM res_partner # WHERE levenshtein(name::text, %s) < 3 # ORDER BY levenshtein(name::text, %s) ASC # """ # self.env.cr.execute(query, (user_input, user_input)) # return [row[0] for row in self.env.cr.fetchall()] def get_similar_companies(self, user_input): query = """ SELECT id FROM res_partner WHERE (name ILIKE %s OR levenshtein(name::text, %s) < 3) AND active = TRUE AND is_company = TRUE ORDER BY levenshtein(name::text, %s) ASC """ # Menggunakan '%' untuk mencocokkan nama perusahaan sebagian self.env.cr.execute(query, ('%' + user_input + '%', user_input, user_input)) company_ids = [row[0] for row in self.env.cr.fetchall()] return company_ids internal_input = fields.Char(string='Internal Input') company_type = fields.Char(string='Company Type', compute='_compute_company_type') @api.depends('user_company_id.customer_type') def _compute_company_type(self): for record in self: if record.user_company_id.customer_type == 'nonpkp': record.company_type = 'Non PKP' elif record.user_company_id.customer_type == 'pkp': record.company_type = 'PKP' else: record.company_type = 'company type belum di set' def write(self, vals): user = self.get_user_by_email(self.user_id.email) user.parent_name = self.user_input is_approve = vals.get('is_approve') is_internal_input = vals.get('internal_input') is_company_id = vals.get('user_company_id') # if self.is_approve and is_approve: # raise UserError('Tidak dapat mengubah approval yang sudah diisi') if is_internal_input: if self.user_company_id.nama_wajib_pajak == self.user_company_id.name: self.user_company_id.nama_wajib_pajak = is_internal_input self.user_company_id.name = is_internal_input user_company_id = [] if is_company_id: user_company_id = request.env['res.partner'].search([('id', '=', is_company_id)], limit=1) _logger.info('User Company ID: %s', user_company_id) # self.user_company_id.customer_type = self.similar_company_ids.customer_type # self.user_company_id.npwp = self.similar_company_ids.npwp # self.user_company_id.sppkp = self.similar_company_ids.sppkp # self.user_company_id.nama_wajib_pajak = self.similar_company_ids.nama_wajib_pajak # self.user_company_id.alamat_lengkap_text = self.similar_company_ids.alamat_lengkap_text # self.user_company_id.industry_id = self.similar_company_ids.industry_id # self.user_company_id.company_type_id = self.similar_company_ids.company_type_id # self.user_company_id.user_id = self.similar_company_ids.user_id # self.user_company_id.property_account_receivable_id = self.similar_company_ids.property_account_receivable_id # self.user_company_id.property_account_payable_id = self.similar_company_ids.property_account_payable_id if not self.is_approve and is_approve: if is_approve == 'approved': self.user_id.parent_id = user_company_id if user_company_id else self.user_company_id self.user_id.customer_type = user_company_id.customer_type if user_company_id else self.user_company_id.customer_type self.user_id.npwp = user_company_id.npwp if user_company_id else self.user_company_id.npwp self.user_id.sppkp = user_company_id.sppkp if user_company_id else self.user_company_id.sppkp self.user_id.nama_wajib_pajak = user_company_id.nama_wajib_pajak if user_company_id else self.user_company_id.nama_wajib_pajak self.user_id.alamat_lengkap_text = user_company_id.alamat_lengkap_text if user_company_id else self.user_company_id.alamat_lengkap_text self.user_id.industry_id = user_company_id.industry_id.id if user_company_id else self.user_company_id.industry_id self.user_id.company_type_id = user_company_id.company_type_id.id if user_company_id else self.user_company_id.company_type_id self.user_id.user_id = user_company_id.user_id if user_company_id else self.user_company_id.user_id self.user_id.property_account_receivable_id = user_company_id.property_account_receivable_id if user_company_id else self.user_company_id.property_account_receivable_id self.user_id.property_account_payable_id = user_company_id.property_account_payable_id if user_company_id else self.user_company_id.property_account_payable_id self.user_id.property_payment_term_id = user_company_id.property_payment_term_id if user_company_id else self.user_company_id.property_payment_term_id self.user_id.property_supplier_payment_term_id = user_company_id.property_supplier_payment_term_id if user_company_id else self.user_company_id.property_supplier_payment_term_id # self.user_id.is_company = True # self.user_id.active = True self.user_company_id.active = True user.send_company_switch_approve_mail() if vals.get('is_switch_account') == True else user.send_company_request_approve_mail() else: # new_company = self.env['res.partner'].create({ # 'name': self.user_input # }) # self.user_id.parent_id = new_company.id user.send_company_request_reject_mail() return super(UserCompanyRequest, self).write(vals) def get_user_by_email(self, email): return request.env['res.users'].search([ ('login', '=', email), ('active', 'in', [True, False]) ])