summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--indoteknik_api/controllers/api_v1/sale_order.py65
-rw-r--r--indoteknik_api/models/sale_order.py19
2 files changed, 81 insertions, 3 deletions
diff --git a/indoteknik_api/controllers/api_v1/sale_order.py b/indoteknik_api/controllers/api_v1/sale_order.py
index e1c643e5..3ecaff57 100644
--- a/indoteknik_api/controllers/api_v1/sale_order.py
+++ b/indoteknik_api/controllers/api_v1/sale_order.py
@@ -100,7 +100,11 @@ class SaleOrder(controller.Controller):
'site': [],
'limit': ['default:0', 'number'],
'offset': ['default:0', 'number'],
- 'context': []
+ 'context': [],
+ 'status': [],
+ 'sort': [],
+ 'startDate': [],
+ 'endDate': [],
})
limit = params['value']['limit']
offset = params['value']['offset']
@@ -132,8 +136,63 @@ class SaleOrder(controller.Controller):
('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 == 'diterima':
+ domain += [
+ ('state', '=', 'draft'),
+ ('approval_status', 'in', ['pengajuan1', 'pengajuan2']),
+ ]
+
+ elif status == 'dikirim':
+ domain += [
+ ('state', '=', 'sale'),
+ ('picking_ids.state', 'in', ['done'])
+ ]
+
+ elif status == 'diproses':
+ domain += [
+ ('state', '=', 'sale'),
+ ('picking_ids.state', 'in', ['draft', 'waiting', 'confirmed', 'assigned'])
+ ]
+
+ elif status == 'selesai':
+ domain += [('state', '=', 'done')]
+
+ elif status == 'all':
+ domain += []
+
+ # Sorting
+ order = None
+ if params['value']['sort']:
+ if params['value']['sort'] == 'asc':
+ order = 'amount_total asc'
+ elif params['value']['sort'] == 'desc':
+ order = 'amount_total desc'
+
+ # Filter berdasarkan tanggal order
+ if params['value']['startDate'] and params['value']['endDate']:
+ try:
+ start_date = datetime.strptime(params['value']['startDate'], '%d/%m/%Y').strftime('%Y-%m-%d 00:00:00')
+ end_date = datetime.strptime(params['value']['endDate'], '%d/%m/%Y').strftime('%Y-%m-%d 23:59:59')
+
+ 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, offset=offset, limit=limit)
+ domain, offset=offset, limit=limit, order=order)
+
data = {
'sale_order_total': request.env['sale.order'].search_count(domain),
'sale_orders': [request.env['sale.order'].api_v1_single_response(x) for x in sale_orders]
@@ -146,7 +205,7 @@ class SaleOrder(controller.Controller):
def partner_get_sale_order_detail(self, **kw):
params = self.get_request_params(kw, {
'partner_id': ['number'],
- 'id': ['number']
+ 'id': ['number'],
})
if not params['valid']:
return self.response(code=400, description=params)
diff --git a/indoteknik_api/models/sale_order.py b/indoteknik_api/models/sale_order.py
index 45461974..5427ed07 100644
--- a/indoteknik_api/models/sale_order.py
+++ b/indoteknik_api/models/sale_order.py
@@ -20,12 +20,14 @@ class SaleOrder(models.Model):
'amount_untaxed': sale_order.amount_untaxed,
'amount_tax': sale_order.amount_tax,
'amount_total': sale_order.grand_total,
+ 'amount_discount': sale_order.amount_voucher_shipping_disc,
'purchase_order_name': sale_order.partner_purchase_order_name or sale_order.client_order_ref,
'purchase_order_file': True if sale_order.partner_purchase_order_file else False,
'invoice_count': sale_order.invoice_count,
'status': 'draft',
'approval_step': APPROVAL_STEP[sale_order.web_approval] if sale_order.web_approval else 0,
'date_order': self.env['rest.api'].datetime_to_str(sale_order.date_order, '%d/%m/%Y %H:%M:%S'),
+ 'payment_type': sale_order.payment_type,
'pickings': []
}
for picking in sale_order.picking_ids:
@@ -116,11 +118,28 @@ class SaleOrder(models.Model):
data.update(data_with_detail)
else:
data_with_detail = {
+ 'products': [],
'address': {
'customer': res_users.api_address_response(sale_order.partner_id),
}
}
data.update(data_with_detail)
+ for line in sale_order.order_line:
+ product = self.env['product.product'].api_single_response(line.product_id)
+ product['price'] = {
+ 'price': line.price_unit,
+ 'discount_percentage': line.discount,
+ 'price_discount': line.price_reduce_taxexcl,
+ 'subtotal': line.price_subtotal
+ }
+ product['quantity'] = line.product_uom_qty
+ product['available_quantity'] = line.product_available_quantity
+ for data_v2 in sale_order.fulfillment_line_v2:
+ product_v2 = self.env['product.product'].api_single_response(data_v2.product_id)
+ if product['id'] == product_v2['id']:
+ product['so_qty'] = data_v2.so_qty
+ product['reserved_stock_qty'] = data_v2.reserved_stock_qty
+ data_with_detail['products'].append(product)
return data