diff options
Diffstat (limited to 'fixco_custom')
| -rw-r--r-- | fixco_custom/__manifest__.py | 4 | ||||
| -rw-r--r-- | fixco_custom/models/__init__.py | 2 | ||||
| -rw-r--r-- | fixco_custom/models/detail_order.py | 59 | ||||
| -rw-r--r-- | fixco_custom/models/webhook_ginee.py | 107 | ||||
| -rw-r--r-- | fixco_custom/security/ir.model.access.csv | 2 | ||||
| -rw-r--r-- | fixco_custom/views/detail_order.xml | 59 | ||||
| -rw-r--r-- | fixco_custom/views/webhook_ginee.xml | 59 |
7 files changed, 291 insertions, 1 deletions
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 @@ +<?xml version="1.0" encoding="UTF-8"?> +<odoo> + <record id="detail_order_tree" model="ir.ui.view"> + <field name="name">detail.order.tree</field> + <field name="model">detail.order</field> + <field name="arch" type="xml"> + <tree default_order="create_date desc"> + <field name="detail_order"/> + <field name="execute_status"/> + </tree> + </field> + </record> + + <record id="detail_order_form" model="ir.ui.view"> + <field name="name">detail.order.form</field> + <field name="model">detail.order</field> + <field name="arch" type="xml"> + <form> + <sheet> + <group> + <group> + <field name="detail_order" readonly="1"/> + <field name="execute_status" readonly="1"/> + </group> + </group> + </sheet> + <div class="oe_chatter"> + <field name="message_follower_ids" widget="mail_followers"/> + <field name="message_ids" widget="mail_thread"/> + </div> + </form> + </field> + </record> + + <record id="detail_order_view_search" model="ir.ui.view"> + <field name="name">detail.order.search.view</field> <!-- Made the name more descriptive --> + <field name="model">detail.order</field> + <field name="arch" type="xml"> + <search string="Search Detail Order"> + <field name="detail_order"/> + </search> + </field> + </record> + + <record id="detail_order_action" model="ir.actions.act_window"> + <field name="name">Detail Order</field> + <field name="type">ir.actions.act_window</field> + <field name="res_model">detail.order</field> + <field name="view_mode">tree,form</field> + </record> + + <menuitem + action="detail_order_action" + id="detail_order" + parent="sale.product_menu_catalog" + name="Detail Order" + sequence="1" + /> +</odoo> 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 @@ +<?xml version="1.0" encoding="UTF-8"?> +<odoo> + <record id="webhook_ginee_tree" model="ir.ui.view"> + <field name="name">webhook.ginee.tree</field> + <field name="model">webhook.ginee</field> + <field name="arch" type="xml"> + <tree default_order="create_date desc"> + <field name="json_ginee"/> + <field name="execute_status"/> + </tree> + </field> + </record> + + <record id="webhook_ginee_form" model="ir.ui.view"> + <field name="name">webhook.ginee.form</field> + <field name="model">webhook.ginee</field> + <field name="arch" type="xml"> + <form> + <sheet> + <group> + <group> + <field name="json_ginee" readonly="1"/> + <field name="execute_status" readonly="1"/> + </group> + </group> + </sheet> + <div class="oe_chatter"> + <field name="message_follower_ids" widget="mail_followers"/> + <field name="message_ids" widget="mail_thread"/> + </div> + </form> + </field> + </record> + + <record id="webhook_ginee_view_search" model="ir.ui.view"> + <field name="name">webhook.ginee.search.view</field> <!-- Made the name more descriptive --> + <field name="model">webhook.ginee</field> + <field name="arch" type="xml"> + <search string="Search Webhook Ginee"> + <field name="json_ginee"/> + </search> + </field> + </record> + + <record id="webhook_ginee_action" model="ir.actions.act_window"> + <field name="name">Webhook Ginee</field> + <field name="type">ir.actions.act_window</field> + <field name="res_model">webhook.ginee</field> + <field name="view_mode">tree,form</field> + </record> + + <menuitem + action="webhook_ginee_action" + id="webhook_ginee" + parent="sale.product_menu_catalog" + name="Webhook Ginee" + sequence="1" + /> +</odoo> |
