from odoo import models, fields, api from odoo.exceptions import UserError, ValidationError from datetime import datetime class GroupPartner(models.Model): _name = 'group.partner' name = fields.Char(string='Name') class ResPartner(models.Model): _inherit = 'res.partner' reference_number = fields.Char(string="Reference Number") company_type_id = fields.Many2one('res.partner.company_type', string='Company Type') custom_pricelist_id = fields.Many2one('product.pricelist', string='Price Matrix') group_partner_id = fields.Many2one('group.partner', string='Group Partner') customer_type = fields.Selection([ ('pkp', 'PKP'), ('nonpkp', 'Non PKP') ]) sppkp = fields.Char(string="SPPKP", tracking=True) npwp = fields.Char(string="NPWP", tracking=True) counter = fields.Integer(string="Counter", default=0) leadtime = fields.Integer(string="Leadtime", default=0) digital_invoice_tax = fields.Boolean(string="Digital Invoice & Faktur Pajak") is_potential = fields.Boolean(string='Potential') pakta_integritas = fields.Boolean(string='Pakta Integritas') use_so_approval = fields.Boolean(string='Use SO Approval') use_only_ready_stock = fields.Boolean(string='Use Only Ready Stock') web_role = fields.Selection([ ('manager', 'Manager'), ('director', 'Director'), ('procurement', 'Procurement'), ], string='Web Role') site_id = fields.Many2one('res.partner.site', string='Site') main_parent_id = fields.Many2one('res.partner', string='Main Parent', compute='_compute_main_parent_id') pareto_status = fields.Selection([ ('PR', 'Pareto Repeating'), ('PPR', 'Potensi Pareto Repeating'), ('PNR', 'Pareto Non Repeating'), ('NP', 'Non Pareto') ]) email_finance = fields.Char(string='Email Finance') email_sales = fields.Char(string='Email Sales') user_payment_terms_sales = fields.Many2one('res.users', string='Users Update Payment Terms') date_payment_terms_sales = fields.Datetime(string='Date Update Payment Terms') user_payment_terms_purchase = fields.Many2one('res.users', string='Users Update Payment Terms') date_payment_terms_purchase = fields.Datetime(string='Date Update Payment Terms') @api.model def _default_payment_term(self): return self.env.ref('__export__.account_payment_term_26_484409e2').id property_payment_term_id = fields.Many2one( 'account.payment.term', string='Payment Terms', default=_default_payment_term ) @api.depends("street", "street2", "city", "state_id", "country_id", "blok", "nomor", "rt", "rw", "kelurahan_id", "kecamatan_id") def _alamat_lengkap_text(self): for partner in self: if partner.company_type == 'person' and not partner.parent_id: partner.alamat_lengkap_text = partner.street # if partner.company_type == 'person' and partner.parent_id: # partner.alamat_lengkap_text = partner.parent_id.alamat_lengkap_text alamat_lengkap_text = fields.Text(string="Alamat Lengkap", required=False , tracking=3) def write(self, vals): res = super(ResPartner, self).write(vals) # # # if 'property_payment_term_id' in vals: # # if not self.env.user.is_accounting and vals['property_payment_term_id'] != 26: # # raise UserError('Hanya Finance Accounting yang dapat merubah payment term') # # # group_id = self.env.ref('indoteknik_custom.group_role_merchandiser').id # # users_in_group = self.env['res.users'].search([('groups_id', 'in', [group_id])]) # # if self.env.user.id not in users_in_group.mapped('id'): # # raise UserError('You name it') # return res def write(self, vals): # Fungsi rekursif untuk meng-update semua child, termasuk child dari child def update_children_recursively(partner, vals_for_child): # Lakukan update pada partner saat ini hanya dengan field yang diizinkan partner.write(vals_for_child) # Untuk setiap child dari partner ini, update juga child-nya for child in partner.child_ids: update_children_recursively(child, vals_for_child) # Jika self tidak memiliki parent_id, artinya self adalah parent if not self.parent_id: # Ambil semua child dari parent ini children = self.child_ids # Perbarui vals dengan nilai dari parent jika tidak ada dalam vals vals['customer_type'] = vals.get('customer_type', self.customer_type) vals['nama_wajib_pajak'] = vals.get('nama_wajib_pajak', self.nama_wajib_pajak) vals['npwp'] = vals.get('npwp', self.npwp) vals['sppkp'] = vals.get('sppkp', self.sppkp) vals['alamat_lengkap_text'] = vals.get('alamat_lengkap_text', self.alamat_lengkap_text) vals['industry_id'] = vals.get('industry_id', self.industry_id.id if self.industry_id else None) vals['company_type_id'] = vals.get('company_type_id', self.company_type_id.id if self.company_type_id else None) # Simpan hanya field yang perlu di-update pada child vals_for_child = { 'customer_type': vals.get('customer_type'), 'nama_wajib_pajak': vals.get('nama_wajib_pajak'), 'npwp': vals.get('npwp'), 'sppkp': vals.get('sppkp'), 'alamat_lengkap_text': vals.get('alamat_lengkap_text'), 'industry_id': vals.get('industry_id'), 'company_type_id': vals.get('company_type_id') } # Lakukan update pada semua child secara rekursif for child in children: update_children_recursively(child, vals_for_child) # Lakukan write untuk parent dengan vals asli res = super(ResPartner, self).write(vals) return res # if self.company_type == 'person' and not partner.parent_id: # if self.parent_id: # parent = self.parent_id # vals['industry_id'] = parent.industry_id.id # vals['company_type_id'] = parent.company_type_id.id # # res = super(ResPartner, self).write(vals) # return res @api.depends('company_type', 'parent_id', 'npwp', 'sppkp', 'nama_wajib_pajak','alamat_lengkap_text', 'industry_id', 'company_type_id') def _related_fields(self): for partner in self: if partner.company_type == 'person' and partner.parent_id: partner.customer_type = partner.parent_id.customer_type partner.npwp = partner.parent_id.npwp partner.sppkp = partner.parent_id.sppkp partner.nama_wajib_pajak = partner.parent_id.nama_wajib_pajak partner.alamat_lengkap_text = partner.parent_id.alamat_lengkap_text partner.industry_id = partner.parent_id.industry_id.id partner.company_type_id = partner.parent_id.company_type_id.id @api.constrains('property_payment_term_id') def updated_by_payment_term(self): for rec in self: rec.user_payment_terms_sales = self.env.user.id rec.date_payment_terms_sales = datetime.utcnow() @api.constrains('property_supplier_payment_term_id') def updated_by_payment_term(self): for rec in self: rec.user_payment_terms_purchase = self.env.user.id rec.date_payment_terms_purchase = datetime.utcnow() @api.onchange('site_id') def _onchange_site_id(self): for rec in self: if not rec.site_id: continue site = rec.site_id rec.street = site.street rec.street2 = site.street2 rec.city = site.city rec.state_id = site.state_id rec.country_id = site.country_id rec.zip = site.zip def get_main_parent(self): partner = self while partner.parent_id: partner = partner.parent_id return partner def _compute_main_parent_id(self): for partner in self: partner.main_parent_id = partner.get_main_parent() def get_child_ids(self): partner = self.env['res.partner'].search([('id', '=', self.id)], limit=1) partner_child_ids = [x['id'] for x in partner.child_ids] + [partner.id] if partner.parent_id: partner_child_ids += [x['id'] for x in partner.parent_id.child_ids] partner_child_ids += [partner.parent_id.id] return partner_child_ids def get_approve_partner_ids(self, type=False): parent = self.parent_id or self partners = self.search([('parent_id', '=', parent.id), ('web_role', '!=', False)]) if type == 'email_comma_sep': return ",".join([x.email for x in partners]) return partners @api.constrains('kota_id') def update_product_solr_flag(self): for partner in self: partner.city = partner.kota_id.name def unlink(self): if self._name == 'res.partner': raise UserError('Maaf anda tidak bisa delete contact') @api.onchange('customer_type') def _onchange_customer_type(self): if self.customer_type == 'nonpkp': self.npwp = '00.000.000.0-000.000'