summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIT Fixcomart <it@fixcomart.co.id>2025-06-11 07:44:25 +0000
committerIT Fixcomart <it@fixcomart.co.id>2025-06-11 07:44:25 +0000
commit9c31b4af2a2611fe9338e879eee48957273dbe10 (patch)
tree8206e920fe8a3652b891fd9ffdbf2f5fb51312b6
parent1a63fac5f7f4dbb2990e5b1eeb9d7f381f39e908 (diff)
parent771cd3b9f5c0a6594b6e276bc47e3599d6c751e4 (diff)
Merged in gmaps-biteship (pull request #328)
Gmaps biteship
-rw-r--r--ab_openstreetmap/__init__.py0
-rw-r--r--ab_openstreetmap/__manifest__.py17
-rw-r--r--ab_openstreetmap/static/src/js/openstreetmap_widget.js86
-rw-r--r--ab_openstreetmap/static/src/xml/openstreetmap_template.xml8
-rw-r--r--ab_openstreetmap/views/templates.xml13
-rw-r--r--indoteknik_custom/models/res_partner.py65
-rw-r--r--indoteknik_custom/views/res_partner.xml27
7 files changed, 211 insertions, 5 deletions
diff --git a/ab_openstreetmap/__init__.py b/ab_openstreetmap/__init__.py
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/ab_openstreetmap/__init__.py
diff --git a/ab_openstreetmap/__manifest__.py b/ab_openstreetmap/__manifest__.py
new file mode 100644
index 00000000..745e57ab
--- /dev/null
+++ b/ab_openstreetmap/__manifest__.py
@@ -0,0 +1,17 @@
+{
+ 'name': "Openstreetmap Widget",
+ 'summary': """
+ Openstreetmap Widget
+ """,
+ 'description': """
+ Show Openstreetmap in Form View
+ Required for works add a lat long field to the model
+ """,
+ 'author': "PT. ISMATA NUSANTARA ABADI",
+ 'website': "http://www.ismata.co.id",
+ 'category': 'Uncategorized',
+ 'version': '0.1',
+ 'depends': ['base'],
+ "qweb": ['static/src/xml/openstreetmap_template.xml'],
+ 'data': ['views/templates.xml'],
+}
diff --git a/ab_openstreetmap/static/src/js/openstreetmap_widget.js b/ab_openstreetmap/static/src/js/openstreetmap_widget.js
new file mode 100644
index 00000000..0f0bfd82
--- /dev/null
+++ b/ab_openstreetmap/static/src/js/openstreetmap_widget.js
@@ -0,0 +1,86 @@
+odoo.define("ab_openstreetmap.openstreetmap_widget", function (require) {
+ "use strict";
+ var fieldRegistry = require("web.field_registry");
+ var abstractField = require("web.AbstractField");
+
+ var openstreetmap = abstractField.extend({
+ template: "openstreetmap_template",
+ start: function () {
+ var self = this;
+ this._super();
+ self._initMap();
+ },
+ _initMap: function () {
+ var self = this
+ $(document).ready(function () {
+ setTimeout(() => {
+ var lat = self.recordData.latitude;
+ var lng = self.recordData.longtitude;
+
+ if (!lat && !lng) {
+ lat = -6.2349;
+ lng = 106.9896;
+ }
+
+ var mymap = L.map('mapid').setView([lat, lng], 13);
+ L.tileLayer("https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png", {
+ attribution:
+ '&copy; <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors',
+ }).addTo(mymap);
+
+ var edit = self.mode == "edit" ? true : false;
+ var marker = L.marker([lat, lng], { draggable: edit }).addTo(mymap);
+
+ marker.on("dragend", function (e) {
+ var latlng = e.target._latlng;
+ self.trigger_up("field_changed", {
+ dataPointID: self.dataPointID,
+ changes: {
+ lat: latlng.lat,
+ lng: latlng.lng,
+ },
+ viewType: self.viewType,
+ });
+ });
+
+ if (edit) {
+ var geocode = L.Control.geocoder({
+ defaultMarkGeocode: false,
+ }).addTo(mymap);
+
+ geocode.on("markgeocode", function (e) {
+ var lat = e.geocode.center.lat;
+ var lng = e.geocode.center.lng;
+
+ mymap.flyTo([lat, lng]);
+ marker.setLatLng(new L.LatLng(lat, lng));
+ self.trigger_up("field_changed", {
+ dataPointID: self.dataPointID,
+ changes: {
+ lat: lat,
+ lng: lng,
+ },
+ viewType: self.viewType,
+ });
+ });
+ }
+
+ var interval = setInterval(() => {
+ if (mymap && mymap._size.x > 0){
+ clearInterval(interval);
+ } else if (!document.getElementById("mapid")) {
+ clearInterval(interval);
+ }
+ window.dispatchEvent(new Event("resize"));
+ }, 500);
+ }, 100);
+
+ });
+ },
+ isSet: function () {
+ return true;
+ },
+ });
+
+ fieldRegistry.add("openstreetmap", openstreetmap);
+});
diff --git a/ab_openstreetmap/static/src/xml/openstreetmap_template.xml b/ab_openstreetmap/static/src/xml/openstreetmap_template.xml
new file mode 100644
index 00000000..82672748
--- /dev/null
+++ b/ab_openstreetmap/static/src/xml/openstreetmap_template.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<templates id="template" xml:space="preserve">
+ <t t-name="openstreetmap_template">
+ <div style="width:100%">
+ <div id="mapid" style="height: 500px;"/>
+ </div>
+ </t>
+</templates> \ No newline at end of file
diff --git a/ab_openstreetmap/views/templates.xml b/ab_openstreetmap/views/templates.xml
new file mode 100644
index 00000000..ed82ae84
--- /dev/null
+++ b/ab_openstreetmap/views/templates.xml
@@ -0,0 +1,13 @@
+<odoo>
+ <data>
+ <template id="assets_backend" inherit_id="web.assets_backend">
+ <xpath expr="." position="inside">
+ <link rel="stylesheet" href="https://unpkg.com/leaflet@1.7.1/dist/leaflet.css" integrity="sha512-xodZBNTC5n17Xt2atTPuE1HxjVMSvLVW9ocqUKLsCC5CXdbqCmblAshOMAS6/keqq/sMZMZ19scR4PsZChSR7A==" crossorigin=""/>
+ <script src="https://unpkg.com/leaflet@1.7.1/dist/leaflet.js" integrity="sha512-XQoYMqMTK8LvdxXYG3nZ448hOEQiglfqkJs1NOQV44cWnUrBc8PkAOcXy20w0vlaXaVUearIOBhiXZ5V3ynxwA==" crossorigin=""></script>
+ <link rel="stylesheet" href="https://unpkg.com/leaflet-control-geocoder/dist/Control.Geocoder.css" />
+ <script src="https://unpkg.com/leaflet-control-geocoder/dist/Control.Geocoder.js"></script>
+ <script type="text/javascript" src="/ab_openstreetmap/static/src/js/openstreetmap_widget.js"/>
+ </xpath>
+ </template>
+ </data>
+</odoo> \ No newline at end of file
diff --git a/indoteknik_custom/models/res_partner.py b/indoteknik_custom/models/res_partner.py
index f1e362e6..a15398c7 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'
@@ -145,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')],
@@ -521,4 +523,65 @@ 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 '',
+ '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')
+ 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']
+ 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.")
diff --git a/indoteknik_custom/views/res_partner.xml b/indoteknik_custom/views/res_partner.xml
index 9fb6530c..6acfeaa0 100644
--- a/indoteknik_custom/views/res_partner.xml
+++ b/indoteknik_custom/views/res_partner.xml
@@ -65,10 +65,20 @@
<group name="purchase" position="inside">
<field name="leadtime"/>
</group>
- <field name="vat" position="before">
- <field name="latitude"/>
- <field name="longtitude"/>
- </field>
+ <xpath expr="//notebook/page[@name='contact_addresses']" position="before">
+ <page string="Pin Point Location" name="map_location" autofocus="autofocus">
+ <group>
+ <button name="geocode_address" type="object" string="Get Pin Point Location" class="btn btn-primary"/>
+ </group>
+ <div style="margin: 16px 0;">
+ <field name="map_view" widget="openstreetmap" nolabel="1" style="width: 100%;"/>
+ </div>
+ <group>
+ <field name="latitude" readonly="1"/>
+ <field name="longtitude" readonly="1"/>
+ </group>
+ </page>
+ </xpath>
<field name="vat" position="after">
<field name="email_finance" widget="email"/>
<field name="email_sales" widget="email"/>
@@ -82,6 +92,15 @@
<field name="main_parent_id" invisible="1" />
<field name="site_id" attrs="{'readonly': [('parent_id', '=', False)]}" domain="[('partner_id', '=', main_parent_id)]" context="{'default_partner_id': active_id}" />
</xpath>
+ <xpath expr="//field[@name='child_ids']/form/sheet/group" position="after">
+ <div class="oe_left" style="margin-top: 16px;">
+ <button name="action_open_full_form"
+ type="object"
+ string="Detail Information"
+ class="btn btn-primary"
+ />
+ </div>
+ </xpath>
<xpath expr="//field[@name='property_payment_term_id']" position="attributes">
<attribute name="readonly">0</attribute>
</xpath>