From 104046bcaedf97dd97e604c24ceacf3797974713 Mon Sep 17 00:00:00 2001 From: stephanchrst Date: Wed, 28 May 2025 14:27:01 +0700 Subject: error recursive method, must change to compute field --- indoteknik_custom/models/res_partner.py | 352 ++++++++++++++++---------------- 1 file changed, 176 insertions(+), 176 deletions(-) (limited to 'indoteknik_custom/models/res_partner.py') diff --git a/indoteknik_custom/models/res_partner.py b/indoteknik_custom/models/res_partner.py index 191a44c9..f1e362e6 100644 --- a/indoteknik_custom/models/res_partner.py +++ b/indoteknik_custom/models/res_partner.py @@ -235,182 +235,182 @@ class ResPartner(models.Model): raise ValidationError("Digit NPWP yang dimasukkan tidak sesuai. Pastikan NPWP memiliki 15 digit dengan format tertentu (99.999.999.9-999.999) atau 16 digit tanpa tanda hubung.") - 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) - - # Referensi - vals['supplier_ids'] = vals.get('supplier_ids', self.supplier_ids) - - # informasi perusahaan - vals['name_tempo'] = vals.get('name_tempo', self.name_tempo) - vals['industry_id_tempo'] = vals.get('industry_id_tempo', self.industry_id_tempo) - vals['street_tempo'] = vals.get('street_tempo', self.street_tempo) - vals['state_id_tempo'] = vals.get('state_id_tempo', self.state_id_tempo) - vals['city_id_tempo'] = vals.get('city_id_tempo', self.city_id_tempo) - vals['zip_tempo'] = vals.get('zip_tempo', self.zip_tempo) - vals['bank_name_tempo'] = vals.get('bank_name_tempo', self.bank_name_tempo) - vals['account_name_tempo'] = vals.get('account_name_tempo', self.account_name_tempo) - vals['account_number_tempo'] = vals.get('account_number_tempo', self.account_number_tempo) - vals['website_tempo'] = vals.get('website_tempo', self.website_tempo) - vals['portal'] = vals.get('portal', self.portal) - vals['estimasi_tempo'] = vals.get('estimasi_tempo', self.estimasi_tempo) - vals['tempo_duration'] = vals.get('tempo_duration', self.tempo_duration) - vals['tempo_limit'] = vals.get('tempo_limit', self.tempo_limit) - vals['category_produk_ids'] = vals.get('category_produk_ids', self.category_produk_ids) - - # Kontak Perusahaan - vals['direktur_name'] = vals.get('direktur_name', self.direktur_name) - vals['direktur_mobile'] = vals.get('direktur_mobile', self.direktur_mobile) - vals['direktur_email'] = vals.get('direktur_email', self.direktur_email) - vals['purchasing_name'] = vals.get('purchasing_name', self.purchasing_name) - vals['purchasing_mobile'] = vals.get('purchasing_mobile', self.purchasing_mobile) - vals['purchasing_email'] = vals.get('purchasing_email', self.purchasing_email) - vals['finance_name'] = vals.get('finance_name', self.finance_name) - vals['finance_mobile'] = vals.get('finance_mobile', self.finance_mobile) - vals['finance_email'] = vals.get('finance_email', self.finance_email) - - # Pengiriman - vals['pic_name'] = vals.get('pic_name', self.pic_name) - vals['pic_mobile'] = vals.get('pic_mobile', self.pic_mobile) - vals['street_pengiriman'] = vals.get('street_pengiriman', self.street_pengiriman) - vals['state_id_pengiriman'] = vals.get('state_id_pengiriman', self.state_id_pengiriman) - vals['city_id_pengiriman'] = vals.get('city_id_pengiriman', self.city_id_pengiriman) - vals['district_id_pengiriman'] = vals.get('district_id_pengiriman', self.district_id_pengiriman) - vals['subDistrict_id_pengiriman'] = vals.get('subDistrict_id_pengiriman', self.subDistrict_id_pengiriman) - vals['zip_pengiriman'] = vals.get('zip_pengiriman', self.zip_pengiriman) - vals['invoice_pic'] = vals.get('invoice_pic', self.invoice_pic) - vals['invoice_pic_mobile'] = vals.get('invoice_pic_mobile', self.invoice_pic_mobile) - vals['street_invoice'] = vals.get('street_invoice', self.street_invoice) - vals['state_id_invoice'] = vals.get('state_id_invoice', self.state_id_invoice) - vals['city_id_invoice'] = vals.get('city_id_invoice', self.city_id_invoice) - vals['district_id_invoice'] = vals.get('district_id_invoice', self.district_id_invoice) - vals['subDistrict_id_invoice'] = vals.get('subDistrict_id_invoice', self.subDistrict_id_invoice) - vals['zip_invoice'] = vals.get('zip_invoice', self.zip_invoice) - vals['tukar_invoice'] = vals.get('tukar_invoice', self.tukar_invoice) - vals['jadwal_bayar'] = vals.get('jadwal_bayar', self.jadwal_bayar) - vals['dokumen_prosedur'] = vals.get('dokumen_prosedur', self.dokumen_prosedur) - vals['dokumen_pengiriman'] = vals.get('dokumen_pengiriman', self.dokumen_pengiriman) - vals['dokumen_pengiriman_input'] = vals.get('dokumen_pengiriman_input', self.dokumen_pengiriman_input) - vals['dokumen_invoice'] = vals.get('dokumen_invoice', self.dokumen_invoice) - - # Dokumen - vals['dokumen_npwp'] = vals.get('dokumen_npwp', self.dokumen_npwp) - vals['dokumen_sppkp'] = vals.get('dokumen_sppkp', self.dokumen_sppkp) - vals['dokumen_nib'] = vals.get('dokumen_nib', self.dokumen_nib) - vals['dokumen_siup'] = vals.get('dokumen_siup', self.dokumen_siup) - vals['dokumen_tdp'] = vals.get('dokumen_tdp', self.dokumen_tdp) - vals['dokumen_skdp'] = vals.get('dokumen_skdp', self.dokumen_skdp) - vals['dokumen_skt'] = vals.get('dokumen_skt', self.dokumen_skt) - vals['dokumen_akta_perubahan'] = vals.get('dokumen_akta_perubahan', self.dokumen_akta_perubahan) - vals['dokumen_ktp_dirut'] = vals.get('dokumen_ktp_dirut', self.dokumen_ktp_dirut) - vals['dokumen_akta_pendirian'] = vals.get('dokumen_akta_pendirian', self.dokumen_akta_pendirian) - vals['dokumen_laporan_keuangan'] = vals.get('dokumen_laporan_keuangan', self.dokumen_laporan_keuangan) - vals['dokumen_foto_kantor'] = vals.get('dokumen_foto_kantor', self.dokumen_foto_kantor) - vals['dokumen_tempat_bekerja'] = vals.get('dokumen_tempat_bekerja', self.dokumen_tempat_bekerja) - - # 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'), - 'supplier_ids': vals.get('supplier_ids'), - 'name_tempo': vals.get('name_tempo'), - 'industry_id_tempo': vals.get('industry_id_tempo'), - 'street_tempo': vals.get('street_tempo'), - 'state_id_tempo': vals.get('state_id_tempo'), - 'city_id_tempo': vals.get('city_id_tempo'), - 'zip_tempo': vals.get('zip_tempo'), - 'bank_name_tempo': vals.get('bank_name_tempo'), - 'account_name_tempo': vals.get('account_name_tempo'), - 'account_number_tempo': vals.get('account_number_tempo'), - 'website_tempo': vals.get('website_tempo'), - 'portal': vals.get('portal'), - 'estimasi_tempo': vals.get('estimasi_tempo'), - 'tempo_duration': vals.get('tempo_duration'), - 'tempo_limit': vals.get('tempo_limit'), - 'category_produk_ids': vals.get('category_produk_ids'), - 'direktur_name': vals.get('direktur_name'), - 'direktur_mobile': vals.get('direktur_mobile'), - 'direktur_email': vals.get('direktur_email'), - 'purchasing_name': vals.get('purchasing_name'), - 'purchasing_mobile': vals.get('purchasing_mobile'), - 'purchasing_email': vals.get('purchasing_email'), - 'finance_name': vals.get('finance_name'), - 'finance_mobile': vals.get('finance_mobile'), - 'finance_email': vals.get('finance_email'), - 'pic_name': vals.get('pic_name'), - 'pic_mobile': vals.get('pic_mobile'), - 'street_pengiriman': vals.get('street_pengiriman'), - 'state_id_pengiriman': vals.get('state_id_pengiriman'), - 'city_id_pengiriman': vals.get('city_id_pengiriman'), - 'district_id_pengiriman': vals.get('district_id_pengiriman'), - 'subDistrict_id_pengiriman': vals.get('subDistrict_id_pengiriman'), - 'zip_pengiriman': vals.get('zip_pengiriman'), - 'invoice_pic': vals.get('invoice_pic'), - 'invoice_pic_mobile': vals.get('invoice_pic_mobile'), - 'street_invoice': vals.get('street_invoice'), - 'state_id_invoice': vals.get('state_id_invoice'), - 'city_id_invoice': vals.get('city_id_invoice'), - 'district_id_invoice': vals.get('district_id_invoice'), - 'subDistrict_id_invoice': vals.get('subDistrict_id_invoice'), - 'zip_invoice': vals.get('zip_invoice'), - 'tukar_invoice': vals.get('tukar_invoice'), - 'jadwal_bayar': vals.get('jadwal_bayar'), - 'dokumen_prosedur': vals.get('dokumen_prosedur'), - 'dokumen_pengiriman': vals.get('dokumen_pengiriman'), - 'dokumen_pengiriman_input': vals.get('dokumen_pengiriman_input'), - 'dokumen_invoice': vals.get('dokumen_invoice'), - 'dokumen_npwp': vals.get('dokumen_npwp'), - 'dokumen_sppkp': vals.get('dokumen_sppkp'), - 'dokumen_nib': vals.get('dokumen_nib'), - 'dokumen_siup': vals.get('dokumen_siup'), - 'dokumen_tdp': vals.get('dokumen_tdp'), - 'dokumen_skdp': vals.get('dokumen_skdp'), - 'dokumen_skt': vals.get('dokumen_skt'), - 'dokumen_akta_perubahan': vals.get('dokumen_akta_perubahan'), - 'dokumen_ktp_dirut': vals.get('dokumen_ktp_dirut'), - 'dokumen_akta_pendirian': vals.get('dokumen_akta_pendirian'), - 'dokumen_laporan_keuangan': vals.get('dokumen_laporan_keuangan'), - 'dokumen_foto_kantor': vals.get('dokumen_foto_kantor'), - 'dokumen_tempat_bekerja': vals.get('dokumen_tempat_bekerja'), - - # internal_notes - 'comment': vals.get('comment') - } - - # 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 + # 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) + # + # # Referensi + # vals['supplier_ids'] = vals.get('supplier_ids', self.supplier_ids) + # + # # informasi perusahaan + # vals['name_tempo'] = vals.get('name_tempo', self.name_tempo) + # vals['industry_id_tempo'] = vals.get('industry_id_tempo', self.industry_id_tempo) + # vals['street_tempo'] = vals.get('street_tempo', self.street_tempo) + # vals['state_id_tempo'] = vals.get('state_id_tempo', self.state_id_tempo) + # vals['city_id_tempo'] = vals.get('city_id_tempo', self.city_id_tempo) + # vals['zip_tempo'] = vals.get('zip_tempo', self.zip_tempo) + # vals['bank_name_tempo'] = vals.get('bank_name_tempo', self.bank_name_tempo) + # vals['account_name_tempo'] = vals.get('account_name_tempo', self.account_name_tempo) + # vals['account_number_tempo'] = vals.get('account_number_tempo', self.account_number_tempo) + # vals['website_tempo'] = vals.get('website_tempo', self.website_tempo) + # vals['portal'] = vals.get('portal', self.portal) + # vals['estimasi_tempo'] = vals.get('estimasi_tempo', self.estimasi_tempo) + # vals['tempo_duration'] = vals.get('tempo_duration', self.tempo_duration) + # vals['tempo_limit'] = vals.get('tempo_limit', self.tempo_limit) + # vals['category_produk_ids'] = vals.get('category_produk_ids', self.category_produk_ids) + # + # # Kontak Perusahaan + # vals['direktur_name'] = vals.get('direktur_name', self.direktur_name) + # vals['direktur_mobile'] = vals.get('direktur_mobile', self.direktur_mobile) + # vals['direktur_email'] = vals.get('direktur_email', self.direktur_email) + # vals['purchasing_name'] = vals.get('purchasing_name', self.purchasing_name) + # vals['purchasing_mobile'] = vals.get('purchasing_mobile', self.purchasing_mobile) + # vals['purchasing_email'] = vals.get('purchasing_email', self.purchasing_email) + # vals['finance_name'] = vals.get('finance_name', self.finance_name) + # vals['finance_mobile'] = vals.get('finance_mobile', self.finance_mobile) + # vals['finance_email'] = vals.get('finance_email', self.finance_email) + # + # # Pengiriman + # vals['pic_name'] = vals.get('pic_name', self.pic_name) + # vals['pic_mobile'] = vals.get('pic_mobile', self.pic_mobile) + # vals['street_pengiriman'] = vals.get('street_pengiriman', self.street_pengiriman) + # vals['state_id_pengiriman'] = vals.get('state_id_pengiriman', self.state_id_pengiriman) + # vals['city_id_pengiriman'] = vals.get('city_id_pengiriman', self.city_id_pengiriman) + # vals['district_id_pengiriman'] = vals.get('district_id_pengiriman', self.district_id_pengiriman) + # vals['subDistrict_id_pengiriman'] = vals.get('subDistrict_id_pengiriman', self.subDistrict_id_pengiriman) + # vals['zip_pengiriman'] = vals.get('zip_pengiriman', self.zip_pengiriman) + # vals['invoice_pic'] = vals.get('invoice_pic', self.invoice_pic) + # vals['invoice_pic_mobile'] = vals.get('invoice_pic_mobile', self.invoice_pic_mobile) + # vals['street_invoice'] = vals.get('street_invoice', self.street_invoice) + # vals['state_id_invoice'] = vals.get('state_id_invoice', self.state_id_invoice) + # vals['city_id_invoice'] = vals.get('city_id_invoice', self.city_id_invoice) + # vals['district_id_invoice'] = vals.get('district_id_invoice', self.district_id_invoice) + # vals['subDistrict_id_invoice'] = vals.get('subDistrict_id_invoice', self.subDistrict_id_invoice) + # vals['zip_invoice'] = vals.get('zip_invoice', self.zip_invoice) + # vals['tukar_invoice'] = vals.get('tukar_invoice', self.tukar_invoice) + # vals['jadwal_bayar'] = vals.get('jadwal_bayar', self.jadwal_bayar) + # vals['dokumen_prosedur'] = vals.get('dokumen_prosedur', self.dokumen_prosedur) + # vals['dokumen_pengiriman'] = vals.get('dokumen_pengiriman', self.dokumen_pengiriman) + # vals['dokumen_pengiriman_input'] = vals.get('dokumen_pengiriman_input', self.dokumen_pengiriman_input) + # vals['dokumen_invoice'] = vals.get('dokumen_invoice', self.dokumen_invoice) + # + # # Dokumen + # vals['dokumen_npwp'] = vals.get('dokumen_npwp', self.dokumen_npwp) + # vals['dokumen_sppkp'] = vals.get('dokumen_sppkp', self.dokumen_sppkp) + # vals['dokumen_nib'] = vals.get('dokumen_nib', self.dokumen_nib) + # vals['dokumen_siup'] = vals.get('dokumen_siup', self.dokumen_siup) + # vals['dokumen_tdp'] = vals.get('dokumen_tdp', self.dokumen_tdp) + # vals['dokumen_skdp'] = vals.get('dokumen_skdp', self.dokumen_skdp) + # vals['dokumen_skt'] = vals.get('dokumen_skt', self.dokumen_skt) + # vals['dokumen_akta_perubahan'] = vals.get('dokumen_akta_perubahan', self.dokumen_akta_perubahan) + # vals['dokumen_ktp_dirut'] = vals.get('dokumen_ktp_dirut', self.dokumen_ktp_dirut) + # vals['dokumen_akta_pendirian'] = vals.get('dokumen_akta_pendirian', self.dokumen_akta_pendirian) + # vals['dokumen_laporan_keuangan'] = vals.get('dokumen_laporan_keuangan', self.dokumen_laporan_keuangan) + # vals['dokumen_foto_kantor'] = vals.get('dokumen_foto_kantor', self.dokumen_foto_kantor) + # vals['dokumen_tempat_bekerja'] = vals.get('dokumen_tempat_bekerja', self.dokumen_tempat_bekerja) + # + # # 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'), + # 'supplier_ids': vals.get('supplier_ids'), + # 'name_tempo': vals.get('name_tempo'), + # 'industry_id_tempo': vals.get('industry_id_tempo'), + # 'street_tempo': vals.get('street_tempo'), + # 'state_id_tempo': vals.get('state_id_tempo'), + # 'city_id_tempo': vals.get('city_id_tempo'), + # 'zip_tempo': vals.get('zip_tempo'), + # 'bank_name_tempo': vals.get('bank_name_tempo'), + # 'account_name_tempo': vals.get('account_name_tempo'), + # 'account_number_tempo': vals.get('account_number_tempo'), + # 'website_tempo': vals.get('website_tempo'), + # 'portal': vals.get('portal'), + # 'estimasi_tempo': vals.get('estimasi_tempo'), + # 'tempo_duration': vals.get('tempo_duration'), + # 'tempo_limit': vals.get('tempo_limit'), + # 'category_produk_ids': vals.get('category_produk_ids'), + # 'direktur_name': vals.get('direktur_name'), + # 'direktur_mobile': vals.get('direktur_mobile'), + # 'direktur_email': vals.get('direktur_email'), + # 'purchasing_name': vals.get('purchasing_name'), + # 'purchasing_mobile': vals.get('purchasing_mobile'), + # 'purchasing_email': vals.get('purchasing_email'), + # 'finance_name': vals.get('finance_name'), + # 'finance_mobile': vals.get('finance_mobile'), + # 'finance_email': vals.get('finance_email'), + # 'pic_name': vals.get('pic_name'), + # 'pic_mobile': vals.get('pic_mobile'), + # 'street_pengiriman': vals.get('street_pengiriman'), + # 'state_id_pengiriman': vals.get('state_id_pengiriman'), + # 'city_id_pengiriman': vals.get('city_id_pengiriman'), + # 'district_id_pengiriman': vals.get('district_id_pengiriman'), + # 'subDistrict_id_pengiriman': vals.get('subDistrict_id_pengiriman'), + # 'zip_pengiriman': vals.get('zip_pengiriman'), + # 'invoice_pic': vals.get('invoice_pic'), + # 'invoice_pic_mobile': vals.get('invoice_pic_mobile'), + # 'street_invoice': vals.get('street_invoice'), + # 'state_id_invoice': vals.get('state_id_invoice'), + # 'city_id_invoice': vals.get('city_id_invoice'), + # 'district_id_invoice': vals.get('district_id_invoice'), + # 'subDistrict_id_invoice': vals.get('subDistrict_id_invoice'), + # 'zip_invoice': vals.get('zip_invoice'), + # 'tukar_invoice': vals.get('tukar_invoice'), + # 'jadwal_bayar': vals.get('jadwal_bayar'), + # 'dokumen_prosedur': vals.get('dokumen_prosedur'), + # 'dokumen_pengiriman': vals.get('dokumen_pengiriman'), + # 'dokumen_pengiriman_input': vals.get('dokumen_pengiriman_input'), + # 'dokumen_invoice': vals.get('dokumen_invoice'), + # 'dokumen_npwp': vals.get('dokumen_npwp'), + # 'dokumen_sppkp': vals.get('dokumen_sppkp'), + # 'dokumen_nib': vals.get('dokumen_nib'), + # 'dokumen_siup': vals.get('dokumen_siup'), + # 'dokumen_tdp': vals.get('dokumen_tdp'), + # 'dokumen_skdp': vals.get('dokumen_skdp'), + # 'dokumen_skt': vals.get('dokumen_skt'), + # 'dokumen_akta_perubahan': vals.get('dokumen_akta_perubahan'), + # 'dokumen_ktp_dirut': vals.get('dokumen_ktp_dirut'), + # 'dokumen_akta_pendirian': vals.get('dokumen_akta_pendirian'), + # 'dokumen_laporan_keuangan': vals.get('dokumen_laporan_keuangan'), + # 'dokumen_foto_kantor': vals.get('dokumen_foto_kantor'), + # 'dokumen_tempat_bekerja': vals.get('dokumen_tempat_bekerja'), + # + # # internal_notes + # 'comment': vals.get('comment') + # } + # + # # 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: -- cgit v1.2.3 From 5ca33915f1e3d052cfa989163d43a15dbc9ddec9 Mon Sep 17 00:00:00 2001 From: "Indoteknik ." Date: Tue, 10 Jun 2025 11:17:57 +0700 Subject: (andri) add button get koordinat pada contact --- indoteknik_custom/models/res_partner.py | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) (limited to 'indoteknik_custom/models/res_partner.py') diff --git a/indoteknik_custom/models/res_partner.py b/indoteknik_custom/models/res_partner.py index f1e362e6..0f1edac2 100644 --- a/indoteknik_custom/models/res_partner.py +++ b/indoteknik_custom/models/res_partner.py @@ -3,6 +3,7 @@ from odoo.exceptions import UserError, ValidationError from datetime import datetime from odoo.http import request import re +import requests class GroupPartner(models.Model): _name = 'group.partner' @@ -521,4 +522,28 @@ class ResPartner(models.Model): @api.onchange('name') def _onchange_name(self): if self.company_type == 'person': - self.nama_wajib_pajak = self.name \ No newline at end of file + self.nama_wajib_pajak = self.name + + def geocode_address(self): + for rec in self: + address = ', '.join(filter(None, [ + rec.street, + rec.city, + rec.state_id.name if rec.state_id else '', + rec.zip, + rec.country_id.name if rec.country_id else '' + ])) + + if not address: + continue + + api_key = self.env['ir.config_parameter'].sudo().get_param('google.maps.api_key') + url = f'https://maps.googleapis.com/maps/api/geocode/json?address={address}&key={api_key}' + response = requests.get(url) + + if response.ok: + result = response.json() + if result.get('results'): + location = result['results'][0]['geometry']['location'] + rec.latitude = location['lat'] + rec.longtitude = location['lng'] \ No newline at end of file -- cgit v1.2.3 From df0467f8e493840f3013bc58ca26fc6d98793c95 Mon Sep 17 00:00:00 2001 From: "Indoteknik ." Date: Tue, 10 Jun 2025 15:47:32 +0700 Subject: (andri) add openstreetmaps pada contact --- indoteknik_custom/models/res_partner.py | 26 ++++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) (limited to 'indoteknik_custom/models/res_partner.py') diff --git a/indoteknik_custom/models/res_partner.py b/indoteknik_custom/models/res_partner.py index 0f1edac2..fee0e73b 100644 --- a/indoteknik_custom/models/res_partner.py +++ b/indoteknik_custom/models/res_partner.py @@ -146,6 +146,7 @@ class ResPartner(models.Model): date_payment_terms_purchase = fields.Datetime(string='Date Update Payment Terms') longtitude = fields.Char(string='Longtitude') latitude = fields.Char(string='Latitude') + map_view = fields.Char(string='Map') address_map = fields.Char(string='Address Map') company_type = fields.Selection(string='Company Type', selection=[('person', 'Individual'), ('company', 'Company')], @@ -526,12 +527,24 @@ class ResPartner(models.Model): def geocode_address(self): for rec in self: + # Ambil nama dari relasi (Many2one) atau gunakan nilai default + kelurahan = rec.kelurahan_id.name if rec.kelurahan_id else '' + kecamatan = rec.kecamatan_id.name if rec.kecamatan_id else '' + kota = rec.kota_id.name if rec.kota_id else '' + zip_code = rec.zip or '' + state = rec.state_id.name if rec.state_id else '' + country = rec.country_id.name if rec.country_id else '' + street = rec.street or '' + + # Susun alamat lengkap sesuai urutan lokal address = ', '.join(filter(None, [ - rec.street, - rec.city, - rec.state_id.name if rec.state_id else '', - rec.zip, - rec.country_id.name if rec.country_id else '' + street, + kelurahan, + kecamatan, + kota, + zip_code, + state, + country, ])) if not address: @@ -539,6 +552,7 @@ class ResPartner(models.Model): api_key = self.env['ir.config_parameter'].sudo().get_param('google.maps.api_key') url = f'https://maps.googleapis.com/maps/api/geocode/json?address={address}&key={api_key}' + response = requests.get(url) if response.ok: @@ -546,4 +560,4 @@ class ResPartner(models.Model): if result.get('results'): location = result['results'][0]['geometry']['location'] rec.latitude = location['lat'] - rec.longtitude = location['lng'] \ No newline at end of file + rec.longtitude = location['lng'] -- cgit v1.2.3 From a6629db53b6080bd2217e426b434c2ecc72588ab Mon Sep 17 00:00:00 2001 From: "Indoteknik ." Date: Wed, 11 Jun 2025 09:14:42 +0700 Subject: (andri) add button INFORMATION DETAIL pada popup detail contact & addresses --- indoteknik_custom/models/res_partner.py | 10 ++++++++++ 1 file changed, 10 insertions(+) (limited to 'indoteknik_custom/models/res_partner.py') diff --git a/indoteknik_custom/models/res_partner.py b/indoteknik_custom/models/res_partner.py index fee0e73b..b8bdfe22 100644 --- a/indoteknik_custom/models/res_partner.py +++ b/indoteknik_custom/models/res_partner.py @@ -525,6 +525,16 @@ class ResPartner(models.Model): if self.company_type == 'person': self.nama_wajib_pajak = self.name + def action_open_full_form(self): + return { + 'type': 'ir.actions.act_window', + 'name': 'Partner', + 'res_model': 'res.partner', + 'res_id': self.id, + 'view_mode': 'form', + 'target': 'current', + } + def geocode_address(self): for rec in self: # Ambil nama dari relasi (Many2one) atau gunakan nilai default -- cgit v1.2.3 From 771cd3b9f5c0a6594b6e276bc47e3599d6c751e4 Mon Sep 17 00:00:00 2001 From: "Indoteknik ." Date: Wed, 11 Jun 2025 09:50:05 +0700 Subject: (andri) add validasi tidak bisa pinpoint ketika alamat yang diisikan belum lengkap --- indoteknik_custom/models/res_partner.py | 62 ++++++++++++++++++++------------- 1 file changed, 38 insertions(+), 24 deletions(-) (limited to 'indoteknik_custom/models/res_partner.py') diff --git a/indoteknik_custom/models/res_partner.py b/indoteknik_custom/models/res_partner.py index b8bdfe22..a15398c7 100644 --- a/indoteknik_custom/models/res_partner.py +++ b/indoteknik_custom/models/res_partner.py @@ -537,32 +537,42 @@ class ResPartner(models.Model): def geocode_address(self): for rec in self: - # Ambil nama dari relasi (Many2one) atau gunakan nilai default - kelurahan = rec.kelurahan_id.name if rec.kelurahan_id else '' - kecamatan = rec.kecamatan_id.name if rec.kecamatan_id else '' - kota = rec.kota_id.name if rec.kota_id else '' - zip_code = rec.zip or '' - state = rec.state_id.name if rec.state_id else '' - country = rec.country_id.name if rec.country_id else '' - street = rec.street or '' - - # Susun alamat lengkap sesuai urutan lokal - address = ', '.join(filter(None, [ - street, - kelurahan, - kecamatan, - kota, - zip_code, - state, - country, - ])) - - if not address: - continue - + # Daftar field penting + required_fields = { + 'Alamat Jalan (street)': rec.street, + 'Kelurahan': rec.kelurahan_id.name if rec.kelurahan_id else '', + 'Kecamatan': rec.kecamatan_id.name if rec.kecamatan_id else '', + 'Kota': rec.kota_id.name if rec.kota_id else '', + 'Kode Pos': rec.zip, + 'Provinsi': rec.state_id.name if rec.state_id else '', + 'Negara': rec.country_id.name if rec.country_id else '', + } + + # Cek jika ada yang kosong + missing = [label for label, val in required_fields.items() if not val] + if missing: + raise UserError( + "Alamat tidak lengkap. Mohon lengkapi field berikut:\n- " + "\n- ".join(missing) + ) + + # Susun alamat lengkap + address = ', '.join([ + required_fields['Alamat Jalan (street)'], + required_fields['Kelurahan'], + required_fields['Kecamatan'], + required_fields['Kota'], + required_fields['Kode Pos'], + required_fields['Provinsi'], + required_fields['Negara'], + ]) + + # Ambil API Key api_key = self.env['ir.config_parameter'].sudo().get_param('google.maps.api_key') - url = f'https://maps.googleapis.com/maps/api/geocode/json?address={address}&key={api_key}' + if not api_key: + raise UserError("API Key Google Maps belum dikonfigurasi. Silakan isi melalui Settings.") + # Request ke Google Maps + url = f'https://maps.googleapis.com/maps/api/geocode/json?address={address}&key={api_key}' response = requests.get(url) if response.ok: @@ -571,3 +581,7 @@ class ResPartner(models.Model): location = result['results'][0]['geometry']['location'] rec.latitude = location['lat'] rec.longtitude = location['lng'] + else: + raise UserError("Tidak ditemukan hasil geocode untuk alamat tersebut.") + else: + raise UserError("Permintaan ke Google Maps gagal. Periksa koneksi internet atau API Key.") -- cgit v1.2.3 From be7c601f44c3fab282dc91559a62a024d09e3f73 Mon Sep 17 00:00:00 2001 From: "Indoteknik ." Date: Thu, 12 Jun 2025 15:07:21 +0700 Subject: (andri) hapus validasi negara pada pinpoint & hapus autofokus page pinpoin --- indoteknik_custom/models/res_partner.py | 2 -- 1 file changed, 2 deletions(-) (limited to 'indoteknik_custom/models/res_partner.py') diff --git a/indoteknik_custom/models/res_partner.py b/indoteknik_custom/models/res_partner.py index a15398c7..eeb8b67d 100644 --- a/indoteknik_custom/models/res_partner.py +++ b/indoteknik_custom/models/res_partner.py @@ -545,7 +545,6 @@ class ResPartner(models.Model): 'Kota': rec.kota_id.name if rec.kota_id else '', 'Kode Pos': rec.zip, 'Provinsi': rec.state_id.name if rec.state_id else '', - 'Negara': rec.country_id.name if rec.country_id else '', } # Cek jika ada yang kosong @@ -563,7 +562,6 @@ class ResPartner(models.Model): required_fields['Kota'], required_fields['Kode Pos'], required_fields['Provinsi'], - required_fields['Negara'], ]) # Ambil API Key -- cgit v1.2.3 From a921017a829ebef8442740fac964260d98566e6a Mon Sep 17 00:00:00 2001 From: "Indoteknik ." Date: Thu, 12 Jun 2025 19:26:46 +0700 Subject: (andri) try gmaps sebagai pengganti openstreetmaps --- indoteknik_custom/models/res_partner.py | 77 +++++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) (limited to 'indoteknik_custom/models/res_partner.py') diff --git a/indoteknik_custom/models/res_partner.py b/indoteknik_custom/models/res_partner.py index eeb8b67d..82aa1134 100644 --- a/indoteknik_custom/models/res_partner.py +++ b/indoteknik_custom/models/res_partner.py @@ -4,6 +4,8 @@ from datetime import datetime from odoo.http import request import re import requests +import logging +_logger = logging.getLogger(__name__) class GroupPartner(models.Model): _name = 'group.partner' @@ -583,3 +585,78 @@ class ResPartner(models.Model): raise UserError("Tidak ditemukan hasil geocode untuk alamat tersebut.") else: raise UserError("Permintaan ke Google Maps gagal. Periksa koneksi internet atau API Key.") + + # def _update_address_from_coords(self): + # for rec in self: + # if rec.latitude and rec.longtitude: + # address = self.reverse_geocode(rec.latitude, rec.longtitude) + # if not address: + # continue + + # updates = { + # 'street': address.get('road') or '', + # 'zip': address.get('postcode') or '', + # 'city': address.get('city') or address.get('town') or address.get('village') or '', + # } + + # # Kelurahan (vit.kelurahan) + # if address.get('suburb'): + # kel = self.env['vit.kelurahan'].search([ + # ('name', 'ilike', address['suburb']) + # ], limit=1) + # if kel: + # updates['kelurahan_id'] = kel.id + + # # Kecamatan (vit.kecamatan) + # kec_nama = address.get('district') or address.get('village') + # if kec_nama: + # kec = self.env['vit.kecamatan'].search([ + # ('name', 'ilike', kec_nama) + # ], limit=1) + # if kec: + # updates['kecamatan_id'] = kec.id + + # # Kota (vit.kota) + # kota_nama = address.get('city') or address.get('town') + # if kota_nama: + # kota = self.env['vit.kota'].search([ + # ('name', 'ilike', kota_nama) + # ], limit=1) + # if kota: + # updates['kota_id'] = kota.id + + # # Provinsi (res.country.state) + # if address.get('state'): + # state = self.env['res.country.state'].search([ + # ('name', 'ilike', address['state']) + # ], limit=1) + # if state: + # updates['state_id'] = state.id + + # # Negara (res.country) + # if address.get('country_code'): + # country = self.env['res.country'].search([ + # ('code', '=', address['country_code'].upper()) + # ], limit=1) + # if country: + # updates['country_id'] = country.id + + # rec.write(updates) + + + + # def reverse_geocode(self, lat, lon): + # try: + # url = f'https://nominatim.openstreetmap.org/reverse?format=jsonv2&lat={lat}&lon={lon}' + # headers = { + # 'User-Agent': 'Odoo/1.0 (andrifebriyadiputra@gmail.com)', # WAJIB: ganti dengan email domain kamu + # } + # response = requests.get(url, headers=headers, timeout=5) + # if response.ok: + # data = response.json() + # return data.get('address', {}) + # else: + # _logger.warning("Reverse geocode failed with status %s: %s", response.status_code, response.text) + # except Exception as e: + # _logger.exception("Exception during reverse geocode: %s", e) + # return {} -- cgit v1.2.3 From 0e7fdb8ea85c53de2c8ad5fa8674c5fbc489e45a Mon Sep 17 00:00:00 2001 From: "Indoteknik ." Date: Fri, 13 Jun 2025 10:58:27 +0700 Subject: (andri) bisa ubah alamat via ubah pinpoin langsung --- indoteknik_custom/models/res_partner.py | 164 ++++++++++++++++++-------------- 1 file changed, 90 insertions(+), 74 deletions(-) (limited to 'indoteknik_custom/models/res_partner.py') diff --git a/indoteknik_custom/models/res_partner.py b/indoteknik_custom/models/res_partner.py index 82aa1134..6ef5698c 100644 --- a/indoteknik_custom/models/res_partner.py +++ b/indoteknik_custom/models/res_partner.py @@ -188,6 +188,10 @@ class ResPartner(models.Model): def write(self, vals): res = super(ResPartner, self).write(vals) + + for rec in self: + if 'latitude' in vals or 'longtitude' in vals: + rec._update_address_from_coords() # # # if 'property_payment_term_id' in vals: # # if not self.env.user.is_accounting and vals['property_payment_term_id'] != 26: @@ -199,6 +203,14 @@ class ResPartner(models.Model): # # raise UserError('You name it') # return res + + @api.model + def create(self, vals): + records = super().create(vals) + for rec in records: + if vals.get('latitude') and vals.get('longtitude'): + rec._update_address_from_coords() + return records @api.constrains('name') def _check_duplicate_name(self): @@ -579,84 +591,88 @@ class ResPartner(models.Model): result = response.json() if result.get('results'): location = result['results'][0]['geometry']['location'] + formatted_address = result['results'][0].get('formatted_address', '') + rec.latitude = location['lat'] rec.longtitude = location['lng'] + rec.address_map = formatted_address # ✅ Simpan alamat lengkap else: raise UserError("Tidak ditemukan hasil geocode untuk alamat tersebut.") else: raise UserError("Permintaan ke Google Maps gagal. Periksa koneksi internet atau API Key.") - # def _update_address_from_coords(self): - # for rec in self: - # if rec.latitude and rec.longtitude: - # address = self.reverse_geocode(rec.latitude, rec.longtitude) - # if not address: - # continue - - # updates = { - # 'street': address.get('road') or '', - # 'zip': address.get('postcode') or '', - # 'city': address.get('city') or address.get('town') or address.get('village') or '', - # } - - # # Kelurahan (vit.kelurahan) - # if address.get('suburb'): - # kel = self.env['vit.kelurahan'].search([ - # ('name', 'ilike', address['suburb']) - # ], limit=1) - # if kel: - # updates['kelurahan_id'] = kel.id - - # # Kecamatan (vit.kecamatan) - # kec_nama = address.get('district') or address.get('village') - # if kec_nama: - # kec = self.env['vit.kecamatan'].search([ - # ('name', 'ilike', kec_nama) - # ], limit=1) - # if kec: - # updates['kecamatan_id'] = kec.id - - # # Kota (vit.kota) - # kota_nama = address.get('city') or address.get('town') - # if kota_nama: - # kota = self.env['vit.kota'].search([ - # ('name', 'ilike', kota_nama) - # ], limit=1) - # if kota: - # updates['kota_id'] = kota.id - - # # Provinsi (res.country.state) - # if address.get('state'): - # state = self.env['res.country.state'].search([ - # ('name', 'ilike', address['state']) - # ], limit=1) - # if state: - # updates['state_id'] = state.id - - # # Negara (res.country) - # if address.get('country_code'): - # country = self.env['res.country'].search([ - # ('code', '=', address['country_code'].upper()) - # ], limit=1) - # if country: - # updates['country_id'] = country.id - - # rec.write(updates) - - - - # def reverse_geocode(self, lat, lon): - # try: - # url = f'https://nominatim.openstreetmap.org/reverse?format=jsonv2&lat={lat}&lon={lon}' - # headers = { - # 'User-Agent': 'Odoo/1.0 (andrifebriyadiputra@gmail.com)', # WAJIB: ganti dengan email domain kamu - # } - # response = requests.get(url, headers=headers, timeout=5) - # if response.ok: - # data = response.json() - # return data.get('address', {}) - # else: - # _logger.warning("Reverse geocode failed with status %s: %s", response.status_code, response.text) - # except Exception as e: - # _logger.exception("Exception during reverse geocode: %s", e) - # return {} + def _update_address_from_coords(self): + for rec in self: + if rec.latitude and rec.longtitude: + try: + components, formatted, parsed = rec._reverse_geocode(rec.latitude, rec.longtitude) + if not parsed: + continue + + updates = { + 'street': parsed.get('road') or '', + 'zip': parsed.get('postcode') or '', + 'address_map': formatted or '', + } + + state = self.env['res.country.state'].search([('name', 'ilike', parsed.get('state'))], limit=1) + if state: + updates['state_id'] = state.id + + kota = self.env['vit.kota'].search([('name', 'ilike', parsed.get('city'))], limit=1) + if kota: + updates['kota_id'] = kota.id + + kec = self.env['vit.kecamatan'].search([('name', 'ilike', parsed.get('district'))], limit=1) + if kec: + updates['kecamatan_id'] = kec.id + + kel = self.env['vit.kelurahan'].search([('name', 'ilike', parsed.get('suburb'))], limit=1) + if kel: + updates['kelurahan_id'] = kel.id + + rec.update(updates) + + except Exception as e: + raise UserError(f"Gagal update alamat dari koordinat: {str(e)}") + + + def _reverse_geocode(self, lat, lng): + api_key = self.env['ir.config_parameter'].sudo().get_param('google.maps.api_key') + if not api_key: + raise UserError("API Key Google Maps belum dikonfigurasi.") + + url = f'https://maps.googleapis.com/maps/api/geocode/json?latlng={lat},{lng}&key={api_key}' + response = requests.get(url) + if response.ok: + result = response.json() + if result.get('results'): + components = result['results'][0]['address_components'] + formatted = result['results'][0]['formatted_address'] + return components, formatted, self._parse_google_address(components) + return {}, '', {} + + def _parse_google_address(self, components): + def get(types): + for comp in components: + if types in comp['types']: + return comp['long_name'] + return '' + + street_number = get('street_number') + route = get('route') + neighborhood = get('neighborhood') # Bisa jadi nama RW + subpremise = get('subpremise') # Bisa jadi no kamar/ruko + + # Gabungkan informasi jalan + road = " ".join(filter(None, [route, street_number, subpremise, neighborhood])) + + return { + 'road': road.strip(), + 'postcode': get('postal_code'), + 'state': get('administrative_area_level_1'), + 'city': get('administrative_area_level_2') or get('locality'), + 'district': get('administrative_area_level_3'), + 'suburb': get('administrative_area_level_4'), + 'formatted': get('formatted_address'), + } -- cgit v1.2.3 From 60801084c9c93b3ec2d584a8a1de4af019b5fa80 Mon Sep 17 00:00:00 2001 From: "Indoteknik ." Date: Sat, 14 Jun 2025 11:49:33 +0700 Subject: (andri) fix peletakan search autocomplete & tambahan info mengenai address map --- indoteknik_custom/models/res_partner.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'indoteknik_custom/models/res_partner.py') diff --git a/indoteknik_custom/models/res_partner.py b/indoteknik_custom/models/res_partner.py index 6ef5698c..380761b4 100644 --- a/indoteknik_custom/models/res_partner.py +++ b/indoteknik_custom/models/res_partner.py @@ -149,7 +149,7 @@ class ResPartner(models.Model): longtitude = fields.Char(string='Longtitude') latitude = fields.Char(string='Latitude') map_view = fields.Char(string='Map') - address_map = fields.Char(string='Address Map') + address_map = fields.Char(string='Address Map', help='Ini adalah alamat yang didapatkan dari pin point pada peta') company_type = fields.Selection(string='Company Type', selection=[('person', 'Individual'), ('company', 'Company')], compute='_compute_company_type', inverse='_write_company_type', tracking=3) -- cgit v1.2.3 From b20b6ada9b13ea40732de14e7ce356f28df40a6b Mon Sep 17 00:00:00 2001 From: "Indoteknik ." Date: Mon, 16 Jun 2025 08:07:03 +0700 Subject: (andri) revisi pesan help pada address_map & nonaktifkan button get pin point location sebab GMAPS sudah bisa --- indoteknik_custom/models/res_partner.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'indoteknik_custom/models/res_partner.py') diff --git a/indoteknik_custom/models/res_partner.py b/indoteknik_custom/models/res_partner.py index 380761b4..986ff786 100644 --- a/indoteknik_custom/models/res_partner.py +++ b/indoteknik_custom/models/res_partner.py @@ -149,7 +149,7 @@ class ResPartner(models.Model): longtitude = fields.Char(string='Longtitude') latitude = fields.Char(string='Latitude') map_view = fields.Char(string='Map') - address_map = fields.Char(string='Address Map', help='Ini adalah alamat yang didapatkan dari pin point pada peta') + address_map = fields.Char(string='Address Map', help='Ini adalah alamat yang didapatkan dari pin point pada peta, bila hasil alamat tidak sesuai, silahkan ubah alamat pada field Alamat Lengkap', tracking=3) company_type = fields.Selection(string='Company Type', selection=[('person', 'Individual'), ('company', 'Company')], compute='_compute_company_type', inverse='_write_company_type', tracking=3) -- cgit v1.2.3 From 1d26fc49f0e01cb972a8dbb60db600222389423d Mon Sep 17 00:00:00 2001 From: "Indoteknik ." Date: Mon, 16 Jun 2025 08:11:53 +0700 Subject: (andri) rev help address map --- indoteknik_custom/models/res_partner.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'indoteknik_custom/models/res_partner.py') diff --git a/indoteknik_custom/models/res_partner.py b/indoteknik_custom/models/res_partner.py index 986ff786..9668d79b 100644 --- a/indoteknik_custom/models/res_partner.py +++ b/indoteknik_custom/models/res_partner.py @@ -149,7 +149,7 @@ class ResPartner(models.Model): longtitude = fields.Char(string='Longtitude') latitude = fields.Char(string='Latitude') map_view = fields.Char(string='Map') - address_map = fields.Char(string='Address Map', help='Ini adalah alamat yang didapatkan dari pin point pada peta, bila hasil alamat tidak sesuai, silahkan ubah alamat pada field Alamat Lengkap', tracking=3) + address_map = fields.Char(string='Address Map', help='Alamat ini diisi otomatis berdasarkan koordinat pin pada peta. Silakan koreksi jika terdapat ketidaksesuaian', tracking=3) company_type = fields.Selection(string='Company Type', selection=[('person', 'Individual'), ('company', 'Company')], compute='_compute_company_type', inverse='_write_company_type', tracking=3) -- cgit v1.2.3 From df02e9c6f0db21b43ae25d77c7072a5dd15f9848 Mon Sep 17 00:00:00 2001 From: "Indoteknik ." Date: Mon, 16 Jun 2025 08:12:35 +0700 Subject: (andri) rev help address map --- indoteknik_custom/models/res_partner.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'indoteknik_custom/models/res_partner.py') diff --git a/indoteknik_custom/models/res_partner.py b/indoteknik_custom/models/res_partner.py index 9668d79b..a8ce95d1 100644 --- a/indoteknik_custom/models/res_partner.py +++ b/indoteknik_custom/models/res_partner.py @@ -149,7 +149,7 @@ class ResPartner(models.Model): longtitude = fields.Char(string='Longtitude') latitude = fields.Char(string='Latitude') map_view = fields.Char(string='Map') - address_map = fields.Char(string='Address Map', help='Alamat ini diisi otomatis berdasarkan koordinat pin pada peta. Silakan koreksi jika terdapat ketidaksesuaian', tracking=3) + address_map = fields.Char(string='Address Map', help='Alamat ini diisi otomatis berdasarkan koordinat pin pada peta. Silakan koreksi dan ubah jika terdapat ketidaksesuaian', tracking=3) company_type = fields.Selection(string='Company Type', selection=[('person', 'Individual'), ('company', 'Company')], compute='_compute_company_type', inverse='_write_company_type', tracking=3) -- cgit v1.2.3 From 2ff882e9f591a25b6b9f5adbd4dd90e7402017a9 Mon Sep 17 00:00:00 2001 From: "Indoteknik ." Date: Mon, 16 Jun 2025 08:48:39 +0700 Subject: (andri) comment map view --- indoteknik_custom/models/res_partner.py | 254 ++++++++++++++++---------------- 1 file changed, 127 insertions(+), 127 deletions(-) (limited to 'indoteknik_custom/models/res_partner.py') diff --git a/indoteknik_custom/models/res_partner.py b/indoteknik_custom/models/res_partner.py index a8ce95d1..1786efa3 100644 --- a/indoteknik_custom/models/res_partner.py +++ b/indoteknik_custom/models/res_partner.py @@ -148,7 +148,7 @@ class ResPartner(models.Model): date_payment_terms_purchase = fields.Datetime(string='Date Update Payment Terms') longtitude = fields.Char(string='Longtitude') latitude = fields.Char(string='Latitude') - map_view = fields.Char(string='Map') + # map_view = fields.Char(string='Map') address_map = fields.Char(string='Address Map', help='Alamat ini diisi otomatis berdasarkan koordinat pin pada peta. Silakan koreksi dan ubah jika terdapat ketidaksesuaian', tracking=3) company_type = fields.Selection(string='Company Type', selection=[('person', 'Individual'), ('company', 'Company')], @@ -549,130 +549,130 @@ class ResPartner(models.Model): 'target': 'current', } - def geocode_address(self): - for rec in self: - # Daftar field penting - required_fields = { - 'Alamat Jalan (street)': rec.street, - 'Kelurahan': rec.kelurahan_id.name if rec.kelurahan_id else '', - 'Kecamatan': rec.kecamatan_id.name if rec.kecamatan_id else '', - 'Kota': rec.kota_id.name if rec.kota_id else '', - 'Kode Pos': rec.zip, - 'Provinsi': rec.state_id.name if rec.state_id else '', - } - - # Cek jika ada yang kosong - missing = [label for label, val in required_fields.items() if not val] - if missing: - raise UserError( - "Alamat tidak lengkap. Mohon lengkapi field berikut:\n- " + "\n- ".join(missing) - ) - - # Susun alamat lengkap - address = ', '.join([ - required_fields['Alamat Jalan (street)'], - required_fields['Kelurahan'], - required_fields['Kecamatan'], - required_fields['Kota'], - required_fields['Kode Pos'], - required_fields['Provinsi'], - ]) - - # Ambil API Key - api_key = self.env['ir.config_parameter'].sudo().get_param('google.maps.api_key') - if not api_key: - raise UserError("API Key Google Maps belum dikonfigurasi. Silakan isi melalui Settings.") - - # Request ke Google Maps - url = f'https://maps.googleapis.com/maps/api/geocode/json?address={address}&key={api_key}' - response = requests.get(url) - - if response.ok: - result = response.json() - if result.get('results'): - location = result['results'][0]['geometry']['location'] - formatted_address = result['results'][0].get('formatted_address', '') - - rec.latitude = location['lat'] - rec.longtitude = location['lng'] - rec.address_map = formatted_address # ✅ Simpan alamat lengkap - else: - raise UserError("Tidak ditemukan hasil geocode untuk alamat tersebut.") - else: - raise UserError("Permintaan ke Google Maps gagal. Periksa koneksi internet atau API Key.") - - def _update_address_from_coords(self): - for rec in self: - if rec.latitude and rec.longtitude: - try: - components, formatted, parsed = rec._reverse_geocode(rec.latitude, rec.longtitude) - if not parsed: - continue - - updates = { - 'street': parsed.get('road') or '', - 'zip': parsed.get('postcode') or '', - 'address_map': formatted or '', - } - - state = self.env['res.country.state'].search([('name', 'ilike', parsed.get('state'))], limit=1) - if state: - updates['state_id'] = state.id - - kota = self.env['vit.kota'].search([('name', 'ilike', parsed.get('city'))], limit=1) - if kota: - updates['kota_id'] = kota.id - - kec = self.env['vit.kecamatan'].search([('name', 'ilike', parsed.get('district'))], limit=1) - if kec: - updates['kecamatan_id'] = kec.id - - kel = self.env['vit.kelurahan'].search([('name', 'ilike', parsed.get('suburb'))], limit=1) - if kel: - updates['kelurahan_id'] = kel.id - - rec.update(updates) - - except Exception as e: - raise UserError(f"Gagal update alamat dari koordinat: {str(e)}") - - - def _reverse_geocode(self, lat, lng): - api_key = self.env['ir.config_parameter'].sudo().get_param('google.maps.api_key') - if not api_key: - raise UserError("API Key Google Maps belum dikonfigurasi.") - - url = f'https://maps.googleapis.com/maps/api/geocode/json?latlng={lat},{lng}&key={api_key}' - response = requests.get(url) - if response.ok: - result = response.json() - if result.get('results'): - components = result['results'][0]['address_components'] - formatted = result['results'][0]['formatted_address'] - return components, formatted, self._parse_google_address(components) - return {}, '', {} - - def _parse_google_address(self, components): - def get(types): - for comp in components: - if types in comp['types']: - return comp['long_name'] - return '' - - street_number = get('street_number') - route = get('route') - neighborhood = get('neighborhood') # Bisa jadi nama RW - subpremise = get('subpremise') # Bisa jadi no kamar/ruko - - # Gabungkan informasi jalan - road = " ".join(filter(None, [route, street_number, subpremise, neighborhood])) + # def geocode_address(self): + # for rec in self: + # # Daftar field penting + # required_fields = { + # 'Alamat Jalan (street)': rec.street, + # 'Kelurahan': rec.kelurahan_id.name if rec.kelurahan_id else '', + # 'Kecamatan': rec.kecamatan_id.name if rec.kecamatan_id else '', + # 'Kota': rec.kota_id.name if rec.kota_id else '', + # 'Kode Pos': rec.zip, + # 'Provinsi': rec.state_id.name if rec.state_id else '', + # } - return { - 'road': road.strip(), - 'postcode': get('postal_code'), - 'state': get('administrative_area_level_1'), - 'city': get('administrative_area_level_2') or get('locality'), - 'district': get('administrative_area_level_3'), - 'suburb': get('administrative_area_level_4'), - 'formatted': get('formatted_address'), - } + # # Cek jika ada yang kosong + # missing = [label for label, val in required_fields.items() if not val] + # if missing: + # raise UserError( + # "Alamat tidak lengkap. Mohon lengkapi field berikut:\n- " + "\n- ".join(missing) + # ) + + # # Susun alamat lengkap + # address = ', '.join([ + # required_fields['Alamat Jalan (street)'], + # required_fields['Kelurahan'], + # required_fields['Kecamatan'], + # required_fields['Kota'], + # required_fields['Kode Pos'], + # required_fields['Provinsi'], + # ]) + + # # Ambil API Key + # api_key = self.env['ir.config_parameter'].sudo().get_param('google.maps.api_key') + # if not api_key: + # raise UserError("API Key Google Maps belum dikonfigurasi. Silakan isi melalui Settings.") + + # # Request ke Google Maps + # url = f'https://maps.googleapis.com/maps/api/geocode/json?address={address}&key={api_key}' + # response = requests.get(url) + + # if response.ok: + # result = response.json() + # if result.get('results'): + # location = result['results'][0]['geometry']['location'] + # formatted_address = result['results'][0].get('formatted_address', '') + + # rec.latitude = location['lat'] + # rec.longtitude = location['lng'] + # rec.address_map = formatted_address # ✅ Simpan alamat lengkap + # else: + # raise UserError("Tidak ditemukan hasil geocode untuk alamat tersebut.") + # else: + # raise UserError("Permintaan ke Google Maps gagal. Periksa koneksi internet atau API Key.") + + # def _update_address_from_coords(self): + # for rec in self: + # if rec.latitude and rec.longtitude: + # try: + # components, formatted, parsed = rec._reverse_geocode(rec.latitude, rec.longtitude) + # if not parsed: + # continue + + # updates = { + # 'street': parsed.get('road') or '', + # 'zip': parsed.get('postcode') or '', + # 'address_map': formatted or '', + # } + + # state = self.env['res.country.state'].search([('name', 'ilike', parsed.get('state'))], limit=1) + # if state: + # updates['state_id'] = state.id + + # kota = self.env['vit.kota'].search([('name', 'ilike', parsed.get('city'))], limit=1) + # if kota: + # updates['kota_id'] = kota.id + + # kec = self.env['vit.kecamatan'].search([('name', 'ilike', parsed.get('district'))], limit=1) + # if kec: + # updates['kecamatan_id'] = kec.id + + # kel = self.env['vit.kelurahan'].search([('name', 'ilike', parsed.get('suburb'))], limit=1) + # if kel: + # updates['kelurahan_id'] = kel.id + + # rec.update(updates) + + # except Exception as e: + # raise UserError(f"Gagal update alamat dari koordinat: {str(e)}") + + + # def _reverse_geocode(self, lat, lng): + # api_key = self.env['ir.config_parameter'].sudo().get_param('google.maps.api_key') + # if not api_key: + # raise UserError("API Key Google Maps belum dikonfigurasi.") + + # url = f'https://maps.googleapis.com/maps/api/geocode/json?latlng={lat},{lng}&key={api_key}' + # response = requests.get(url) + # if response.ok: + # result = response.json() + # if result.get('results'): + # components = result['results'][0]['address_components'] + # formatted = result['results'][0]['formatted_address'] + # return components, formatted, self._parse_google_address(components) + # return {}, '', {} + + # def _parse_google_address(self, components): + # def get(types): + # for comp in components: + # if types in comp['types']: + # return comp['long_name'] + # return '' + + # street_number = get('street_number') + # route = get('route') + # neighborhood = get('neighborhood') # Bisa jadi nama RW + # subpremise = get('subpremise') # Bisa jadi no kamar/ruko + + # # Gabungkan informasi jalan + # road = " ".join(filter(None, [route, street_number, subpremise, neighborhood])) + + # return { + # 'road': road.strip(), + # 'postcode': get('postal_code'), + # 'state': get('administrative_area_level_1'), + # 'city': get('administrative_area_level_2') or get('locality'), + # 'district': get('administrative_area_level_3'), + # 'suburb': get('administrative_area_level_4'), + # 'formatted': get('formatted_address'), + # } -- cgit v1.2.3 From 6e2419c226eb74ea5c14d21f441d570829a20021 Mon Sep 17 00:00:00 2001 From: "Indoteknik ." Date: Mon, 16 Jun 2025 08:54:56 +0700 Subject: (andri) on map view --- indoteknik_custom/models/res_partner.py | 254 ++++++++++++++++---------------- 1 file changed, 127 insertions(+), 127 deletions(-) (limited to 'indoteknik_custom/models/res_partner.py') diff --git a/indoteknik_custom/models/res_partner.py b/indoteknik_custom/models/res_partner.py index 1786efa3..a8ce95d1 100644 --- a/indoteknik_custom/models/res_partner.py +++ b/indoteknik_custom/models/res_partner.py @@ -148,7 +148,7 @@ class ResPartner(models.Model): date_payment_terms_purchase = fields.Datetime(string='Date Update Payment Terms') longtitude = fields.Char(string='Longtitude') latitude = fields.Char(string='Latitude') - # map_view = fields.Char(string='Map') + map_view = fields.Char(string='Map') address_map = fields.Char(string='Address Map', help='Alamat ini diisi otomatis berdasarkan koordinat pin pada peta. Silakan koreksi dan ubah jika terdapat ketidaksesuaian', tracking=3) company_type = fields.Selection(string='Company Type', selection=[('person', 'Individual'), ('company', 'Company')], @@ -549,130 +549,130 @@ class ResPartner(models.Model): 'target': 'current', } - # def geocode_address(self): - # for rec in self: - # # Daftar field penting - # required_fields = { - # 'Alamat Jalan (street)': rec.street, - # 'Kelurahan': rec.kelurahan_id.name if rec.kelurahan_id else '', - # 'Kecamatan': rec.kecamatan_id.name if rec.kecamatan_id else '', - # 'Kota': rec.kota_id.name if rec.kota_id else '', - # 'Kode Pos': rec.zip, - # 'Provinsi': rec.state_id.name if rec.state_id else '', - # } + def geocode_address(self): + for rec in self: + # Daftar field penting + required_fields = { + 'Alamat Jalan (street)': rec.street, + 'Kelurahan': rec.kelurahan_id.name if rec.kelurahan_id else '', + 'Kecamatan': rec.kecamatan_id.name if rec.kecamatan_id else '', + 'Kota': rec.kota_id.name if rec.kota_id else '', + 'Kode Pos': rec.zip, + 'Provinsi': rec.state_id.name if rec.state_id else '', + } + + # Cek jika ada yang kosong + missing = [label for label, val in required_fields.items() if not val] + if missing: + raise UserError( + "Alamat tidak lengkap. Mohon lengkapi field berikut:\n- " + "\n- ".join(missing) + ) + + # Susun alamat lengkap + address = ', '.join([ + required_fields['Alamat Jalan (street)'], + required_fields['Kelurahan'], + required_fields['Kecamatan'], + required_fields['Kota'], + required_fields['Kode Pos'], + required_fields['Provinsi'], + ]) + + # Ambil API Key + api_key = self.env['ir.config_parameter'].sudo().get_param('google.maps.api_key') + if not api_key: + raise UserError("API Key Google Maps belum dikonfigurasi. Silakan isi melalui Settings.") + + # Request ke Google Maps + url = f'https://maps.googleapis.com/maps/api/geocode/json?address={address}&key={api_key}' + response = requests.get(url) + + if response.ok: + result = response.json() + if result.get('results'): + location = result['results'][0]['geometry']['location'] + formatted_address = result['results'][0].get('formatted_address', '') + + rec.latitude = location['lat'] + rec.longtitude = location['lng'] + rec.address_map = formatted_address # ✅ Simpan alamat lengkap + else: + raise UserError("Tidak ditemukan hasil geocode untuk alamat tersebut.") + else: + raise UserError("Permintaan ke Google Maps gagal. Periksa koneksi internet atau API Key.") - # # Cek jika ada yang kosong - # missing = [label for label, val in required_fields.items() if not val] - # if missing: - # raise UserError( - # "Alamat tidak lengkap. Mohon lengkapi field berikut:\n- " + "\n- ".join(missing) - # ) - - # # Susun alamat lengkap - # address = ', '.join([ - # required_fields['Alamat Jalan (street)'], - # required_fields['Kelurahan'], - # required_fields['Kecamatan'], - # required_fields['Kota'], - # required_fields['Kode Pos'], - # required_fields['Provinsi'], - # ]) - - # # Ambil API Key - # api_key = self.env['ir.config_parameter'].sudo().get_param('google.maps.api_key') - # if not api_key: - # raise UserError("API Key Google Maps belum dikonfigurasi. Silakan isi melalui Settings.") - - # # Request ke Google Maps - # url = f'https://maps.googleapis.com/maps/api/geocode/json?address={address}&key={api_key}' - # response = requests.get(url) - - # if response.ok: - # result = response.json() - # if result.get('results'): - # location = result['results'][0]['geometry']['location'] - # formatted_address = result['results'][0].get('formatted_address', '') - - # rec.latitude = location['lat'] - # rec.longtitude = location['lng'] - # rec.address_map = formatted_address # ✅ Simpan alamat lengkap - # else: - # raise UserError("Tidak ditemukan hasil geocode untuk alamat tersebut.") - # else: - # raise UserError("Permintaan ke Google Maps gagal. Periksa koneksi internet atau API Key.") - - # def _update_address_from_coords(self): - # for rec in self: - # if rec.latitude and rec.longtitude: - # try: - # components, formatted, parsed = rec._reverse_geocode(rec.latitude, rec.longtitude) - # if not parsed: - # continue - - # updates = { - # 'street': parsed.get('road') or '', - # 'zip': parsed.get('postcode') or '', - # 'address_map': formatted or '', - # } - - # state = self.env['res.country.state'].search([('name', 'ilike', parsed.get('state'))], limit=1) - # if state: - # updates['state_id'] = state.id - - # kota = self.env['vit.kota'].search([('name', 'ilike', parsed.get('city'))], limit=1) - # if kota: - # updates['kota_id'] = kota.id - - # kec = self.env['vit.kecamatan'].search([('name', 'ilike', parsed.get('district'))], limit=1) - # if kec: - # updates['kecamatan_id'] = kec.id - - # kel = self.env['vit.kelurahan'].search([('name', 'ilike', parsed.get('suburb'))], limit=1) - # if kel: - # updates['kelurahan_id'] = kel.id - - # rec.update(updates) - - # except Exception as e: - # raise UserError(f"Gagal update alamat dari koordinat: {str(e)}") - - - # def _reverse_geocode(self, lat, lng): - # api_key = self.env['ir.config_parameter'].sudo().get_param('google.maps.api_key') - # if not api_key: - # raise UserError("API Key Google Maps belum dikonfigurasi.") - - # url = f'https://maps.googleapis.com/maps/api/geocode/json?latlng={lat},{lng}&key={api_key}' - # response = requests.get(url) - # if response.ok: - # result = response.json() - # if result.get('results'): - # components = result['results'][0]['address_components'] - # formatted = result['results'][0]['formatted_address'] - # return components, formatted, self._parse_google_address(components) - # return {}, '', {} - - # def _parse_google_address(self, components): - # def get(types): - # for comp in components: - # if types in comp['types']: - # return comp['long_name'] - # return '' - - # street_number = get('street_number') - # route = get('route') - # neighborhood = get('neighborhood') # Bisa jadi nama RW - # subpremise = get('subpremise') # Bisa jadi no kamar/ruko - - # # Gabungkan informasi jalan - # road = " ".join(filter(None, [route, street_number, subpremise, neighborhood])) - - # return { - # 'road': road.strip(), - # 'postcode': get('postal_code'), - # 'state': get('administrative_area_level_1'), - # 'city': get('administrative_area_level_2') or get('locality'), - # 'district': get('administrative_area_level_3'), - # 'suburb': get('administrative_area_level_4'), - # 'formatted': get('formatted_address'), - # } + def _update_address_from_coords(self): + for rec in self: + if rec.latitude and rec.longtitude: + try: + components, formatted, parsed = rec._reverse_geocode(rec.latitude, rec.longtitude) + if not parsed: + continue + + updates = { + 'street': parsed.get('road') or '', + 'zip': parsed.get('postcode') or '', + 'address_map': formatted or '', + } + + state = self.env['res.country.state'].search([('name', 'ilike', parsed.get('state'))], limit=1) + if state: + updates['state_id'] = state.id + + kota = self.env['vit.kota'].search([('name', 'ilike', parsed.get('city'))], limit=1) + if kota: + updates['kota_id'] = kota.id + + kec = self.env['vit.kecamatan'].search([('name', 'ilike', parsed.get('district'))], limit=1) + if kec: + updates['kecamatan_id'] = kec.id + + kel = self.env['vit.kelurahan'].search([('name', 'ilike', parsed.get('suburb'))], limit=1) + if kel: + updates['kelurahan_id'] = kel.id + + rec.update(updates) + + except Exception as e: + raise UserError(f"Gagal update alamat dari koordinat: {str(e)}") + + + def _reverse_geocode(self, lat, lng): + api_key = self.env['ir.config_parameter'].sudo().get_param('google.maps.api_key') + if not api_key: + raise UserError("API Key Google Maps belum dikonfigurasi.") + + url = f'https://maps.googleapis.com/maps/api/geocode/json?latlng={lat},{lng}&key={api_key}' + response = requests.get(url) + if response.ok: + result = response.json() + if result.get('results'): + components = result['results'][0]['address_components'] + formatted = result['results'][0]['formatted_address'] + return components, formatted, self._parse_google_address(components) + return {}, '', {} + + def _parse_google_address(self, components): + def get(types): + for comp in components: + if types in comp['types']: + return comp['long_name'] + return '' + + street_number = get('street_number') + route = get('route') + neighborhood = get('neighborhood') # Bisa jadi nama RW + subpremise = get('subpremise') # Bisa jadi no kamar/ruko + + # Gabungkan informasi jalan + road = " ".join(filter(None, [route, street_number, subpremise, neighborhood])) + + return { + 'road': road.strip(), + 'postcode': get('postal_code'), + 'state': get('administrative_area_level_1'), + 'city': get('administrative_area_level_2') or get('locality'), + 'district': get('administrative_area_level_3'), + 'suburb': get('administrative_area_level_4'), + 'formatted': get('formatted_address'), + } -- cgit v1.2.3 From a80565682063e718fc55c90e4243b9d5b2432285 Mon Sep 17 00:00:00 2001 From: "Indoteknik ." Date: Tue, 17 Jun 2025 08:47:53 +0700 Subject: (andri) fix load gmaps pada view & edit --- indoteknik_custom/models/res_partner.py | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) (limited to 'indoteknik_custom/models/res_partner.py') diff --git a/indoteknik_custom/models/res_partner.py b/indoteknik_custom/models/res_partner.py index a8ce95d1..9986b9c0 100644 --- a/indoteknik_custom/models/res_partner.py +++ b/indoteknik_custom/models/res_partner.py @@ -579,9 +579,10 @@ class ResPartner(models.Model): ]) # Ambil API Key - api_key = self.env['ir.config_parameter'].sudo().get_param('google.maps.api_key') - if not api_key: - raise UserError("API Key Google Maps belum dikonfigurasi. Silakan isi melalui Settings.") + api_key = "AIzaSyB7bG9aSNAJnSrj0Z7f1abFsqKVoiJfsPE" + # api_key = self.env['ir.config_parameter'].sudo().get_param('google.maps.api_key') + # if not api_key: + # raise UserError("API Key Google Maps belum dikonfigurasi. Silakan isi melalui Settings.") # Request ke Google Maps url = f'https://maps.googleapis.com/maps/api/geocode/json?address={address}&key={api_key}' @@ -638,9 +639,10 @@ class ResPartner(models.Model): def _reverse_geocode(self, lat, lng): - api_key = self.env['ir.config_parameter'].sudo().get_param('google.maps.api_key') - if not api_key: - raise UserError("API Key Google Maps belum dikonfigurasi.") + api_key = "AIzaSyB7bG9aSNAJnSrj0Z7f1abFsqKVoiJfsPE" + # api_key = self.env['ir.config_parameter'].sudo().get_param('google.maps.api_key') + # if not api_key: + # raise UserError("API Key Google Maps belum dikonfigurasi.") url = f'https://maps.googleapis.com/maps/api/geocode/json?latlng={lat},{lng}&key={api_key}' response = requests.get(url) -- cgit v1.2.3 From e1e281f6f43b9ba22443845484422cd0c5b1fb30 Mon Sep 17 00:00:00 2001 From: "Indoteknik ." Date: Tue, 24 Jun 2025 12:08:57 +0700 Subject: (andri) penambahan field pada respartner --- indoteknik_custom/models/res_partner.py | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) (limited to 'indoteknik_custom/models/res_partner.py') diff --git a/indoteknik_custom/models/res_partner.py b/indoteknik_custom/models/res_partner.py index 9986b9c0..98aac7eb 100644 --- a/indoteknik_custom/models/res_partner.py +++ b/indoteknik_custom/models/res_partner.py @@ -165,6 +165,23 @@ class ResPartner(models.Model): "this feature", tracking=3) telegram_id = fields.Char(string="Telegram") + avg_aging= fields.Float(string='Average Aging') + payment_difficulty = fields.Selection([('bermasalah', 'Bermasalah'),('sulit', 'Sulit'),('agak_sulit', 'Agak Sulit'),('normal', 'Normal')], string='Payment Difficulty', tracking=3, compute='_compute_payment_difficulty', inverse='_inverse_payment_difficulty', store=True) + payment_history_url = fields.Text(string='Payment History URL') + + @api.depends('parent_id.payment_difficulty') + def _compute_payment_difficulty(self): + for partner in self: + if partner.parent_id: + partner.payment_difficulty = partner.parent_id.payment_difficulty + + def _inverse_payment_difficulty(self): + for partner in self: + if not partner.parent_id: + partner.child_ids.write({ + 'payment_difficulty': partner.payment_difficulty + }) + @api.model def _default_payment_term(self): return self.env.ref('__export__.account_payment_term_26_484409e2').id -- cgit v1.2.3 From e921762879216dbe8df4e36dfa294ae4ccf293ee Mon Sep 17 00:00:00 2001 From: "Indoteknik ." Date: Tue, 24 Jun 2025 13:39:12 +0700 Subject: (andri) fix --- indoteknik_custom/models/res_partner.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'indoteknik_custom/models/res_partner.py') diff --git a/indoteknik_custom/models/res_partner.py b/indoteknik_custom/models/res_partner.py index 98aac7eb..d23ab824 100644 --- a/indoteknik_custom/models/res_partner.py +++ b/indoteknik_custom/models/res_partner.py @@ -166,7 +166,7 @@ class ResPartner(models.Model): telegram_id = fields.Char(string="Telegram") avg_aging= fields.Float(string='Average Aging') - payment_difficulty = fields.Selection([('bermasalah', 'Bermasalah'),('sulit', 'Sulit'),('agak_sulit', 'Agak Sulit'),('normal', 'Normal')], string='Payment Difficulty', tracking=3, compute='_compute_payment_difficulty', inverse='_inverse_payment_difficulty', store=True) + payment_difficulty = fields.Selection([('bermasalah', 'Bermasalah'),('sulit', 'Sulit'),('agak_sulit', 'Agak Sulit'),('normal', 'Normal')], string='Payment Difficulty', tracking=3, compute='_compute_payment_difficulty', inverse='_inverse_payment_difficulty') payment_history_url = fields.Text(string='Payment History URL') @api.depends('parent_id.payment_difficulty') -- cgit v1.2.3 From a7139584557cc8c0d881bafc25b4cbbdb1c93ffc Mon Sep 17 00:00:00 2001 From: "Indoteknik ." Date: Tue, 24 Jun 2025 13:59:07 +0700 Subject: (andri) ganti compute field menjadi field biasa --- indoteknik_custom/models/res_partner.py | 31 ++++++++++++++++++------------- 1 file changed, 18 insertions(+), 13 deletions(-) (limited to 'indoteknik_custom/models/res_partner.py') diff --git a/indoteknik_custom/models/res_partner.py b/indoteknik_custom/models/res_partner.py index d23ab824..d439c7a8 100644 --- a/indoteknik_custom/models/res_partner.py +++ b/indoteknik_custom/models/res_partner.py @@ -164,23 +164,22 @@ class ResPartner(models.Model): "Set its value to 0.00 to disable " "this feature", tracking=3) telegram_id = fields.Char(string="Telegram") - avg_aging= fields.Float(string='Average Aging') - payment_difficulty = fields.Selection([('bermasalah', 'Bermasalah'),('sulit', 'Sulit'),('agak_sulit', 'Agak Sulit'),('normal', 'Normal')], string='Payment Difficulty', tracking=3, compute='_compute_payment_difficulty', inverse='_inverse_payment_difficulty') + payment_difficulty = fields.Selection([('bermasalah', 'Bermasalah'),('sulit', 'Sulit'),('agak_sulit', 'Agak Sulit'),('normal', 'Normal')], string='Payment Difficulty', tracking=3) payment_history_url = fields.Text(string='Payment History URL') - @api.depends('parent_id.payment_difficulty') - def _compute_payment_difficulty(self): - for partner in self: - if partner.parent_id: - partner.payment_difficulty = partner.parent_id.payment_difficulty + # @api.depends('parent_id.payment_difficulty') + # def _compute_payment_difficulty(self): + # for partner in self: + # if partner.parent_id: + # partner.payment_difficulty = partner.parent_id.payment_difficulty - def _inverse_payment_difficulty(self): - for partner in self: - if not partner.parent_id: - partner.child_ids.write({ - 'payment_difficulty': partner.payment_difficulty - }) + # def _inverse_payment_difficulty(self): + # for partner in self: + # if not partner.parent_id: + # partner.child_ids.write({ + # 'payment_difficulty': partner.payment_difficulty + # }) @api.model def _default_payment_term(self): @@ -209,6 +208,10 @@ class ResPartner(models.Model): for rec in self: if 'latitude' in vals or 'longtitude' in vals: rec._update_address_from_coords() + + # Sinkronisasi payment_difficulty ke semua anak jika partner ini adalah parent + if not rec.parent_id and 'payment_difficulty' in vals: + rec.child_ids.write({'payment_difficulty': vals['payment_difficulty']}) # # # if 'property_payment_term_id' in vals: # # if not self.env.user.is_accounting and vals['property_payment_term_id'] != 26: @@ -227,6 +230,8 @@ class ResPartner(models.Model): for rec in records: if vals.get('latitude') and vals.get('longtitude'): rec._update_address_from_coords() + if rec.parent_id and not vals.get('payment_difficulty'): + rec.payment_difficulty = rec.parent_id.payment_difficulty return records @api.constrains('name') -- cgit v1.2.3 From 96959a512908b6cdec226ada836607db2d525042 Mon Sep 17 00:00:00 2001 From: "Indoteknik ." Date: Wed, 25 Jun 2025 08:38:52 +0700 Subject: (andri)fix --- indoteknik_custom/models/res_partner.py | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) (limited to 'indoteknik_custom/models/res_partner.py') diff --git a/indoteknik_custom/models/res_partner.py b/indoteknik_custom/models/res_partner.py index d439c7a8..f5347bea 100644 --- a/indoteknik_custom/models/res_partner.py +++ b/indoteknik_custom/models/res_partner.py @@ -165,21 +165,21 @@ class ResPartner(models.Model): "this feature", tracking=3) telegram_id = fields.Char(string="Telegram") avg_aging= fields.Float(string='Average Aging') - payment_difficulty = fields.Selection([('bermasalah', 'Bermasalah'),('sulit', 'Sulit'),('agak_sulit', 'Agak Sulit'),('normal', 'Normal')], string='Payment Difficulty', tracking=3) + payment_difficulty = fields.Selection([('bermasalah', 'Bermasalah'),('sulit', 'Sulit'),('agak_sulit', 'Agak Sulit'),('normal', 'Normal')], string='Payment Difficulty', compute="_compute_payment_difficulty", inverse = "_inverse_payment_difficulty", tracking=3) payment_history_url = fields.Text(string='Payment History URL') - # @api.depends('parent_id.payment_difficulty') - # def _compute_payment_difficulty(self): - # for partner in self: - # if partner.parent_id: - # partner.payment_difficulty = partner.parent_id.payment_difficulty - - # def _inverse_payment_difficulty(self): - # for partner in self: - # if not partner.parent_id: - # partner.child_ids.write({ - # 'payment_difficulty': partner.payment_difficulty - # }) + @api.depends('parent_id.payment_difficulty') + def _compute_payment_difficulty(self): + for partner in self: + if partner.parent_id: + partner.payment_difficulty = partner.parent_id.payment_difficulty + + def _inverse_payment_difficulty(self): + for partner in self: + if not partner.parent_id: + partner.child_ids.write({ + 'payment_difficulty': partner.payment_difficulty + }) @api.model def _default_payment_term(self): -- cgit v1.2.3 From 54633b0db570e5811874f78a9515065b9cb41ad8 Mon Sep 17 00:00:00 2001 From: "Indoteknik ." Date: Mon, 7 Jul 2025 08:26:38 +0700 Subject: (andri) payment diff res partner no compute --- indoteknik_custom/models/res_partner.py | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) (limited to 'indoteknik_custom/models/res_partner.py') diff --git a/indoteknik_custom/models/res_partner.py b/indoteknik_custom/models/res_partner.py index f5347bea..33c01f37 100644 --- a/indoteknik_custom/models/res_partner.py +++ b/indoteknik_custom/models/res_partner.py @@ -168,12 +168,17 @@ class ResPartner(models.Model): payment_difficulty = fields.Selection([('bermasalah', 'Bermasalah'),('sulit', 'Sulit'),('agak_sulit', 'Agak Sulit'),('normal', 'Normal')], string='Payment Difficulty', compute="_compute_payment_difficulty", inverse = "_inverse_payment_difficulty", tracking=3) payment_history_url = fields.Text(string='Payment History URL') + # no compute + payment_diff = fields.Selection([('bermasalah', 'Bermasalah'),('sulit', 'Sulit'),('agak_sulit', 'Agak Sulit'),('normal', 'Normal')], string='Payment Difficulty', tracking=3) + + # tidak terpakai @api.depends('parent_id.payment_difficulty') def _compute_payment_difficulty(self): for partner in self: if partner.parent_id: partner.payment_difficulty = partner.parent_id.payment_difficulty + # tidak terpakai def _inverse_payment_difficulty(self): for partner in self: if not partner.parent_id: @@ -210,8 +215,8 @@ class ResPartner(models.Model): rec._update_address_from_coords() # Sinkronisasi payment_difficulty ke semua anak jika partner ini adalah parent - if not rec.parent_id and 'payment_difficulty' in vals: - rec.child_ids.write({'payment_difficulty': vals['payment_difficulty']}) + if not rec.parent_id and 'payment_diff' in vals: + rec.child_ids.write({'payment_diff': vals['payment_diff']}) # # # if 'property_payment_term_id' in vals: # # if not self.env.user.is_accounting and vals['property_payment_term_id'] != 26: @@ -230,8 +235,8 @@ class ResPartner(models.Model): for rec in records: if vals.get('latitude') and vals.get('longtitude'): rec._update_address_from_coords() - if rec.parent_id and not vals.get('payment_difficulty'): - rec.payment_difficulty = rec.parent_id.payment_difficulty + if rec.parent_id and not vals.get('payment_diff'): + rec.payment_diff = rec.parent_id.payment_diff return records @api.constrains('name') -- cgit v1.2.3 From 347e5e070592e7517b90160d666ce41ddff10347 Mon Sep 17 00:00:00 2001 From: "Indoteknik ." Date: Tue, 8 Jul 2025 09:14:45 +0700 Subject: (andri) fix --- indoteknik_custom/models/res_partner.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'indoteknik_custom/models/res_partner.py') diff --git a/indoteknik_custom/models/res_partner.py b/indoteknik_custom/models/res_partner.py index 33c01f37..78fd98ae 100644 --- a/indoteknik_custom/models/res_partner.py +++ b/indoteknik_custom/models/res_partner.py @@ -215,8 +215,8 @@ class ResPartner(models.Model): rec._update_address_from_coords() # Sinkronisasi payment_difficulty ke semua anak jika partner ini adalah parent - if not rec.parent_id and 'payment_diff' in vals: - rec.child_ids.write({'payment_diff': vals['payment_diff']}) + if not rec.parent_id and 'payment_difficulty' in vals: + rec.child_ids.write({'payment_difficulty': vals['payment_difficulty']}) # # # if 'property_payment_term_id' in vals: # # if not self.env.user.is_accounting and vals['property_payment_term_id'] != 26: @@ -235,8 +235,8 @@ class ResPartner(models.Model): for rec in records: if vals.get('latitude') and vals.get('longtitude'): rec._update_address_from_coords() - if rec.parent_id and not vals.get('payment_diff'): - rec.payment_diff = rec.parent_id.payment_diff + if rec.parent_id and not vals.get('payment_difficulty'): + rec.payment_difficulty = rec.parent_id.payment_difficulty return records @api.constrains('name') -- cgit v1.2.3 From c667a8699762057c9e6191466a182ebb69cb66c7 Mon Sep 17 00:00:00 2001 From: "Indoteknik ." Date: Tue, 8 Jul 2025 09:16:50 +0700 Subject: (andri) fix --- indoteknik_custom/models/res_partner.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'indoteknik_custom/models/res_partner.py') diff --git a/indoteknik_custom/models/res_partner.py b/indoteknik_custom/models/res_partner.py index 78fd98ae..52947128 100644 --- a/indoteknik_custom/models/res_partner.py +++ b/indoteknik_custom/models/res_partner.py @@ -169,7 +169,7 @@ class ResPartner(models.Model): payment_history_url = fields.Text(string='Payment History URL') # no compute - payment_diff = fields.Selection([('bermasalah', 'Bermasalah'),('sulit', 'Sulit'),('agak_sulit', 'Agak Sulit'),('normal', 'Normal')], string='Payment Difficulty', tracking=3) + # payment_diff = fields.Selection([('bermasalah', 'Bermasalah'),('sulit', 'Sulit'),('agak_sulit', 'Agak Sulit'),('normal', 'Normal')], string='Payment Difficulty', tracking=3) # tidak terpakai @api.depends('parent_id.payment_difficulty') -- cgit v1.2.3 From e0e6848123d06c58a506098124d4948fb72e2ba3 Mon Sep 17 00:00:00 2001 From: "Indoteknik ." Date: Sat, 19 Jul 2025 15:31:39 +0700 Subject: (andri) fix --- indoteknik_custom/models/res_partner.py | 15 +-------------- 1 file changed, 1 insertion(+), 14 deletions(-) (limited to 'indoteknik_custom/models/res_partner.py') diff --git a/indoteknik_custom/models/res_partner.py b/indoteknik_custom/models/res_partner.py index 52947128..236df16f 100644 --- a/indoteknik_custom/models/res_partner.py +++ b/indoteknik_custom/models/res_partner.py @@ -165,26 +165,13 @@ class ResPartner(models.Model): "this feature", tracking=3) telegram_id = fields.Char(string="Telegram") avg_aging= fields.Float(string='Average Aging') - payment_difficulty = fields.Selection([('bermasalah', 'Bermasalah'),('sulit', 'Sulit'),('agak_sulit', 'Agak Sulit'),('normal', 'Normal')], string='Payment Difficulty', compute="_compute_payment_difficulty", inverse = "_inverse_payment_difficulty", tracking=3) + payment_difficulty = fields.Selection([('bermasalah', 'Bermasalah'),('sulit', 'Sulit'),('agak_sulit', 'Agak Sulit'),('normal', 'Normal')], string='Payment Difficulty', tracking=3) payment_history_url = fields.Text(string='Payment History URL') # no compute # payment_diff = fields.Selection([('bermasalah', 'Bermasalah'),('sulit', 'Sulit'),('agak_sulit', 'Agak Sulit'),('normal', 'Normal')], string='Payment Difficulty', tracking=3) # tidak terpakai - @api.depends('parent_id.payment_difficulty') - def _compute_payment_difficulty(self): - for partner in self: - if partner.parent_id: - partner.payment_difficulty = partner.parent_id.payment_difficulty - - # tidak terpakai - def _inverse_payment_difficulty(self): - for partner in self: - if not partner.parent_id: - partner.child_ids.write({ - 'payment_difficulty': partner.payment_difficulty - }) @api.model def _default_payment_term(self): -- cgit v1.2.3