diff options
| author | Miqdad <ahmadmiqdad27@gmail.com> | 2025-08-27 13:11:17 +0700 |
|---|---|---|
| committer | Miqdad <ahmadmiqdad27@gmail.com> | 2025-08-27 13:11:17 +0700 |
| commit | 3286de7f2d48f913ad1aa477b49155047ebb742c (patch) | |
| tree | 67e4f54c8c449230d587e35793110c3b0f43ec5f /indoteknik_api | |
| parent | d412ba89e0afba1965216aff871647115577cf75 (diff) | |
<Miqdad> Regenerate midtrans via website
Diffstat (limited to 'indoteknik_api')
| -rw-r--r-- | indoteknik_api/controllers/api_v1/sale_order.py | 128 |
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') |
