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 --- ab_openstreetmap/static/src/js/googlemap_widget.js | 31 +++++++++++----------- indoteknik_custom/models/res_partner.py | 14 +++++----- indoteknik_custom/views/res_partner.xml | 4 +-- 3 files changed, 25 insertions(+), 24 deletions(-) diff --git a/ab_openstreetmap/static/src/js/googlemap_widget.js b/ab_openstreetmap/static/src/js/googlemap_widget.js index 1728fa54..6471be0b 100644 --- a/ab_openstreetmap/static/src/js/googlemap_widget.js +++ b/ab_openstreetmap/static/src/js/googlemap_widget.js @@ -13,30 +13,23 @@ odoo.define("ab_openstreetmap.googlemap_widget", function (require) { this._waitForMapReady(); }, + on_attach_callback: function () { + this._waitForMapReady(); // Trigger ulang saat widget dimunculkan + }, + _waitForMapReady: function () { const mapEl = document.getElementById("mapid"); if (mapEl && mapEl.offsetWidth > 0 && mapEl.offsetHeight > 0) { this._loadGoogle(); } else { - setTimeout(() => this._waitForMapReady(), 100); + setTimeout(() => this._waitForMapReady(), 300); // Tambah jeda untuk mode edit/tab } }, async _loadGoogle() { - // const apiKey = await rpc.query({ - // model: "ir.config_parameter", - // method: "get_param", - // args: ["google.maps.api_key"], - // }); - // const mapId = await rpc.query({ - // model: "ir.config_parameter", - // method: "get_param", - // args: ["google.maps.map_id"], - // }); - - const apiKey = "AIzaSyB7bG9aSNAJnSrj0Z7f1abFsqKVoiJfsPE"; // Ganti dengan API Key Anda - const mapId = "1af072c8d80a2adec8057f34"; - // Ganti dengan Map ID Anda + const apiKey = "AIzaSyB7bG9aSNAJnSrj0Z7f1abFsqKVoiJfsPE"; // Ganti sesuai kebutuhan + const mapId = "1af072c8d80a2adec8057f34"; // Ganti sesuai kebutuhan + if (!window.google || !window.google.maps) { const script = document.createElement("script"); script.src = `https://maps.googleapis.com/maps/api/js?key=${apiKey}&v=weekly&libraries=places,marker`; @@ -57,6 +50,7 @@ odoo.define("ab_openstreetmap.googlemap_widget", function (require) { if (!mapEl) return; mapEl.style.position = "relative"; + mapEl.style.minHeight = "400px"; // Pastikan map tidak collapse const { Map } = await google.maps.importLibrary("maps"); const { AdvancedMarkerElement } = await google.maps.importLibrary("marker"); @@ -67,6 +61,12 @@ odoo.define("ab_openstreetmap.googlemap_widget", function (require) { mapId: mapId || undefined, }); + // Trigger resize untuk menangani kasus map awalnya hidden + setTimeout(() => { + google.maps.event.trigger(map, "resize"); + map.setCenter({ lat, lng }); // Reset ulang posisi setelah resize + }, 300); + const marker = new AdvancedMarkerElement({ map, position: { lat, lng }, @@ -100,7 +100,6 @@ odoo.define("ab_openstreetmap.googlemap_widget", function (require) { `; mapEl.appendChild(input); - // Gunakan Autocomplete klasik (deprecated tapi stabil) const autocomplete = new google.maps.places.Autocomplete(input); autocomplete.addListener("place_changed", () => { const place = autocomplete.getPlace(); 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) diff --git a/indoteknik_custom/views/res_partner.xml b/indoteknik_custom/views/res_partner.xml index 2a4b03a7..30b5ca36 100644 --- a/indoteknik_custom/views/res_partner.xml +++ b/indoteknik_custom/views/res_partner.xml @@ -67,9 +67,9 @@ - +
-- cgit v1.2.3 From b0241e8449224c67cccee154fb25d784d3d36c1c Mon Sep 17 00:00:00 2001 From: "Indoteknik ." Date: Tue, 17 Jun 2025 09:54:46 +0700 Subject: (andri) lepas readonly pada shipping SO yang telah di confirm --- indoteknik_custom/views/sale_order.xml | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/indoteknik_custom/views/sale_order.xml b/indoteknik_custom/views/sale_order.xml index fbca3705..d0442677 100755 --- a/indoteknik_custom/views/sale_order.xml +++ b/indoteknik_custom/views/sale_order.xml @@ -305,14 +305,12 @@ - {'readonly': [('approval_status', '=', 'approved'), ('state', 'not in', - ['cancel','draft'])]} + {'readonly': [('state', 'in', ['cancel', 'done'])]} - {'readonly': [('approval_status', '=', 'approved'), ('state', 'not in', - ['cancel', 'draft'])]} + {'readonly': [('state', 'in', ['cancel', 'done'])]} -- cgit v1.2.3 From 4fb838700e7d971abb2b1a46d051bc460e532d9e Mon Sep 17 00:00:00 2001 From: "Indoteknik ." Date: Tue, 17 Jun 2025 17:55:12 +0700 Subject: (andri) fix onchange shipping option --- indoteknik_custom/models/sale_order.py | 99 ++++++++++++++++------------------ 1 file changed, 47 insertions(+), 52 deletions(-) diff --git a/indoteknik_custom/models/sale_order.py b/indoteknik_custom/models/sale_order.py index 1771f210..03e40145 100755 --- a/indoteknik_custom/models/sale_order.py +++ b/indoteknik_custom/models/sale_order.py @@ -377,37 +377,37 @@ class SaleOrder(models.Model): carrier_ids = [row[0] for row in result if row[0]] return carrier_ids - @api.model - def fields_view_get(self, view_id=None, view_type='form', toolbar=False, submenu=False): - res = super(SaleOrder, self).fields_view_get(view_id=view_id, view_type=view_type, toolbar=toolbar, submenu=submenu) - - if view_type == 'form': - doc = etree.XML(res['arch']) - - # Ambil semua delivery_carrier_id dari mapping rajaongkir_kurir - biteship_ids = self.env['rajaongkir.kurir'].search([]).mapped('delivery_carrier_id.id') - biteship_ids = list(set(filter(None, biteship_ids))) # pastikan unik dan bukan None - - all_ids = self.env['delivery.carrier'].search([]).ids - custom_ids = list(set(all_ids) - set(biteship_ids)) - - # Format sebagai string Python list - biteship_ids_str = ','.join(str(i) for i in biteship_ids) or '-1' - custom_ids_str = ','.join(str(i) for i in custom_ids) or '-1' - - # Terapkan domain ke field carrier_id - for node in doc.xpath("//field[@name='carrier_id']"): - # Domain tergantung select_shipping_option - node.set( - 'domain', - "[('id', 'in', [%s]) if select_shipping_option == 'biteship' else ('id', 'in', [%s])]" % - (biteship_ids_str, custom_ids_str) - ) + # @api.model + # def fields_view_get(self, view_id=None, view_type='form', toolbar=False, submenu=False): + # res = super(SaleOrder, self).fields_view_get(view_id=view_id, view_type=view_type, toolbar=toolbar, submenu=submenu) + + # if view_type == 'form': + # doc = etree.XML(res['arch']) + + # # Ambil semua delivery_carrier_id dari mapping rajaongkir_kurir + # biteship_ids = self.env['rajaongkir.kurir'].search([]).mapped('delivery_carrier_id.id') + # biteship_ids = list(set(filter(None, biteship_ids))) # pastikan unik dan bukan None + + # all_ids = self.env['delivery.carrier'].search([]).ids + # custom_ids = list(set(all_ids) - set(biteship_ids)) + + # # Format sebagai string Python list + # biteship_ids_str = ','.join(str(i) for i in biteship_ids) or '-1' + # custom_ids_str = ','.join(str(i) for i in custom_ids) or '-1' + + # # Terapkan domain ke field carrier_id + # for node in doc.xpath("//field[@name='carrier_id']"): + # # Domain tergantung select_shipping_option + # node.set( + # 'domain', + # "[('id', 'in', [%s]) if select_shipping_option == 'biteship' else ('id', 'in', [%s])]" % + # (biteship_ids_str, custom_ids_str) + # ) - # Simpan kembali hasil XML ke arsitektur form - res['arch'] = etree.tostring(doc, encoding='unicode') + # # Simpan kembali hasil XML ke arsitektur form + # res['arch'] = etree.tostring(doc, encoding='unicode') - return res + # return res # @api.onchange('shipping_option_id') # def _onchange_shipping_option_id(self): @@ -599,40 +599,35 @@ class SaleOrder(models.Model): @api.onchange('select_shipping_option') def _onchange_select_shipping_option(self): - if self.select_shipping_option == 'biteship' and self.shipping_cost_covered == 'indoteknik': - self.select_shipping_option = self._origin.select_shipping_option if self._origin else 'custom' - return { - 'warning': { - 'title': "Biteship Tidak Diizinkan", - 'message': ( - "Biaya pengiriman ditanggung Indoteknik. Tidak diizinkan memilih metode Biteship. " - "Opsi pengiriman dikembalikan ke sebelumnya." - ) - } - } - self.shipping_option_id = False self.carrier_id = False self.delivery_amt = 0 - - # Dapatkan semua ID carrier untuk Biteship + biteship_carrier_ids = [] - - # Gunakan SQL langsung untuk menghindari masalah ORM self.env.cr.execute(""" SELECT delivery_carrier_id FROM rajaongkir_kurir WHERE name IN %s """, (tuple(self._get_biteship_courier_codes()),)) - - # Ambil ID numerik hasil query biteship_carrier_ids = [row[0] for row in self.env.cr.fetchall() if row[0]] - + if self.select_shipping_option == 'biteship': - domain = [('id', 'in', biteship_carrier_ids)] if biteship_carrier_ids else [] - else: # 'custom' - domain = [('id', 'not in', biteship_carrier_ids)] if biteship_carrier_ids else [] - + if self.shipping_cost_covered == 'indoteknik': + self.select_shipping_option = self._origin.select_shipping_option if self._origin else 'custom' + return { + 'warning': { + 'title': "Biteship Tidak Diizinkan", + 'message': ( + "Biaya pengiriman ditanggung Indoteknik. Tidak diizinkan memilih metode Biteship. " + "Opsi pengiriman dikembalikan ke sebelumnya." + ) + } + } + + domain = [('id', 'in', biteship_carrier_ids)] if biteship_carrier_ids else [('id', '=', -1)] + else: + domain = [] # tampilkan semua + return {'domain': {'carrier_id': domain}} # def _compute_total_margin_excl_third_party(self): -- cgit v1.2.3 From cca31a5f582e097518701a192d4cda88525fc979 Mon Sep 17 00:00:00 2001 From: "Indoteknik ." Date: Wed, 18 Jun 2025 08:09:14 +0700 Subject: (andri) fix onchange shipping option --- indoteknik_custom/models/sale_order.py | 1 + 1 file changed, 1 insertion(+) diff --git a/indoteknik_custom/models/sale_order.py b/indoteknik_custom/models/sale_order.py index 03e40145..68beffbc 100755 --- a/indoteknik_custom/models/sale_order.py +++ b/indoteknik_custom/models/sale_order.py @@ -600,6 +600,7 @@ class SaleOrder(models.Model): @api.onchange('select_shipping_option') def _onchange_select_shipping_option(self): self.shipping_option_id = False + self.delivery_service_type = False self.carrier_id = False self.delivery_amt = 0 -- cgit v1.2.3 From f4486625017ee5edae369a6be283863a30066b3b Mon Sep 17 00:00:00 2001 From: Azka Nathan Date: Wed, 18 Jun 2025 10:30:02 +0700 Subject: cashback 15% customer commision --- indoteknik_custom/models/commision.py | 11 +++++++++++ indoteknik_custom/views/customer_commision.xml | 2 ++ 2 files changed, 13 insertions(+) diff --git a/indoteknik_custom/models/commision.py b/indoteknik_custom/models/commision.py index 842e64bf..d3392a0c 100644 --- a/indoteknik_custom/models/commision.py +++ b/indoteknik_custom/models/commision.py @@ -177,6 +177,8 @@ class CustomerCommision(models.Model): ], string='Status') commision_percent = fields.Float(string='Commision %', tracking=3) commision_amt = fields.Float(string='Commision Amount', tracking=3) + cashback = fields.Float(string='Cashback', tracking=3) + total_commision = fields.Float(string='Total Commision', tracking=3) commision_amt_text = fields.Char(string='Commision Amount Text', compute='compute_delivery_amt_text') total_dpp = fields.Float(string='Total DPP', compute='_compute_total_dpp') commision_type = fields.Selection([ @@ -316,6 +318,9 @@ class CustomerCommision(models.Model): if self.commision_amt == 0: self.commision_amt = self.commision_percent * self.total_dpp // 100 + if self.commision_type == 'cashback': + self.cashback = self.commision_amt * 0.15 + self.total_commision = self.commision_amt * 0.85 @api.constrains('commision_amt') def _onchange_commision_amt(self): @@ -328,6 +333,12 @@ class CustomerCommision(models.Model): if self.total_dpp > 0 and self.commision_percent == 0: self.commision_percent = (self.commision_amt / self.total_dpp) * 100 + @api.constrains('commision_type') + def _onchange_commision_amt(self): + if self.commision_type == 'cashback' and self.commision_amt > 0: + self.cashback = self.commision_amt * 0.15 + self.total_commision = self.commision_amt * 0.85 + def _compute_total_dpp(self): for data in self: total_dpp = 0 diff --git a/indoteknik_custom/views/customer_commision.xml b/indoteknik_custom/views/customer_commision.xml index 37df16ff..4be0840f 100644 --- a/indoteknik_custom/views/customer_commision.xml +++ b/indoteknik_custom/views/customer_commision.xml @@ -81,6 +81,8 @@ + + -- cgit v1.2.3