summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--indoteknik_custom/controllers/api/product.py96
-rw-r--r--indoteknik_custom/controllers/api/sale_order.py195
-rw-r--r--indoteknik_custom/controllers/api_controller.py29
3 files changed, 199 insertions, 121 deletions
diff --git a/indoteknik_custom/controllers/api/product.py b/indoteknik_custom/controllers/api/product.py
index 5c5a6c1a..0cd02e90 100644
--- a/indoteknik_custom/controllers/api/product.py
+++ b/indoteknik_custom/controllers/api/product.py
@@ -1,27 +1,95 @@
+import base64
+
from .. import api_controller
from odoo import http
from odoo.http import request
-import json
class ProductApi(api_controller.ApiController):
@http.route('/api/product/search', auth='public', methods=['GET'])
def search_product(self, **kw):
self.authenticate(kw)
- limit = kw.get('limit', 0)
- offset = kw.get('offset', 0)
- order = kw.get('order', '')
- domain = kw.get('domain', [])
- if domain:
- domain = json.loads(domain)
+ query = kw.get('query')
+ if not query:
+ return self.response(code=400, description='Field query is required')
+
+ query = '%' + query.replace(' ', '%') + '%'
+ domain = [
+ ('sale_ok', '=', True),
+ '|',
+ ('default_code', 'ilike', query),
+ ('name', 'ilike', query)
+ ]
+
+ manufactures = kw.get('manufactures')
+ if manufactures:
+ manufactures = [int(x) for x in manufactures.split(',')]
+ domain.append(('x_manufacture', 'in', manufactures))
+
+ categories = kw.get('categories')
+ if categories:
+ categories = [int(x) for x in categories.split(',')]
+ domain.append(('public_categ_ids', 'child_of', categories))
product_variants = request.env['product.product'].search(domain)
product_variant_ids = [v['id'] for v in product_variants]
- domain = [('product_variant_ids', 'in', product_variant_ids)]
- products = request.env['product.template'].search(domain, limit=int(limit), offset=int(offset), order=order)
- response = []
- for product in products:
- response.append({
- 'name': product.name
+
+ base_url = request.env['ir.config_parameter'].sudo().get_param('web.base.url')
+ domain = [
+ ('product_variant_ids', 'in', product_variant_ids)
+ ]
+ product_templates = self.search_with_api_params('product.template', kw, domain)
+ data = {
+ 'total_records': len(request.env['product.template'].search(domain)),
+ 'products': []
+ }
+ for product_template in product_templates:
+ stock = 0
+ for product_variant in product_template.product_variant_ids:
+ stock += product_variant.qty_stock_vendor
+
+ discount_price = 0
+ price = product_template.web_price
+ if price > 0:
+ if product_template.taxes_id:
+ if not product_template.taxes_id.price_include:
+ price += (price * product_template.taxes_id.amount / 100)
+ else:
+ price += (price * 11 / 100)
+
+ promotion = {}
+ manufacture = {}
+ if product_template.x_manufacture:
+ manufacture.update({
+ 'id': product_template.x_manufacture.id,
+ 'name': product_template.x_manufacture.x_name,
+ })
+ domain = [
+ ('rule_products_domain', 'ilike', product_template.x_manufacture.x_name),
+ ('active', '=', True)
+ ]
+ coupon_program = request.env['coupon.program'].search(domain, limit=1)
+ if coupon_program:
+ discount_price = price - (price * coupon_program.discount_percentage / 100)
+ icon_1 = (base_url + 'api/image/coupon.program/x_studio_field_Ifopn/' + str(coupon_program.id)) if coupon_program.x_studio_field_Ifopn else ''
+ icon_2 = (base_url + 'api/image/coupon.program/x_studio_field_2Ul77/' + str(coupon_program.id)) if coupon_program.x_studio_field_2Ul77 else ''
+ promotion.update({
+ 'name': coupon_program.name,
+ 'discount_percentage': coupon_program.discount_percentage,
+ 'icon_1': icon_1,
+ 'icon_2': icon_2
+ })
+
+ data['products'].append({
+ 'id': product_template.id,
+ 'image': base_url + 'api/image/product.template/image_128/' + str(product_template.id),
+ 'name': product_template.name,
+ 'price': price,
+ 'discount_price': discount_price,
+ 'total_variant': len(product_template.product_variant_ids),
+ 'stock': stock,
+ 'manufacture': manufacture,
+ 'promotion': promotion,
})
- return json.dumps(response)
+
+ return self.response(data)
diff --git a/indoteknik_custom/controllers/api/sale_order.py b/indoteknik_custom/controllers/api/sale_order.py
index 4194bcb6..c00a94d3 100644
--- a/indoteknik_custom/controllers/api/sale_order.py
+++ b/indoteknik_custom/controllers/api/sale_order.py
@@ -1,119 +1,110 @@
from .. import api_controller
from odoo import http
from odoo.http import request
-import json
class SaleOrderApi(api_controller.ApiController):
@http.route('/api/sale_order/invoiced', auth='public', methods=['GET'])
- def get_sale_order_invoiced_by_partner_id(self, partner_id=None, **kw):
+ def get_sale_order_invoiced_by_partner_id(self, **kw):
self.authenticate(kw)
- response = []
- if partner_id:
- # Get company member by partner_id
- parent_partner_id = request.env['res.partner'].search([('id', '=', int(partner_id))], limit=1).parent_id.id
- partner_childs = request.env['res.partner'].search([('parent_id', '=', int(parent_partner_id))])
- partner_child_ids = [v['id'] for v in partner_childs] + [int(partner_id)]
+ partner_id = kw.get('partner_id')
+ if not partner_id:
+ return self.response(code=400, description='Field partner_id is required')
- # Get sale order by company member and invoiced
- default_domain = [
- ('partner_id', 'in', partner_child_ids),
- '|',
- ('invoice_status', '=', 'invoiced'),
- ('invoice_status', '=', 'to_invoice')
- ]
- sale_orders = self.search_with_api_params('sale.order', kw, default_domain)
- for sale_order in sale_orders:
- pickings = []
- for picking in sale_order.picking_ids:
- if picking.state in ['confirmed', 'assigned', 'done']:
- pickings.append({
- 'id': picking.id,
- 'name': picking.name,
- 'delivery_address': picking.partner_id.street,
- 'delivery_tracking_no': picking.delivery_tracking_no,
- 'delivery_status': picking.delivery_status
- })
+ partner_id = int(partner_id)
+ # Get company member by partner_id
+ parent_partner_id = request.env['res.partner'].search([('id', '=', partner_id)], limit=1).parent_id.id
+ partner_childs = request.env['res.partner'].search([('parent_id', '=', int(parent_partner_id))])
+ partner_child_ids = [v['id'] for v in partner_childs] + [partner_id]
- response.append({
- 'id': sale_order.id,
- 'name': sale_order.name,
- 'amount_total': sale_order.amount_total,
- 'salesperson': sale_order.user_id.name,
- 'date_order': self.time_to_str(sale_order.date_order, '%d/%m/%Y'),
- 'pickings': pickings,
- 'access_token': sale_order.access_token
- })
- return json.dumps(response)
+ # Get sale order by company member and invoiced
+ data = []
+ default_domain = [
+ ('partner_id', 'in', partner_child_ids),
+ '|',
+ ('invoice_status', '=', 'invoiced'),
+ ('invoice_status', '=', 'to_invoice')
+ ]
+ sale_orders = self.search_with_api_params('sale.order', kw, default_domain)
+ for sale_order in sale_orders:
+ pickings = []
+ for picking in sale_order.picking_ids:
+ if picking.state in ['confirmed', 'assigned', 'done']:
+ pickings.append({
+ 'id': picking.id,
+ 'name': picking.name,
+ 'delivery_address': picking.partner_id.street,
+ 'delivery_tracking_no': picking.delivery_tracking_no,
+ 'delivery_status': picking.delivery_status
+ })
- # @http.route('/api/test', auth='public', methods=['GET'])
- # def test(self, **kw):
- # self.authenticate(kw)
- # response = []
- # products = self.search_with_api_params('product.template', kw)
- # for product in products:
- # response.append({
- # 'id': product.id,
- # 'name': product.name
- # })
- # return json.dumps(response)
+ data.append({
+ 'id': sale_order.id,
+ 'name': sale_order.name,
+ 'amount_total': sale_order.amount_total,
+ 'salesperson': sale_order.user_id.name,
+ 'date_order': self.time_to_str(sale_order.date_order, '%d/%m/%Y'),
+ 'pickings': pickings,
+ 'access_token': sale_order.access_token
+ })
+ return self.response(data)
@http.route('/api/sale_order/invoiced/detail', auth='public', methods=['GET'])
- def get_sale_order_invoiced_detail(self, id=None, partner_id=None, **kw):
+ def get_sale_order_invoiced_detail_by_partner(self, **kw):
self.authenticate(kw)
- response = {}
- if id:
- default_domain = [
- ('id', '=', id),
- '|',
- ('invoice_status', '=', 'invoiced'),
- ('invoice_status', '=', 'to_invoice')
- ]
- if partner_id:
- # Get company member by partner_id
- parent_partner_id = request.env['res.partner'].search([('id', '=', int(partner_id))], limit=1).parent_id.id
- partner_childs = request.env['res.partner'].search([('parent_id', '=', int(parent_partner_id))])
- partner_child_ids = [v['id'] for v in partner_childs] + [int(partner_id)]
- default_domain.append(('partner_id', 'in', partner_child_ids))
- sale_order = self.search_with_api_params('sale.order', kw, default_domain)
- if sale_order:
- orders = []
- for order in sale_order.order_line:
- orders.append({
- 'name': order.name,
- 'product_qty': order.product_qty,
- 'price_unit': order.price_unit,
- 'price_tax': order.price_tax,
- 'price_total': order.price_total,
- 'price_subtotal': order.price_subtotal,
- 'tax': order.tax_id.name,
- 'discount': order.discount,
- })
+ id = kw.get('id')
+ partner_id = kw.get('partner_id')
+ if not id:
+ return self.response(code=400, description='Field id is required')
+ if not partner_id:
+ return self.response(code=400, description='Field partner_id is required')
+
+ default_domain = [
+ ('id', '=', id),
+ '|',
+ ('invoice_status', '=', 'invoiced'),
+ ('invoice_status', '=', 'to_invoice')
+ ]
+ parent_partner_id = request.env['res.partner'].search([('id', '=', int(partner_id))], limit=1).parent_id.id
+ partner_childs = request.env['res.partner'].search([('parent_id', '=', int(parent_partner_id))])
+ partner_child_ids = [v['id'] for v in partner_childs] + [int(partner_id)]
+ default_domain.append(('partner_id', 'in', partner_child_ids))
+
+ sale_order = self.search_with_api_params('sale.order', kw, default_domain)
+ orders = []
+ for order in sale_order.order_line:
+ orders.append({
+ 'name': order.name,
+ 'product_qty': order.product_qty,
+ 'price_unit': order.price_unit,
+ 'price_tax': order.price_tax,
+ 'price_total': order.price_total,
+ 'price_subtotal': order.price_subtotal,
+ 'tax': order.tax_id.name,
+ 'discount': order.discount,
+ })
- response.update({
- 'id': sale_order.id,
- 'name': sale_order.name,
- 'carrier': sale_order.carrier_id.name,
- 'partner': {
- 'id': sale_order.partner_id.id,
- 'name': sale_order.partner_id.name,
- 'mobile': sale_order.partner_id.mobile,
- 'email': sale_order.partner_id.email
- },
- 'delivery_address': sale_order.partner_shipping_id.street,
- 'delivery_method': sale_order.carrier_id.name,
- 'payment_term': sale_order.payment_term_id.name,
- 'salesperson': sale_order.user_id.name,
- 'date_order': self.time_to_str(sale_order.date_order, '%d/%m/%Y %H:%M:%S'),
- 'note': sale_order.note,
- 'amount_untaxed': sale_order.amount_untaxed,
- 'amount_tax': sale_order.amount_tax,
- 'amount_total': sale_order.amount_total,
- 'orders': orders
- })
- return json.dumps(response)
+ data = {
+ 'id': sale_order.id,
+ 'name': sale_order.name,
+ 'carrier': sale_order.carrier_id.name,
+ 'partner': {
+ 'id': sale_order.partner_id.id,
+ 'name': sale_order.partner_id.name,
+ 'mobile': sale_order.partner_id.mobile,
+ 'email': sale_order.partner_id.email
+ },
+ 'delivery_address': sale_order.partner_shipping_id.street,
+ 'delivery_method': sale_order.carrier_id.name,
+ 'payment_term': sale_order.payment_term_id.name,
+ 'salesperson': sale_order.user_id.name,
+ 'date_order': self.time_to_str(sale_order.date_order, '%d/%m/%Y %H:%M:%S'),
+ 'note': sale_order.note,
+ 'amount_untaxed': sale_order.amount_untaxed,
+ 'amount_tax': sale_order.amount_tax,
+ 'amount_total': sale_order.amount_total,
+ 'orders': orders
+ }
- @http.route('/api/sale_order', auth='public', methods=['POST'], csrf=False)
- def post_sale_order(self, **kw):
- return json.dumps(['a'])
+ return self.response(data)
diff --git a/indoteknik_custom/controllers/api_controller.py b/indoteknik_custom/controllers/api_controller.py
index cb5fae60..faf8b640 100644
--- a/indoteknik_custom/controllers/api_controller.py
+++ b/indoteknik_custom/controllers/api_controller.py
@@ -1,4 +1,5 @@
import datetime
+import base64
from odoo import http
from odoo.http import request
@@ -19,14 +20,32 @@ class ApiController(http.Controller):
time = object.astimezone(timezone('Asia/Jakarta')).strftime(format)
return time
+ def response(self, data=[], code=200, description='OK'):
+ response = {
+ 'status': {
+ 'code': code,
+ 'description': description
+ }
+ }
+ if code == 200:
+ response.update({'result': data})
- def search_with_api_params(self, model: str, kw, default_domain=[]):
+ response = json.dumps(response)
+ return request.make_response(response, [('Content-Type', 'application/json')])
+
+ def search_with_api_params(self, model: str, kw, domain=[]):
limit = kw.get('limit', 0)
offset = kw.get('offset', 0)
order = kw.get('order', '')
- domain = kw.get('domain', [])
- if domain:
- domain = json.loads(domain)
- domain += default_domain
+ # domain = kw.get('domain', [])
+ # if domain:
+ # domain = json.loads(domain)
+ # domain += default_domain
return request.env[model].search(domain, limit=int(limit), offset=int(offset), order=order)
+
+ @http.route('/api/image/<model>/<field>/<id>', auth='public', methods=['GET'])
+ def get_image(self, model, field, id):
+ model = request.env[model].sudo().search([('id', '=', id)], limit=1)
+ image = model[field] if model[field] else ''
+ return request.make_response(base64.b64decode(image), [('Content-Type', 'image/jpg')])