summaryrefslogtreecommitdiff
path: root/fixco_custom/models/shipment_group.py
diff options
context:
space:
mode:
authorAzka Nathan <darizkyfaz@gmail.com>2025-07-04 15:23:18 +0700
committerAzka Nathan <darizkyfaz@gmail.com>2025-07-04 15:23:18 +0700
commit0b16acf14c58fe224557d843101b256f7028fb5b (patch)
tree8bdccd2e80072fb28dcaf879fd1a5d704cb8498b /fixco_custom/models/shipment_group.py
parentdd93d36b4c7cec4e1681d69e296a7cff559386a0 (diff)
shipment group
Diffstat (limited to 'fixco_custom/models/shipment_group.py')
-rw-r--r--fixco_custom/models/shipment_group.py149
1 files changed, 141 insertions, 8 deletions
diff --git a/fixco_custom/models/shipment_group.py b/fixco_custom/models/shipment_group.py
index 3d60840..228306f 100644
--- a/fixco_custom/models/shipment_group.py
+++ b/fixco_custom/models/shipment_group.py
@@ -1,10 +1,29 @@
-from odoo import models, api, fields
+from odoo import fields, models, api, _
from odoo.exceptions import AccessError, UserError, ValidationError
-from datetime import timedelta, date
+from odoo.tools.float_utils import float_is_zero
+from collections import defaultdict
+from datetime import timedelta, datetime
+from datetime import timedelta, datetime as waktu
+from itertools import groupby
+import pytz, requests, json, requests
+from dateutil import parser
+import datetime
+import hmac
+import hashlib
+import base64
+import requests
+import time
import logging
+import re
+from hashlib import sha256
_logger = logging.getLogger(__name__)
+
+Request_URI = '/openapi/order/v2/list-order'
+ACCESS_KEY = '24bb6a1ec618ec6a'
+SECRET_KEY = '32e4a78ad05ee230'
+
class ShipmentGroup(models.Model):
_name = "shipment.group"
_description = "Shipment Group"
@@ -14,11 +33,56 @@ class ShipmentGroup(models.Model):
number = fields.Char(string='Document No', index=True, copy=False, readonly=True, tracking=True)
shipment_line = fields.One2many('shipment.group.line', 'shipment_id', string='Shipment Group Lines', auto_join=True)
picking_lines = fields.One2many('picking.line', 'shipment_id', string='Picking Lines', auto_join=True)
+ related_count = fields.Integer(compute='_compute_related_count', string='Related Count')
+
+ def sync_product_to_picking_line(self):
+ for shipment in self:
+ for picking_line in shipment.picking_lines:
+ shipment_lines = self.env['shipment.group.line'].search([
+ ('shipment_id', '=', shipment.id),
+ ('invoice_marketplace', '=', picking_line.invoice_marketplace),
+ ('picking_id', '=', picking_line.picking_id.id)
+ ])
+
+ picking_line.product_shipment_lines.unlink()
+
+ for sl in shipment_lines:
+ self.env['product.shipment.line'].create({
+ 'picking_line_id': picking_line.id,
+ 'product_id': sl.product_id.id,
+ 'carrier': sl.carrier or picking_line.carrier,
+ 'invoice_marketplace': sl.invoice_marketplace,
+ 'picking_id': sl.picking_id.id,
+ 'order_reference': sl.order_reference,
+ })
+
+ def _compute_related_count(self):
+ for record in self:
+ record.related_count = len(record.picking_lines)
+
+ def action_view_related_line(self):
+ self.ensure_one()
+
+ pickingLines = self.env['picking.line']
+
+ base_bu = pickingLines.search([
+ ('shipment_id', '=', self.id)
+ ])
+
+ all_bu = base_bu
+
+ return {
+ 'name': 'Related',
+ 'type': 'ir.actions.act_window',
+ 'res_model': 'picking.line',
+ 'view_mode': 'tree,form',
+ 'target': 'current',
+ 'domain': [('id', 'in', list(all_bu.ids))],
+ }
@api.constrains('picking_lines')
def _check_picking_lines(self):
for record in self:
- record.shipment_line.unlink()
for picking_line in record.picking_lines:
if not picking_line.picking_id:
@@ -37,8 +101,59 @@ class ShipmentGroup(models.Model):
'product_id': move.product_id.id,
'carrier': picking_line.picking_id.carrier,
'invoice_marketplace': picking_line.picking_id.invoice_mp,
+ 'order_reference': picking_line.order_reference,
'picking_id': picking_line.picking_id.id
})
+
+ def get_status(self):
+ for picking_line in self.picking_lines:
+ try:
+ order_id = picking_line.invoice_marketplace
+
+ authorization = self.sign_request()
+ headers = {
+ 'Content-Type': 'application/json',
+ 'X-Advai-Country': 'ID',
+ 'Authorization': authorization
+ }
+ payload = {
+ "orderNumbers": [order_id],
+ }
+ url = "https://api.ginee.com/openapi/order/v2/list-order"
+
+ response = requests.post(
+ url,
+ headers=headers,
+ data=json.dumps(payload)
+ )
+
+ if response.status_code == 200:
+ data = response.json()
+ if data.get('code') == 'SUCCESS' and data.get('message') == 'OK':
+ content = data.get('data', {}).get('content', [])
+
+ if not content:
+ raise UserError(_("No List Order information found in response"))
+
+ content_info = content[0]
+ if content_info.get('orderStatus') == 'CANCELLED':
+ picking_line.status = content_info.get('orderStatus')
+ else:
+ picking_line.status = ''
+ else:
+ raise UserError(_("API Error: %s - %s") % (data.get('code', 'UNKNOWN'), data.get('message', 'No error message')))
+ else:
+ raise UserError(_("API request failed with status code: %s") % response.status_code)
+
+ except Exception as e:
+ raise UserError(_("Error: %s") % 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
@api.model
@@ -57,6 +172,7 @@ class ShipmentGroupLine(models.Model):
carrier = fields.Char(string='Shipping Method')
invoice_marketplace = fields.Char(string='Invoice Marketplace')
picking_id = fields.Many2one('stock.picking', string='Picking')
+ order_reference = fields.Char(string='Order Reference')
class PickingLine(models.Model):
@@ -65,16 +181,33 @@ class PickingLine(models.Model):
_order = 'shipment_id, id'
shipment_id = fields.Many2one('shipment.group', string='Shipment Ref', required=True, ondelete='cascade')
+ product_shipment_lines = fields.One2many('product.shipment.line', 'picking_line_id', string='Product Shipment Lines', auto_join=True)
picking_id = fields.Many2one('stock.picking', string='Picking')
- scan_invoice_marketplace = fields.Char(string="Scan Invoice Marketplace")
+ scan_receipt = fields.Char(string="Scan Receipt")
+ invoice_marketplace = fields.Char(string='Invoice Marketplace')
carrier = fields.Char(string='Ekspedisi')
+ order_reference = fields.Char(string='Order Reference')
+ status = fields.Char(string='Status')
- @api.onchange('scan_invoice_marketplace')
- def _onchange_scan_invoice_marketplace(self):
+ @api.onchange('scan_receipt')
+ def _onchange_scan_receipt(self):
for line in self:
- if line.scan_invoice_marketplace:
- picking = self.env['stock.picking'].search([('invoice_mp', '=', line.scan_invoice_marketplace)], limit=1)
+ if line.scan_receipt:
+ picking = self.env['stock.picking'].search([('tracking_number', '=', line.scan_receipt)], limit=1)
line.picking_id = picking.id
line.carrier = picking.carrier
+ line.order_reference = picking.order_reference
+ line.invoice_marketplace = picking.invoice_mp
+
+class ProductShipmentLine(models.Model):
+ _name = 'product.shipment.line'
+ _description = 'Product Shipment Line'
+ _order = 'picking_line_id, id'
+ picking_line_id = fields.Many2one('picking.line', string='Picking Line', required=True, ondelete='cascade')
+ product_id = fields.Many2one('product.product', string='Product')
+ carrier = fields.Char(string='Shipping Method')
+ invoice_marketplace = fields.Char(string='Invoice Marketplace')
+ picking_id = fields.Many2one('stock.picking', string='Picking')
+ order_reference = fields.Char(string='Order Reference')