from odoo import models, fields, api from odoo.exceptions import UserError, ValidationError from datetime import datetime from odoo.http import request class GroupPartner(models.Model): _name = 'group.partner' name = fields.Char(string='Name') class ResPartner(models.Model): _inherit = 'res.partner' property_account_payable_id = fields.Many2one('account.account', company_dependent=True, string="Account Payable", domain="[('internal_type', '=', 'payable'), ('deprecated', '=', False), ('company_id', '=', current_company_id)]", help="This account will be used instead of the default one as the payable account for the current partner", default=438) property_account_receivable_id = fields.Many2one('account.account', company_dependent=True, string="Account Receivable", domain="[('internal_type', '=', 'receivable'), ('deprecated', '=', False), ('company_id', '=', current_company_id)]", help="This account will be used instead of the default one as the receivable account for the current partner", default=395) 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_not_potential = fields.Boolean(string='Not 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') longtitude = fields.Char(string='Longtitude') latitude = fields.Char(string='Latitude') address_map = fields.Char(string='Address Map') company_type = fields.Selection(string='Company Type', selection=[('person', 'Individual'), ('company', 'Company')], compute='_compute_company_type', inverse='_write_company_type', tracking=3) warning_stage = fields.Float(string='Warning Amount', help="A warning message will appear once the " "selected customer is crossed warning " "amount. Set its value to 0.00 to" " disable this feature", tracking=3) blocking_stage = fields.Float(string='Blocking Amount', help="Cannot make sales once the selected " "customer is crossed blocking amount." "Set its value to 0.00 to disable " "this feature", tracking=3) # MERCHANT name_merchant = fields.Char(string='Name') pic_merchant = fields.Char(string='PIC Merchant', required=True) address_merchant = fields.Char(string='Alamat') state_merchant = fields.Many2one('res.country.state', string='State') city_merchant = fields.Many2one('vit.kota', string='Kota') district_merchant = fields.Many2one('vit.kecamatan', string='Kecamatan') subDistrict_merchant = fields.Many2one('vit.kelurahan', string='Kelurahan') zip_merchant = fields.Char(string='Kode Pos') bank_name_merchant = fields.Char(string='Nama Bank') rekening_name_merchant = fields.Char(string='Nama Rekening') account_number_merchant = fields.Char(string='Nomor Rekening Bank') email_company_merchant = fields.Char(string='Email Perusahaan') email_sales_merchant = fields.Char(string='Email Sales') email_finance_merchant = fields.Char(string='Email Finance') phone_merchant = fields.Char(string='No. Telepon Perusahaan') mobile_merchant = fields.Char(string='No. Handphone') harga_tayang = fields.Char(string='Harga Tayang (HET)') file_dokumenKtpDirut = fields.Binary(string="KTP Dirut/Direktur", tracking=True, track_visibility="onchange") file_kartuNama = fields.Binary(string="Kartu Nama", tracking=True, track_visibility="onchange") file_npwp = fields.Binary(string="NPWP", tracking=True, track_visibility="onchange") file_sppkp = fields.Binary(string="SPPKP", tracking=True, track_visibility="onchange") file_suratPernyataan = fields.Binary(string="Surat Pernyataan Nomor Rekening", tracking=True, track_visibility="onchange") file_fotoKantor = fields.Binary(string="Foto Gudang / Kantor Bagian Depan", tracking=True, track_visibility="onchange") file_dataProduk = fields.Binary(string="Data Produk (Item Name, Gambar, Deskripsi)", tracking=True,track_visibility="onchange") file_pricelist = fields.Binary(string="Pricelist", tracking=True, track_visibility="onchange") description = fields.Text(string='Deskripsi') @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) # Merchant vals['name_merchant'] = vals.get('name_merchant', self.name_merchant) vals['pic_merchant'] = vals.get('pic_merchant', self.pic_merchant) vals['address_merchant'] = vals.get('address_merchant', self.address_merchant) vals['state_merchant'] = vals.get('state_merchant', self.state_merchant) vals['city_merchant'] = vals.get('city_merchant', self.city_merchant) vals['district_merchant'] = vals.get('district_merchant', self.district_merchant) vals['subDistrict_merchant'] = vals.get('subDistrict_merchant', self.subDistrict_merchant) vals['zip_merchant'] = vals.get('zip_merchant', self.zip_merchant) vals['bank_name_merchant'] = vals.get('bank_name_merchant', self.bank_name_merchant) vals['rekening_name_merchant'] = vals.get('rekening_name_merchant', self.rekening_name_merchant) vals['account_number_merchant'] = vals.get('account_number_merchant', self.account_number_merchant) vals['email_company_merchant'] = vals.get('email_company_merchant', self.email_company_merchant) vals['email_sales_merchant'] = vals.get('email_sales_merchant', self.email_sales_merchant) vals['email_finance_merchant'] = vals.get('email_finance_merchant', self.email_finance_merchant) vals['phone_merchant'] = vals.get('phone_merchant', self.phone_merchant) vals['mobile_merchant'] = vals.get('mobile_merchant', self.mobile_merchant) vals['harga_tayang'] = vals.get('harga_tayang', self.harga_tayang) vals['file_dokumenKtpDirut'] = vals.get('file_dokumenKtpDirut', self.file_dokumenKtpDirut) vals['file_kartuNama'] = vals.get('file_kartuNama', self.file_kartuNama) vals['file_npwp'] = vals.get('file_npwp', self.file_npwp) vals['file_sppkp'] = vals.get('file_sppkp', self.file_sppkp) vals['file_suratPernyataan'] = vals.get('file_suratPernyataan', self.file_suratPernyataan) vals['file_fotoKantor'] = vals.get('file_fotoKantor', self.file_fotoKantor) vals['file_dataProduk'] = vals.get('file_dataProduk', self.file_dataProduk) vals['file_pricelist'] = vals.get('file_pricelist', self.file_pricelist) vals['description'] = vals.get('description', self.description) # 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'), # Merchant 'name_merchant': vals.get('name_merchant'), 'address_merchant': vals.get('address_merchant'), 'state_merchant': vals.get('state_merchant'), 'city_merchant': vals.get('city_merchant'), 'district_merchant': vals.get('district_merchant'), 'subDistrict_merchant': vals.get('subDistrict_merchant'), 'zip_merchant': vals.get('zip_merchant'), 'bank_name_merchant': vals.get('bank_name_merchant'), 'rekening_name_merchant': vals.get('rekening_name_merchant'), 'account_number_merchant': vals.get('account_number_merchant'), 'email_company_merchant': vals.get('email_company_merchant'), 'email_sales_merchant': vals.get('email_sales_merchant'), 'email_finance_merchant': vals.get('email_finance_merchant'), 'phone_merchant': vals.get('phone_merchant'), 'mobile_merchant': vals.get('mobile_merchant'), 'file_dokumenKtpDirut': vals.get('file_dokumenKtpDirut'), 'file_kartuNama': vals.get('file_kartuNama'), 'file_npwp': vals.get('file_npwp'), 'file_sppkp': vals.get('file_sppkp'), 'file_suratPernyataan': vals.get('file_suratPernyataan'), 'file_fotoKantor': vals.get('file_fotoKantor'), 'description': vals.get('description'), } # 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' def get_check_tempo_partner(self): self.ensure_one() partner = self.parent_id or self if not partner.property_payment_term_id or 'Tempo' not in partner.property_payment_term_id.name: return False else: return True