summaryrefslogtreecommitdiff
path: root/indoteknik_custom/models/stock_picking.py
diff options
context:
space:
mode:
Diffstat (limited to 'indoteknik_custom/models/stock_picking.py')
-rw-r--r--indoteknik_custom/models/stock_picking.py189
1 files changed, 142 insertions, 47 deletions
diff --git a/indoteknik_custom/models/stock_picking.py b/indoteknik_custom/models/stock_picking.py
index 2a73d631..17dd5766 100644
--- a/indoteknik_custom/models/stock_picking.py
+++ b/indoteknik_custom/models/stock_picking.py
@@ -25,7 +25,7 @@ class StockPicking(models.Model):
# Delivery Order
driver_departure_date = fields.Datetime(
- string='Driver Departure Date',
+ string='Delivery Departure Date',
copy=False
)
arrival_time = fields.Datetime(
@@ -33,8 +33,7 @@ class StockPicking(models.Model):
copy=False
)
driver_arrival_date = fields.Datetime(
- string='Driver Arrival Date',
- readonly=True,
+ string='Delivery Arrival Date',
copy=False
)
delivery_tracking_no = fields.Char(
@@ -53,6 +52,10 @@ class StockPicking(models.Model):
readonly=True,
copy=False
)
+ sj_documentation = fields.Binary(string="Dokumentasi Surat Jalan", )
+ paket_documentation = fields.Binary(string="Dokumentasi Paket", )
+ sj_return_date = fields.Datetime(string="SJ Return Date", )
+ responsible = fields.Many2one('res.users', string='Responsible', tracking=True)
approval_status = fields.Selection([
('pengajuan1', 'Approval Accounting'),
@@ -100,6 +103,7 @@ class StockPicking(models.Model):
('to invoice', 'To Invoice'),
('no', 'Nothing to Invoice')
], string='Invoice Status', related="sale_id.invoice_status")
+ note_return = fields.Text(string="Note Return", help="Catatan untuk kirim barang kembali")
state_reserve = fields.Selection([
('waiting', 'Waiting For Fullfilment'),
@@ -107,46 +111,82 @@ class StockPicking(models.Model):
('done', 'Done'),
('cancel', 'Cancelled'),
], string='Status Reserve', readonly=True, tracking=True, help="The current state of the stock picking.")
+ notee = fields.Text(string="Note")
def action_send_to_biteship(self):
url = "https://api.biteship.com/v1/orders"
-
api_key = "biteship_test.eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYW1lIjoiSW5kb3Rla25payIsInVzZXJJZCI6IjY3MTViYTJkYzVkMjdkMDAxMjRjODk2MiIsImlhdCI6MTcyOTQ5ODAwMX0.L6C73couP4-cgVEfhKI2g7eMCMo3YOFSRZhS-KSuHNA"
- items_data = []
- for item in self.items:
- items_data.append({
- "name": item.name,
- "description": item.description,
- "category": item.category,
- "value": item.value,
- "quantity": item.quantity,
- "weight": item.weight
- })
-
+ # Mencari data sale.order.line berdasarkan sale_id
+ products = self.env['sale.order.line'].search([('order_id', '=', self.sale_id.id)])
+
+ # Fungsi untuk membangun items_data dari order lines
+ 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
+ } for line in lines]
+
+ # Items untuk pengiriman standard
+ items_data_standard = build_items_data(products)
+
+ # Items untuk pengiriman instant, mengambil product_id dari move_line_ids_without_package
+ items_data_instant = []
+ for move_line in self.move_line_ids_without_package:
+ # Mencari baris di sale.order.line berdasarkan product_id dari move_line
+ order_line = self.env['sale.order.line'].search([
+ ('order_id', '=', self.sale_id.id),
+ ('product_id', '=', move_line.product_id.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, # Menggunakan qty_done dari move_line
+ "weight": order_line.weight
+ })
+
payload = {
"shipper_contact_name": self.carrier_id.pic_name or '',
"shipper_contact_phone": self.carrier_id.pic_phone or '',
- # "shipper_contact_email": "sales@indoteknik.co.id",
"shipper_organization": self.carrier_id.name,
"origin_contact_name": "PT. Indoteknik Dotcom Gemilang",
"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",
+ "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_contact_email": self.real_shipping_id.email or '',
"destination_address": self.real_shipping_id.street,
"destination_postal_code": self.real_shipping_id.zip,
- "items": items_data
+ "courier_type": "reg",
+ "courier_company": self.carrier_id.name.lower(),
+ "delivery_type": "now",
+ "destination_postal_code": self.real_shipping_id.zip,
+ "items": items_data_standard
}
+ # Cek jika pengiriman instant atau same_day
+ if "instant" in self.sale_id.delivery_service_type or "same_day" in self.sale_id.delivery_service_type:
+ payload.update({
+ "origin_note": "BELAKANG INDOMARET",
+ "courier_company": self.carrier_id.name.lower(),
+ "courier_type": self.sale_id.delivery_service_type,
+ "delivery_type": "now",
+ "items": items_data_instant # Gunakan items untuk instant
+ })
+
headers = {
"Authorization": f"Bearer {api_key}",
"Content-Type": "application/json"
}
- response = requests.post(url, headers=headers, data=json.dumps(payload))
+ # Kirim request ke Biteship
+ response = requests.post(url, headers=headers, json=payload)
if response.status_code == 201:
return response.json()
@@ -155,7 +195,8 @@ class StockPicking(models.Model):
@api.constrains('driver_departure_date')
def constrains_driver_departure_date(self):
- self.date_doc_kirim = self.driver_departure_date
+ if not self.date_doc_kirim:
+ self.date_doc_kirim = self.driver_departure_date
@api.constrains('arrival_time')
def constrains_arrival_time(self):
@@ -207,23 +248,22 @@ class StockPicking(models.Model):
# break
def check_state_reserve(self):
- picking = self.search([
+ pickings = self.search([
('state', 'not in', ['cancel', 'draft', 'done']),
('picking_type_code', '=', 'outgoing')
- ])
+ ])
- for data in picking:
- fullfilment = self.env['sales.order.fullfillment'].search([
- ('sales_order_id', '=', data.sale_id.id)
+ for picking in pickings:
+ fullfillments = self.env['sales.order.fullfillment'].search([
+ ('sales_order_id', '=', picking.sale_id.id)
])
-
- data.state_reserve = 'ready'
- data.date_reserved = datetime.datetime.utcnow()
- for rec in fullfilment:
- if rec.reserved_from not in ['Inventory On Hand', 'Reserved from stock', 'Free Stock']:
- data.state_reserve = 'waiting'
- data.date_reserved = ''
- break
+
+ picking.state_reserve = 'ready'
+ picking.date_reserved = picking.date_reserved or datetime.datetime.utcnow()
+
+ if any(rec.reserved_from not in ['Inventory On Hand', 'Reserved from stock', 'Free Stock'] for rec in fullfillments):
+ picking.state_reserve = 'waiting'
+ picking.date_reserved = ''
def _create_approval_notification(self, approval_role):
title = 'Warning'
@@ -240,9 +280,9 @@ class StockPicking(models.Model):
def _compute_shipping_status(self):
for rec in self:
status = 'pending'
- if rec.driver_departure_date and not rec.driver_arrival_date:
+ if rec.driver_departure_date and not (rec.sj_return_date or rec.driver_arrival_date):
status = 'shipment'
- elif rec.driver_departure_date and rec.driver_arrival_date:
+ elif rec.driver_departure_date and (rec.sj_return_date or rec.driver_arrival_date):
status = 'completed'
rec.shipping_status = status
@@ -402,10 +442,34 @@ class StockPicking(models.Model):
for pick in self:
if self.env.user.is_accounting:
pick.approval_return_status = 'approved'
- else:
- pick.approval_return_status = 'pengajuan1'
+ continue
+
+ action = self.env['ir.actions.act_window']._for_xml_id('indoteknik_custom.action_stock_return_note_wizard')
+
+ if self.picking_type_code == 'outgoing':
+ if self.env.user.id in [3988, 3401, 20] or (
+ self.env.user.has_group('indoteknik_custom.group_role_purchasing') and 'Return of' in self.origin
+ ):
+ action['context'] = {'picking_ids': [x.id for x in self]}
+ return action
+ elif not self.env.user.has_group('indoteknik_custom.group_role_purchasing') and 'Return of' in self.origin:
+ raise UserError('Harus Purchasing yang Ask Return')
+ else:
+ raise UserError('Harus Sales Admin yang Ask Return')
+
+ elif self.picking_type_code == 'incoming':
+ if self.env.user.has_group('indoteknik_custom.group_role_purchasing') or (
+ self.env.user.id in [3988, 3401, 20] and 'Return of' in self.origin
+ ):
+ action['context'] = {'picking_ids': [x.id for x in self]}
+ return action
+ elif not self.env.user.id in [3988, 3401, 20] and 'Return of' in self.origin:
+ raise UserError('Harus Sales Admin yang Ask Return')
+ else:
+ raise UserError('Harus Purchasing yang Ask Return')
def calculate_line_no(self):
+
for picking in self:
name = picking.group_id.name
for move in picking.move_ids_without_package:
@@ -459,9 +523,32 @@ class StockPicking(models.Model):
and quant.inventory_quantity < line.product_uom_qty
):
raise UserError('Quantity reserved lebih besar dari quantity onhand di product')
+
+ def check_qty_done_stock(self):
+ for line in self.move_line_ids_without_package:
+ def check_qty_per_inventory(self, product, location):
+ quant = self.env['stock.quant'].search([
+ ('product_id', '=', product.id),
+ ('location_id', '=', location.id),
+ ])
+ if quant:
+ return quant.quantity
+
+ return 0
+
+ qty_onhand = check_qty_per_inventory(self, line.product_id, line.location_id)
+ if line.qty_done > qty_onhand:
+ raise UserError('Quantity Done melebihi Quantity Onhand')
def button_validate(self):
+ if not self.env.user.is_logistic_approver and self.env.context.get('active_model') == 'stock.picking':
+ if self.origin and 'Return of' in self.origin:
+ raise UserError("Button ini hanya untuk Logistik")
+
+ if self.picking_type_code == 'internal':
+ self.check_qty_done_stock()
+
if self._name != 'stock.picking':
return super(StockPicking, self).button_validate()
@@ -483,10 +570,10 @@ class StockPicking(models.Model):
if self.location_dest_id.id == 47 and not self.env.user.is_purchasing_manager:
raise UserError("Transfer ke gudang selisih harus di approve Rafly Hanggara")
- if self.group_id.sale_id:
- if self.group_id.sale_id.payment_link_midtrans:
- if self.group_id.sale_id.payment_status != 'settlement':
- raise UserError('Uang belum masuk (settlement), mohon konfirmasi ke sales atau finance')
+ # if self.group_id.sale_id:
+ # if self.group_id.sale_id.payment_link_midtrans:
+ # if self.group_id.sale_id.payment_status != 'settlement' and self.group_id.sale_id.state == 'draft':
+ # raise UserError('Uang belum masuk (settlement), mohon konfirmasi ke sales atau finance')
if self.is_internal_use:
self.approval_status = 'approved'
@@ -506,12 +593,20 @@ class StockPicking(models.Model):
self.date_reserved = current_time
self.validation_minus_onhand_quantity()
-
+ self.responsible = self.env.user.id
res = super(StockPicking, self).button_validate()
self.calculate_line_no()
self.date_done = datetime.datetime.utcnow()
self.state_reserve = 'done'
return res
+ def action_cancel(self):
+ if not self.env.user.is_logistic_approver and self.env.context.get('active_model') == 'stock.picking':
+ if self.origin and 'Return of' in self.origin:
+ raise UserError("Button ini hanya untuk Logistik")
+
+ res = super(StockPicking, self).action_cancel()
+ return res
+
@api.model
def create(self, vals):
@@ -581,13 +676,13 @@ class StockPicking(models.Model):
manifest_datas = []
departure_date = self.driver_departure_date
- arrival_date = self.driver_arrival_date
+ arrival_date = self.sj_return_date if self.sj_return_date else self.driver_arrival_date
status = status_mapping.get(status_key)
if not status:
return manifest_datas
- if arrival_date:
+ if arrival_date or self.sj_return_date:
manifest_datas.append(self.create_manifest_data(status['arrival'], arrival_date))
if departure_date:
manifest_datas.append(self.create_manifest_data(status['departure'], departure_date))
@@ -614,7 +709,7 @@ class StockPicking(models.Model):
}
if not self.waybill_id or len(self.waybill_id.manifest_ids) == 0:
- response['delivered'] = self.driver_arrival_date != False
+ response['delivered'] = self.sj_return_date != False or self.driver_arrival_date != False
return response
response['delivery_order']['receiver_name'] = self.waybill_id.receiver_name
@@ -647,4 +742,4 @@ class StockPicking(models.Model):
formatted_fastest_eta = fastest_eta.strftime(format_time_fastest)
formatted_longest_eta = longest_eta.strftime(format_time)
- return f'{formatted_fastest_eta} - {formatted_longest_eta}'
+ return f'{formatted_fastest_eta} - {formatted_longest_eta}' \ No newline at end of file