diff options
| author | Miqdad <ahmadmiqdad27@gmail.com> | 2025-06-18 10:36:17 +0700 |
|---|---|---|
| committer | Miqdad <ahmadmiqdad27@gmail.com> | 2025-06-18 10:36:17 +0700 |
| commit | fe8c7bf1903242610d99381b5109506294648d10 (patch) | |
| tree | 2b77e018dee5eaa5b93b66c691a84055ef7806e3 | |
| parent | 968d9987eb53670f0d96209e77debb1196f9b939 (diff) | |
| parent | f4486625017ee5edae369a6be283863a30066b3b (diff) | |
Merge branch 'odoo-backup' of https://bitbucket.org/altafixco/indoteknik-addons into tukar_guling
| -rw-r--r-- | ab_openstreetmap/static/src/js/googlemap_widget.js | 31 | ||||
| -rw-r--r-- | indoteknik_custom/models/commision.py | 11 | ||||
| -rw-r--r-- | indoteknik_custom/models/res_partner.py | 14 | ||||
| -rwxr-xr-x | indoteknik_custom/models/sale_order.py | 100 | ||||
| -rw-r--r-- | indoteknik_custom/views/customer_commision.xml | 2 | ||||
| -rw-r--r-- | indoteknik_custom/views/res_partner.xml | 4 | ||||
| -rwxr-xr-x | indoteknik_custom/views/sale_order.xml | 6 |
7 files changed, 88 insertions, 80 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/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/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/models/sale_order.py b/indoteknik_custom/models/sale_order.py index 1771f210..68beffbc 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,36 @@ 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.delivery_service_type = 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): 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 @@ <field name="commision_percent"/> <field name="commision_amt"/> <field name="commision_amt_text"/> + <field name="cashback" attrs="{'invisible': [('commision_type', 'not in', ['cashback'])]}"/> + <field name="total_commision" attrs="{'invisible': [('commision_type', 'not in', ['cashback'])]}"/> <field name="grouped_so_number" readonly="1"/> <field name="grouped_invoice_number" readonly="1"/> <field name="approved_by" readonly="1"/> 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 @@ </group> <xpath expr="//notebook/page[@name='contact_addresses']" position="before"> <page string="Pin Point Location" name="map_location"> - <!-- <group> + <group> <button name="geocode_address" type="object" string="Get Pin Point Location" class="btn btn-primary"/> - </group> --> + </group> <div style="margin: 16px 0;"> <field name="map_view" widget="googlemap" nolabel="1"/> </div> 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 @@ </field> <field name="select_shipping_option" position="attributes"> <attribute name="attrs"> - {'readonly': [('approval_status', '=', 'approved'), ('state', 'not in', - ['cancel','draft'])]} + {'readonly': [('state', 'in', ['cancel', 'done'])]} </attribute> </field> <field name="carrier_id" position="attributes"> <attribute name="attrs"> - {'readonly': [('approval_status', '=', 'approved'), ('state', 'not in', - ['cancel', 'draft'])]} + {'readonly': [('state', 'in', ['cancel', 'done'])]} </attribute> </field> <field name="payment_term_id" position="attributes"> |
