summaryrefslogtreecommitdiff
path: root/indoteknik_custom/models/res_partner.py
diff options
context:
space:
mode:
Diffstat (limited to 'indoteknik_custom/models/res_partner.py')
-rw-r--r--indoteknik_custom/models/res_partner.py526
1 files changed, 348 insertions, 178 deletions
diff --git a/indoteknik_custom/models/res_partner.py b/indoteknik_custom/models/res_partner.py
index 191a44c9..236df16f 100644
--- a/indoteknik_custom/models/res_partner.py
+++ b/indoteknik_custom/models/res_partner.py
@@ -3,6 +3,9 @@ from odoo.exceptions import UserError, ValidationError
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'
@@ -145,7 +148,8 @@ 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')
- address_map = fields.Char(string='Address 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')],
compute='_compute_company_type', inverse='_write_company_type', tracking=3)
@@ -160,6 +164,14 @@ 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)
+ 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.model
def _default_payment_term(self):
@@ -184,6 +196,14 @@ 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()
+
+ # 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:
@@ -195,6 +215,16 @@ 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()
+ if rec.parent_id and not vals.get('payment_difficulty'):
+ rec.payment_difficulty = rec.parent_id.payment_difficulty
+ return records
@api.constrains('name')
def _check_duplicate_name(self):
@@ -235,182 +265,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:
@@ -521,4 +551,144 @@ 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 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:
+ # 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 = "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}'
+ 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 = "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)
+ 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'),
+ }