From 6c6940052eb8d480fc6719819c06a964dc0827dc Mon Sep 17 00:00:00 2001 From: Azka Nathan Date: Tue, 20 May 2025 13:21:30 +0700 Subject: webhook ginee and api detail orders --- fixco_custom/__manifest__.py | 4 +- fixco_custom/models/__init__.py | 2 + fixco_custom/models/detail_order.py | 59 ++++++++++++++++ fixco_custom/models/webhook_ginee.py | 107 ++++++++++++++++++++++++++++++ fixco_custom/security/ir.model.access.csv | 2 + fixco_custom/views/detail_order.xml | 59 ++++++++++++++++ fixco_custom/views/webhook_ginee.xml | 59 ++++++++++++++++ 7 files changed, 291 insertions(+), 1 deletion(-) create mode 100644 fixco_custom/models/detail_order.py create mode 100644 fixco_custom/models/webhook_ginee.py create mode 100644 fixco_custom/views/detail_order.xml create mode 100644 fixco_custom/views/webhook_ginee.xml (limited to 'fixco_custom') diff --git a/fixco_custom/__manifest__.py b/fixco_custom/__manifest__.py index b49d3ad..232d2d9 100644 --- a/fixco_custom/__manifest__.py +++ b/fixco_custom/__manifest__.py @@ -12,7 +12,9 @@ 'data': [ 'security/ir.model.access.csv', 'views/res_partner.xml', - 'views/sale_order.xml' + 'views/sale_order.xml', + 'views/webhook_ginee.xml', + 'views/detail_order.xml', ], 'demo': [], 'css': [], diff --git a/fixco_custom/models/__init__.py b/fixco_custom/models/__init__.py index 30fb10d..5815aa3 100644 --- a/fixco_custom/models/__init__.py +++ b/fixco_custom/models/__init__.py @@ -1,2 +1,4 @@ from . import partner from . import sale +from . import webhook_ginee +from . import detail_order diff --git a/fixco_custom/models/detail_order.py b/fixco_custom/models/detail_order.py new file mode 100644 index 0000000..c93bc72 --- /dev/null +++ b/fixco_custom/models/detail_order.py @@ -0,0 +1,59 @@ +from odoo import api, fields, models, _ +from odoo.exceptions import UserError +import time +import requests +import json +import hmac +import base64 +from hashlib import sha256 + +class DetailOrder(models.Model): + _name = "detail.order" + _inherit = ['mail.thread'] + + detail_order = fields.Text() + execute_status = fields.Selection([ + ('success', 'Success'), + ('failed', 'Failed'), + ('done', 'Done'), + ('not_found', 'Record not found') + ], 'Execute Status') + + def get_order_id(self): + try: + if self.json_ginee: + json_data = json.loads(self.json_ginee) + order_id = json_data.get('data', {}).get('orderId') + order_status = json_data.get('data', {}).get('orderStatus') + print_info = json_data.get('data', {}).get('printInfo', {}).get('labelPrintStatus') + if not order_id: + raise UserError(_("Order ID not found in JSON data")) + return order_id + raise UserError(_("No JSON data available")) + except json.JSONDecodeError: + raise UserError(_("Invalid JSON format in json_ginee field")) + except Exception as e: + raise UserError(_("Error extracting order ID: %s") % str(e)) + + def process_queue_item(self, limit=100, max_exec_time=30): + domain = [('execute_status', '=', 'success')] + records = self.search(domain, order='create_date asc', limit=limit) + start_time = time.time() + for rec in records: + end_time = time.time() + elapsed_time = end_time - start_time + if elapsed_time > max_exec_time: + break + rec.execute_queue() + + def execute_queue(self): + try: + order_id, order_status, print_info = self.get_order_id() + + except Exception as e: + self.write({ + 'execute_status': 'failed', + 'json_ginee': json.dumps({ + 'error': str(e) + }) + }) diff --git a/fixco_custom/models/webhook_ginee.py b/fixco_custom/models/webhook_ginee.py new file mode 100644 index 0000000..1ee814f --- /dev/null +++ b/fixco_custom/models/webhook_ginee.py @@ -0,0 +1,107 @@ +from odoo import api, fields, models, _ +from odoo.exceptions import UserError +import time +import requests +import json +import hmac +import base64 +from hashlib import sha256 + +Request_URI = '/openapi/order/v1/batch-get' +ACCESS_KEY = '24bb6a1ec618ec6a' +SECRET_KEY = '32e4a78ad05ee230' + +class WebhookGinee(models.Model): + _name = "webhook.ginee" + _inherit = ['mail.thread'] + + json_ginee = fields.Text() + execute_status = fields.Selection([ + ('success', 'Success'), + ('failed', 'Failed'), + ('done', 'Done'), + ('not_found', 'Record not found') + ], 'Execute Status') + + def get_order_id(self): + try: + if self.json_ginee: + json_data = json.loads(self.json_ginee) + order_id = json_data.get('payload', {}).get('orderId') + if not order_id: + raise UserError(_("Order ID not found in JSON data")) + return order_id + raise UserError(_("No JSON data available")) + except json.JSONDecodeError: + raise UserError(_("Invalid JSON format in json_ginee field")) + except Exception as e: + raise UserError(_("Error extracting order ID: %s") % str(e)) + + def process_queue_item(self, limit=100, max_exec_time=30): + domain = [('execute_status', '=', False)] + records = self.search(domain, order='create_date asc', limit=limit) + start_time = time.time() + for rec in records: + end_time = time.time() + elapsed_time = end_time - start_time + if elapsed_time > max_exec_time: + break + rec.execute_queue() + + def execute_queue(self): + try: + # Get order ID from json_ginee + order_id = self.get_order_id() + + authorization = self.sign_request() + headers = { + 'Content-Type': 'application/json', + 'X-Advai-Country': 'ID', + 'Authorization': authorization + } + + payload = { + "orderIds": [order_id] + } + + # URL endpoint Ginee + url = "https://api.ginee.com/openapi/order/v1/batch-get" + + # Melakukan POST request + response = requests.post( + url, + headers=headers, + data=json.dumps(payload) + ) + + # Cek status response + if response.status_code == 200: + data = response.json() + detail_order = self.env['detail.order'].create({ + 'detail_order': json.dumps(data), + 'execute_status': 'success' + }) + self.execute_status = 'done' + else: + self.write({ + 'execute_status': 'failed', + 'json_ginee': json.dumps({ + 'error': f"Request failed with status code {response.status_code}", + 'response': response.text + }) + }) + + except Exception as e: + self.write({ + 'execute_status': 'failed', + 'json_ginee': json.dumps({ + 'error': str(e) + }) + }) + + def sign_request(self): + signData = '$'.join(['POST', Request_URI]) + '$' + authorization = ACCESS_KEY + ':' + base64.b64encode( + hmac.new(SECRET_KEY.encode('utf-8'), signData.encode('utf-8'), digestmod=sha256).digest() + ).decode('ascii') + return authorization \ No newline at end of file diff --git a/fixco_custom/security/ir.model.access.csv b/fixco_custom/security/ir.model.access.csv index 97dd8b9..a2d897a 100644 --- a/fixco_custom/security/ir.model.access.csv +++ b/fixco_custom/security/ir.model.access.csv @@ -1 +1,3 @@ id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_webhook_ginee,access.webhook.ginee,model_webhook_ginee,,1,1,1,1 +access_detail_order,access.detail.order,model_detail_order,,1,1,1,1 \ No newline at end of file diff --git a/fixco_custom/views/detail_order.xml b/fixco_custom/views/detail_order.xml new file mode 100644 index 0000000..a549579 --- /dev/null +++ b/fixco_custom/views/detail_order.xml @@ -0,0 +1,59 @@ + + + + detail.order.tree + detail.order + + + + + + + + + + detail.order.form + detail.order + +
+ + + + + + + + +
+ + +
+
+
+
+ + + detail.order.search.view + detail.order + + + + + + + + + Detail Order + ir.actions.act_window + detail.order + tree,form + + + +
diff --git a/fixco_custom/views/webhook_ginee.xml b/fixco_custom/views/webhook_ginee.xml new file mode 100644 index 0000000..22f3a05 --- /dev/null +++ b/fixco_custom/views/webhook_ginee.xml @@ -0,0 +1,59 @@ + + + + webhook.ginee.tree + webhook.ginee + + + + + + + + + + webhook.ginee.form + webhook.ginee + +
+ + + + + + + + +
+ + +
+
+
+
+ + + webhook.ginee.search.view + webhook.ginee + + + + + + + + + Webhook Ginee + ir.actions.act_window + webhook.ginee + tree,form + + + +
-- cgit v1.2.3