summaryrefslogtreecommitdiff
path: root/fixco_custom
diff options
context:
space:
mode:
Diffstat (limited to 'fixco_custom')
-rw-r--r--fixco_custom/__manifest__.py4
-rw-r--r--fixco_custom/models/__init__.py2
-rw-r--r--fixco_custom/models/detail_order.py59
-rw-r--r--fixco_custom/models/webhook_ginee.py107
-rw-r--r--fixco_custom/security/ir.model.access.csv2
-rw-r--r--fixco_custom/views/detail_order.xml59
-rw-r--r--fixco_custom/views/webhook_ginee.xml59
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>