summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--indoteknik_api/controllers/api_v1/sale_order.py128
1 files changed, 49 insertions, 79 deletions
diff --git a/indoteknik_api/controllers/api_v1/sale_order.py b/indoteknik_api/controllers/api_v1/sale_order.py
index 374b49a2..d4038a64 100644
--- a/indoteknik_api/controllers/api_v1/sale_order.py
+++ b/indoteknik_api/controllers/api_v1/sale_order.py
@@ -116,14 +116,12 @@ class SaleOrder(controller.Controller):
if not params['valid']:
return self.response(code=400, description=params)
- partner_child_ids = self.get_partner_child_ids(
- params['value']['partner_id'])
+ partner_child_ids = self.get_partner_child_ids(params['value']['partner_id'])
domain = [('partner_id', 'in', partner_child_ids)]
context = params['value']['context']
if context == 'quotation':
- domain += ["|", "|", ("state", "=", "draft"),
- ("state", "=", "sent"), ("state", "=", "cancel")]
+ domain += ["|", "|", ("state", "=", "draft"), ("state", "=", "sent"), ("state", "=", "cancel")]
if not context:
domain += ["|", ("state", "=", "sale"), ("state", "=", "done")]
@@ -135,39 +133,28 @@ class SaleOrder(controller.Controller):
('product_id.name', 'ilike', name),
('product_id.default_code', 'ilike', name),
])
-
sale_order_ids_from_lines = order_lines.mapped('order_id.id')
-
domain += ['|', '|',
('name', 'ilike', name),
('partner_purchase_order_name', 'ilike', name),
('id', 'in', sale_order_ids_from_lines)
]
-
+
if params['value']['site']:
site = params['value']['site'].replace(' ', '%')
- domain += [
- ('partner_id.site_id.name', 'ilike', '%' + site + '%')
- ]
+ domain += [('partner_id.site_id.name', 'ilike', '%' + site + '%')]
status = params['value'].get('status')
if status:
if status == 'quotation':
domain += [('state', '=', 'draft')]
domain += [('approval_status', '=', False)]
-
elif status == 'cancel':
domain += [('state', '=', 'cancel')]
-
elif status == 'diproses':
- domain += [
- ('state', '=', 'draft'),
- ('approval_status', 'in', ['pengajuan1', 'pengajuan2']),
- ]
-
+ domain += [('state', '=', 'draft'), ('approval_status', 'in', ['pengajuan1', 'pengajuan2'])]
elif status in ['dikemas', 'dikirim', 'selesai', 'partial']:
domain += [('state', '=', 'sale')]
-
elif status == 'all':
domain += []
@@ -179,7 +166,7 @@ class SaleOrder(controller.Controller):
elif params['value']['sort'] == 'desc':
order = 'amount_total desc'
- # Filter berdasarkan tanggal order
+ # Filter tanggal
try:
if params['value']['startDate'] and params['value']['endDate']:
start_date = datetime.strptime(params['value']['startDate'], '%d/%m/%Y').strftime('%Y-%m-%d 00:00:00')
@@ -190,22 +177,17 @@ class SaleOrder(controller.Controller):
domain.append(('date_order', '>=', start_date))
domain.append(('date_order', '<=', end_date))
-
except ValueError:
return self.response(code=400, description="Invalid date format. Use 'DD/MM/YYYY'.")
+ sale_orders = request.env['sale.order'].search(domain, order=order)
-
- sale_orders = request.env['sale.order'].search(
- domain, order=order)
+ # Filter status pengiriman (tetap sama)
status = params['value'].get('status')
if status in ['dikemas', 'dikirim', 'selesai', 'partial']:
filtered_orders = []
for sale_order in sale_orders:
- bu_pickings = [
- p for p in sale_order.picking_ids
- if p.picking_type_id and p.picking_type_id.id == 29
- ]
+ bu_pickings = [p for p in sale_order.picking_ids if p.picking_type_id and p.picking_type_id.id == 29]
total = len(bu_pickings)
done_pickings = [p for p in bu_pickings if p.state == 'done']
done_with_driver = [p for p in done_pickings if p.sj_return_date]
@@ -217,69 +199,57 @@ class SaleOrder(controller.Controller):
filtered_orders.append(sale_order)
elif status == 'selesai' and len(done_pickings) == total and len(done_pickings) > 0 and len(done_with_driver) == total:
filtered_orders.append(sale_order)
- elif status == 'partial' and (
- len(done_pickings) != total or
- (done_with_driver and done_without_driver)
- ):
+ elif status == 'partial' and (len(done_pickings) != total or (done_with_driver and done_without_driver)):
filtered_orders.append(sale_order)
else:
filtered_orders = sale_orders
filtered_orders_paginated = filtered_orders[offset: offset + limit]
+ # === Tambahan: payment summary per SO ===
+ CBD_PAYMENT_TERM_ID = 26
+ ALLOWED_UNSETTLED = {'', 'expire', 'pending', 'challenge', 'cancel'} # belum settlement
+ def _is_website_order(so):
+ # Sesuaikan kalau perlu spesifik id
+ # return bool(so.source_id and so.source_id.id == 59)
+ name = (so.source_id and so.source_id.name or '').lower()
+ return 'web' in name or 'site' in name or bool(so.source_id)
+
+ sale_orders_payload = []
+ for so in filtered_orders_paginated:
+ item = request.env['sale.order'].api_v1_single_response(so)
+
+ so_state = so.state or ''
+ pay_term_id = so.payment_term_id.id if so.payment_term_id else None
+ pay_status = (getattr(so, 'payment_status', '') or '').strip().lower()
+ from_web = _is_website_order(so)
+
+ is_quotation = so_state in ('draft', 'sent')
+ is_cbd = (pay_term_id == CBD_PAYMENT_TERM_ID)
+ ok_status = (pay_status in ALLOWED_UNSETTLED)
+
+ eligible = bool(is_quotation and is_cbd and ok_status and from_web)
+
+ # tambahkan field baru (camelCase biar enak dipakai di Next)
+ item.update({
+ 'eligibleContinue': eligible,
+ 'paymentSummary': {
+ 'eligible': eligible,
+ 'soState': so_state,
+ 'paymentTermId': pay_term_id,
+ 'paymentStatus': pay_status,
+ 'sourceId': so.source_id.id if so.source_id else None,
+ 'redirectUrl': getattr(so, 'payment_link_midtrans', '') or '',
+ }
+ })
+ sale_orders_payload.append(item)
+
data = {
'sale_order_total': len(filtered_orders),
- 'sale_orders': [request.env['sale.order'].api_v1_single_response(x) for x in filtered_orders_paginated]
+ 'sale_orders': sale_orders_payload
}
-
return self.response(data)
- @http.route(PREFIX_PARTNER + 'sale_order/<id>', auth='public', method=['GET', 'OPTIONS'])
- @controller.Controller.must_authorized()
- def partner_get_sale_order_detail(self, **kw):
- params = self.get_request_params(kw, {
- 'partner_id': ['number'],
- 'id': ['number'],
- })
- if not params['valid']:
- return self.response(code=400, description=params)
-
- partner_child_ids = self.get_partner_child_ids(params['value']['partner_id'])
- domain = [('id', '=', params['value']['id']), ('partner_id', 'in', partner_child_ids)]
- data = {}
- sale_order = request.env['sale.order'].search(domain)
- if sale_order:
- data = request.env['sale.order'].api_v1_single_response(sale_order, context='with_detail')
- if sale_order.expected_ready_to_ship:
- bulan_id = [
- "Januari", "Februari", "Maret", "April", "Mei", "Juni",
- "Juli", "Agustus", "September", "Oktober", "November", "Desember"
- ]
- tanggal = sale_order.expected_ready_to_ship.day
- bulan = bulan_id[sale_order.expected_ready_to_ship.month - 1]
- tahun = sale_order.expected_ready_to_ship.year
- data['expected_ready_to_ship'] = f"{tanggal} {bulan} {tahun}"
- if sale_order.eta_date_start:
- bulan_id = [
- "Januari", "Februari", "Maret", "April", "Mei", "Juni",
- "Juli", "Agustus", "September", "Oktober", "November", "Desember"
- ]
- tanggal = sale_order.eta_date_start.day
- bulan = bulan_id[sale_order.eta_date_start.month - 1]
- tahun = sale_order.eta_date_start.year
- data['eta_date_start'] = f"{tanggal} {bulan} {tahun}"
-
- if sale_order.eta_date:
- bulan_id = [
- "Januari", "Februari", "Maret", "April", "Mei", "Juni",
- "Juli", "Agustus", "September", "Oktober", "November", "Desember"
- ]
- tanggal = sale_order.eta_date.day
- bulan = bulan_id[sale_order.eta_date.month - 1]
- tahun = sale_order.eta_date.year
- data['eta_date_end'] = f"{tanggal} {bulan} {tahun}"
-
- return self.response(data)
@http.route(PREFIX_PARTNER + 'sale_order/<id>/checkout', auth='public', method=['POST', 'OPTIONS'], csrf=False)
@controller.Controller.must_authorized(private=True, private_key='partner_id')