summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIndoteknik . <it@fixcomart.co.id>2025-06-03 15:36:08 +0700
committerIndoteknik . <it@fixcomart.co.id>2025-06-03 15:36:08 +0700
commitb519e0fdac46a64ffef87d27ba824038147d831b (patch)
tree7d7bea47c630e33ff3dbcfca03c533b77c34b0f3
parentd6f3060b46582ddd78f596ce3527871cae1b2b46 (diff)
(andri) memastikan order sesuai dengan informasi barang yang ingin dikirim
-rw-r--r--indoteknik_custom/models/stock_picking.py98
1 files changed, 39 insertions, 59 deletions
diff --git a/indoteknik_custom/models/stock_picking.py b/indoteknik_custom/models/stock_picking.py
index 39872ecb..cdff6e32 100644
--- a/indoteknik_custom/models/stock_picking.py
+++ b/indoteknik_custom/models/stock_picking.py
@@ -526,7 +526,6 @@ class StockPicking(models.Model):
if self.biteship_tracking_id:
raise UserError(f"Order ini sudah dikirim ke Biteship. Dengan Tracking Id: {self.biteship_tracking_id}")
- # Fungsi bantu: menentukan apakah kurir perlu koordinat
def is_courier_need_coordinates(service_code):
return service_code in [
"instant", "same_day", "instant_car",
@@ -534,47 +533,42 @@ class StockPicking(models.Model):
"cdd_bak", "cdd_box", "engkel_box", "engkel_bak"
]
- # Ambil order line
- products = self.env['sale.order.line'].search([('order_id', '=', self.sale_id.id)])
-
- # Bangun data items untuk standard
- def build_items_data(lines):
- return [{
- "name": line.product_id.name,
- "description": line.name,
- "value": line.price_unit,
- "quantity": line.product_uom_qty,
- "weight": line.weight*1000
- } for line in lines]
-
- items_data_standard = build_items_data(products)
+ # ✅ Ambil item dari move_line_ids_with_package (qty_done > 0)
+ items = []
+ for ml in self.move_line_ids_without_package:
+ if ml.qty_done <= 0:
+ continue
- # Bangun data items untuk pengiriman instant
- items_data_instant = []
- for move_line in self.move_line_ids_without_package:
- order_line = self.env['sale.order.line'].search([
+ product = ml.product_id
+ weight = product.weight or 0.1 # default minimal
+ line = ml.sale_line_id or self.env['sale.order.line'].search([
('order_id', '=', self.sale_id.id),
- ('product_id', '=', move_line.product_id.id)
+ ('product_id', '=', product.id)
], limit=1)
- if order_line:
- items_data_instant.append({
- "name": order_line.product_id.name,
- "description": order_line.name,
- "value": order_line.price_unit,
- "quantity": move_line.qty_done,
- "weight": order_line.weight*1000
- })
+ value = line.price_unit if line else 0
+ description = line.name if line else product.name
+
+ items.append({
+ "name": product.name,
+ "description": description,
+ "value": value,
+ "quantity": ml.qty_done,
+ "weight": int(weight * 1000),
+ })
- _logger.info(f"Items data standard: {items_data_standard}")
- _logger.info(f"Items data instant: {items_data_instant}")
+ if not items:
+ raise UserError("Pengiriman tidak dapat dilakukan karena tidak ada barang yang divalidasi (qty_done = 0).")
+
+ shipping_partner = self.real_shipping_id
+ courier_service_code = self.sale_id.delivery_service_type or "reg"
payload = {
"origin_coordinate": {
"latitude": -6.3031123,
"longitude": 106.7794934999
},
- "reference_id": self.name, # PERUBAHAN: Gunakan nomor BU/OUT
+ "reference_id": self.name,
"shipper_contact_name": self.carrier_id.pic_name or '',
"shipper_contact_phone": self.carrier_id.pic_phone or '',
"shipper_organization": self.carrier_id.name,
@@ -582,38 +576,26 @@ class StockPicking(models.Model):
"origin_contact_phone": "081717181922",
"origin_address": "Jl. Bandengan Utara Komp A & BRT. Penjaringan, Kec. Penjaringan, Jakarta (BELAKANG INDOMARET) KOTA JAKARTA UTARA PENJARINGAN",
"origin_postal_code": 14440,
- "destination_contact_name": self.real_shipping_id.name,
- "destination_contact_phone": self.real_shipping_id.phone or self.real_shipping_id.mobile,
- "destination_address": self.real_shipping_id.street,
- "destination_postal_code": self.real_shipping_id.zip,
+ "destination_contact_name": shipping_partner.name,
+ "destination_contact_phone": shipping_partner.phone or shipping_partner.mobile,
+ "destination_address": shipping_partner.street,
+ "destination_postal_code": shipping_partner.zip,
"origin_note": "BELAKANG INDOMARET",
- "destination_note": f"SO: {self.sale_id.name}", # PERUBAHAN: Tambahkan SO ke note
- "courier_type": self.sale_id.delivery_service_type or "reg",
+ "destination_note": f"SO: {self.sale_id.name}",
+ "courier_type": courier_service_code,
"courier_company": self.carrier_id.name.lower(),
"delivery_type": "now",
- "items": items_data_standard
+ "items": items
}
- _logger.info(f"Delivery service type: {self.sale_id.delivery_service_type}")
- _logger.info(f"Carrier: {self.carrier_id.name}")
- _logger.info(f"Payload awal: {payload}")
-
- # Tambahkan destination_coordinate jika diperlukan
- if is_courier_need_coordinates(self.sale_id.delivery_service_type):
- if not self.real_shipping_id.latitude or not self.real_shipping_id.longtitude:
+ if is_courier_need_coordinates(courier_service_code):
+ if not shipping_partner.latitude or not shipping_partner.longtitude:
raise UserError("Alamat tujuan tidak memiliki koordinat (latitude/longitude).")
- # items_to_use = items_data_instant if items_data_instant else items_data_standard
- if not items_data_instant:
- raise UserError("Pengiriman instant membutuhkan produk yang sudah diproses (qty_done > 0). Harap lakukan validasi picking terlebih dahulu.")
-
- payload.update({
- "destination_coordinate": {
- "latitude": self.real_shipping_id.latitude,
- "longitude": self.real_shipping_id.longtitude,
- },
- "items": items_data_instant
- })
+ payload["destination_coordinate"] = {
+ "latitude": shipping_partner.latitude,
+ "longitude": shipping_partner.longtitude,
+ }
_logger.info(f"Payload untuk Biteship: {payload}")
@@ -633,7 +615,7 @@ class StockPicking(models.Model):
self.biteship_id = data.get("id", "")
self.biteship_tracking_id = data.get("courier", {}).get("tracking_id", "")
self.biteship_waybill_id = data.get("courier", {}).get("waybill_id", "")
- self.delivery_tracking_no = data.get("courier", {}).get("waybill_id", "")
+ self.delivery_tracking_no = self.biteship_waybill_id
waybill_id = self.biteship_waybill_id
@@ -656,13 +638,11 @@ class StockPicking(models.Model):
'type': 'rainbow_man',
}
}
-
else:
error_data = response.json()
error_message = error_data.get("error", "Unknown error")
error_code = error_data.get("code", "No code provided")
raise UserError(f"Error saat mengirim ke Biteship: {error_message} (Code: {error_code})")
-
@api.constrains('driver_departure_date')
def constrains_driver_departure_date(self):