summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAzka Nathan <darizkyfaz@gmail.com>2025-05-09 15:27:38 +0700
committerAzka Nathan <darizkyfaz@gmail.com>2025-05-09 15:27:38 +0700
commit81a60ec161deb7eba3072172744276d6e5457f64 (patch)
tree5ddae42677c8deccf97113d17c4278a42fc0e900
parentbc89a3ae2ac20a53d46d8e50da4a3427f44bd870 (diff)
integration api kgx
-rw-r--r--indoteknik_custom/models/stock_picking.py74
-rw-r--r--indoteknik_custom/views/stock_picking.xml12
2 files changed, 86 insertions, 0 deletions
diff --git a/indoteknik_custom/models/stock_picking.py b/indoteknik_custom/models/stock_picking.py
index ccccbcdc..dd2365ec 100644
--- a/indoteknik_custom/models/stock_picking.py
+++ b/indoteknik_custom/models/stock_picking.py
@@ -255,6 +255,13 @@ class StockPicking(models.Model):
lalamove_image_url = fields.Char(string="Lalamove Image URL")
lalamove_image_html = fields.Html(string="Lalamove Image", compute="_compute_lalamove_image_html")
+ # KGX Section
+ kgx_pod_photo_url = fields.Char('KGX Photo URL')
+ kgx_pod_photo = fields.Html('KGX Photo', compute='_compute_kgx_image_html')
+ kgx_pod_signature = fields.Char('KGX Signature URL')
+ kgx_pod_receive_time = fields.Datetime('KGX Ata Date')
+ kgx_pod_receiver = fields.Char('KGX Receiver')
+
total_koli = fields.Integer(compute='_compute_total_koli', string="Total Koli")
total_koli_display = fields.Char(compute='_compute_total_koli_display', string="Total Koli Display")
linked_out_picking_id = fields.Many2one('stock.picking', string="Linked BU/OUT", copy=False)
@@ -276,6 +283,66 @@ class StockPicking(models.Model):
last_update_date_doc_kirim = fields.Datetime(string='Last Update Tanggal Kirim')
update_date_doc_kirim_add = fields.Boolean(string='Update Tanggal Kirim Lewat ADD')
+ def _get_kgx_awb_number(self):
+ """Menggabungkan name dan origin untuk membuat AWB Number"""
+ self.ensure_one()
+ if not self.name or not self.origin:
+ return False
+ return f"{self.name} {self.origin}"
+
+ def _download_pod_photo(self, url):
+ """Mengunduh foto POD dari URL"""
+ try:
+ response = requests.get(url, timeout=10)
+ response.raise_for_status()
+ return base64.b64encode(response.content)
+ except Exception as e:
+ raise UserError(f"Gagal mengunduh foto POD: {str(e)}")
+
+ def _parse_datetime(self, dt_str):
+ """Parse datetime string dari format KGX"""
+ try:
+ from datetime import datetime
+ # Hilangkan timezone jika ada masalah parsing
+ if '+' in dt_str:
+ dt_str = dt_str.split('+')[0]
+ return datetime.strptime(dt_str, '%Y-%m-%dT%H:%M:%S')
+ except ValueError:
+ return False
+
+ def action_get_kgx_pod(self):
+ self.ensure_one()
+
+ awb_number = self._get_kgx_awb_number()
+ if not awb_number:
+ raise UserError("Nomor AWB tidak dapat dibuat, pastikan picking memiliki name dan origin")
+
+ url = "https://kgx.co.id/get_detail_awb"
+ headers = {'Content-Type': 'application/json'}
+ payload = {"params" : {'awb_number': awb_number}}
+
+ try:
+ response = requests.post(url, headers=headers, data=json.dumps(payload))
+ response.raise_for_status()
+ data = response.json()
+
+ if data.get('result', {}).get('data', []):
+ pod_data = data['result']['data'][0].get('connote_pod', {})
+ photo_url = pod_data.get('photo')
+
+ self.kgx_pod_photo_url = photo_url
+ self.kgx_pod_signature = pod_data.get('signature')
+ self.kgx_pod_receiver = pod_data.get('receiver')
+ self.kgx_pod_receive_time = self._parse_datetime(pod_data.get('timeReceive'))
+ self.driver_arrival_date = self._parse_datetime(pod_data.get('timeReceive'))
+
+ return data
+ else:
+ raise UserError(f"Tidak ditemukan data untuk AWB: {awb_number}")
+
+ except requests.exceptions.RequestException as e:
+ raise UserError(f"Gagal mengambil data POD: {str(e)}")
+
@api.constrains('sj_return_date')
def _check_sj_return_date(self):
for record in self:
@@ -454,6 +521,13 @@ class StockPicking(models.Model):
else:
record.lalamove_image_html = "No image available."
+ def _compute_kgx_image_html(self):
+ for record in self:
+ if record.kgx_pod_photo_url:
+ record.kgx_pod_photo = f'<img src="{record.kgx_pod_photo_url}" width="300" height="300"/>'
+ else:
+ record.kgx_pod_photo = "No image available."
+
def action_fetch_lalamove_order(self):
pickings = self.env['stock.picking'].search([
('picking_type_code', '=', 'outgoing'),
diff --git a/indoteknik_custom/views/stock_picking.xml b/indoteknik_custom/views/stock_picking.xml
index b45debd0..ae77ab9a 100644
--- a/indoteknik_custom/views/stock_picking.xml
+++ b/indoteknik_custom/views/stock_picking.xml
@@ -73,6 +73,11 @@
type="object"
attrs="{'invisible': [('carrier_id', '!=', 9)]}"
/>
+ <button name="action_get_kgx_pod"
+ string="Tracking KGX"
+ type="object"
+ attrs="{'invisible': [('carrier_id', '!=', 173)]}"
+ />
<button name="button_state_approve_md"
string="Approve MD Gudang Selisih"
type="object"
@@ -219,6 +224,13 @@
<field name="lalamove_image_url" invisible="1"/>
<field name="lalamove_image_html"/>
</group>
+ <group attrs="{'invisible': [('carrier_id', '!=', 173)]}">
+ <field name="kgx_pod_photo_url" invisible="1"/>
+ <field name="kgx_pod_photo"/>
+ <field name="kgx_pod_signature" invisible="1"/>
+ <field name="kgx_pod_receive_time"/>
+ <field name="kgx_pod_receiver"/>
+ </group>
</group>
</page>
<page string="Check Product" name="check_product" attrs="{'invisible': [('picking_type_code', '=', 'outgoing')]}">