diff options
Diffstat (limited to 'indoteknik_api/controllers/api_v1')
| -rw-r--r-- | indoteknik_api/controllers/api_v1/__init__.py | 2 | ||||
| -rw-r--r-- | indoteknik_api/controllers/api_v1/activity.py | 18 | ||||
| -rw-r--r-- | indoteknik_api/controllers/api_v1/product.py | 48 | ||||
| -rw-r--r-- | indoteknik_api/controllers/api_v1/sale_order.py | 143 | ||||
| -rw-r--r-- | indoteknik_api/controllers/api_v1/voucher.py | 22 |
5 files changed, 185 insertions, 48 deletions
diff --git a/indoteknik_api/controllers/api_v1/__init__.py b/indoteknik_api/controllers/api_v1/__init__.py index d05cdf3a..65bcf926 100644 --- a/indoteknik_api/controllers/api_v1/__init__.py +++ b/indoteknik_api/controllers/api_v1/__init__.py @@ -1,3 +1,4 @@ +from . import activity from . import banner from . import blog from . import cart @@ -24,3 +25,4 @@ from . import content from . import midtrans from . import wati from . import courier +from . import voucher
\ No newline at end of file diff --git a/indoteknik_api/controllers/api_v1/activity.py b/indoteknik_api/controllers/api_v1/activity.py new file mode 100644 index 00000000..142db845 --- /dev/null +++ b/indoteknik_api/controllers/api_v1/activity.py @@ -0,0 +1,18 @@ +from .. import controller +from odoo import http +from odoo.http import request + + +class Activity(controller.Controller): + @http.route('/api/v1/activity', auth='public', csrf=False, methods=['POST', 'OPTIONS']) + @controller.Controller.must_authorized() + def create_user_activity(self, **kw): + user_data = self.verify_user_token() + user_id = user_data['user_id'] if user_data else False + request.env['user.activity.log'].create({ + 'page_title': kw.get('page_title', ''), + 'url': kw.get('url', ''), + 'res_user_id': user_id, + 'ip_address': kw.get('ip_address', '') + }) + return self.response(True)
\ No newline at end of file diff --git a/indoteknik_api/controllers/api_v1/product.py b/indoteknik_api/controllers/api_v1/product.py index 54b039c7..8803bae3 100644 --- a/indoteknik_api/controllers/api_v1/product.py +++ b/indoteknik_api/controllers/api_v1/product.py @@ -4,6 +4,7 @@ from odoo.http import request from datetime import datetime, timedelta import ast import logging +import math _logger = logging.getLogger(__name__) @@ -11,6 +12,49 @@ _logger = logging.getLogger(__name__) class Product(controller.Controller): prefix = '/api/v1/' + @http.route(prefix + 'product_variant/<id>/stock', auth='public', methods=['GET', 'OPTIONS']) + @controller.Controller.must_authorized() + def get_product_template_stock_by_id(self, **kw): + id = int(kw.get('id')) + product = request.env['product.product'].search([('id', '=', id)], limit=1) + product_sla = request.env['product.sla'].search([('product_variant_id', '=', id)], limit=1) + + qty_available = product.qty_onhand_bandengan + qty_available -= 10 + if qty_available < 10: + qty_available = 0 + + qty = 0 + sla_date = '-' + + is_altama_product = product.x_manufacture.id in [10,122,89] + if is_altama_product: + try: + qty_altama = request.env['product.template'].get_stock_altama(product.default_code) + qty_altama -= int(qty_altama * 0.1) + qty_altama = math.ceil(float(qty_altama)) + qty = qty_altama + if qty_available > 10: + qty += qty_available + sla_date = '1 Hari' + elif qty_altama > 0: + sla_date = '2-4 Hari' + else: + sla_date = 'Indent' + except: + print('error') + else: + qty = qty_available + sla_date = product_sla.sla or '-' + + data = { + 'qty': qty, + 'sla_date': sla_date, + } + + return self.response(data, headers=[('Cache-Control', 'max-age=180, private')]) + + @http.route(prefix + 'product/template/price/<id>', auth='public', methods=['GET', 'OPTIONS']) def get_product_template_price_by_id(self, **kw): if not self.authenticate(): @@ -54,7 +98,7 @@ class Product(controller.Controller): if not self.authenticate(): return self.response(code=401, description='Unauthorized') id = kw.get('id') - partner_id = int(kw.get('partner_id', 0)) + partner_id = int(kw.get('partner_id', 0)) product_product = request.env['product.product'].search([('id', '=', id)], limit=1) data = { @@ -90,7 +134,7 @@ class Product(controller.Controller): # ('create_date', '>=', delta_time), ] new_products = request.env['product.template'].search(query_products, order='create_date desc', limit=limit_new_products) - brands = [] + brands = [] for product in new_products: brands.append(product.x_manufacture) brands = list(dict.fromkeys(brands)) diff --git a/indoteknik_api/controllers/api_v1/sale_order.py b/indoteknik_api/controllers/api_v1/sale_order.py index 406ab577..7c38d47d 100644 --- a/indoteknik_api/controllers/api_v1/sale_order.py +++ b/indoteknik_api/controllers/api_v1/sale_order.py @@ -58,25 +58,28 @@ class SaleOrder(controller.Controller): limit = params['value']['limit'] offset = params['value']['offset'] if not params['valid']: - return self.response(code=400, description=params) + 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")] + domain += ["|", ("state", "=", "sale"), ("state", "=", "done")] if params['value']['name']: name = params['value']['name'].replace(' ', '%') domain += [ '|', - ('name', 'ilike', '%'+ name +'%'), - ('partner_purchase_order_name', 'ilike', '%'+ name +'%') + ('name', 'ilike', '%' + name + '%'), + ('partner_purchase_order_name', 'ilike', '%' + name + '%') ] - sale_orders = request.env['sale.order'].search(domain, offset=offset, limit=limit) + sale_orders = request.env['sale.order'].search( + domain, offset=offset, limit=limit) 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] @@ -91,9 +94,10 @@ class SaleOrder(controller.Controller): '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']) + 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) @@ -101,8 +105,9 @@ class SaleOrder(controller.Controller): 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') - + data = request.env['sale.order'].api_v1_single_response( + sale_order, context='with_detail') + return self.response(data) @http.route(PREFIX_PARTNER + 'sale_order/<id>/checkout', auth='public', method=['POST', 'OPTIONS'], csrf=False) @@ -113,9 +118,10 @@ class SaleOrder(controller.Controller): 'id': ['number'] }) if not params['valid']: - return self.response(code=400, description=params) + 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 = [ ('id', '=', params['value']['id']), ('partner_id', 'in', partner_child_ids) @@ -124,13 +130,14 @@ class SaleOrder(controller.Controller): sale_order = request.env['sale.order'].search(domain) if sale_order: sale_order.approval_status = 'pengajuan1' - data = request.env['sale.order'].api_v1_single_response(sale_order, context='with_detail') + data = request.env['sale.order'].api_v1_single_response( + sale_order, context='with_detail') return self.response(data) @http.route(PREFIX_PARTNER + 'sale_order/<id>/upload_po', auth='public', method=['POST', 'OPTIONS'], csrf=False) def partner_upload_po_sale_order(self, **kw): - user_token = self.authenticate() + user_token = self.authenticate() if not user_token: return self.unauthorized_response() @@ -144,7 +151,8 @@ class SaleOrder(controller.Controller): return self.unauthorized_response() 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 = [ ('id', '=', params['value']['id']), ('partner_id', 'in', partner_child_ids) @@ -153,6 +161,7 @@ class SaleOrder(controller.Controller): sale_order = request.env['sale.order'].search(domain) if sale_order: sale_order.partner_purchase_order_name = params['value']['name'] + sale_order.client_order_ref = params['value']['name'] sale_order.partner_purchase_order_file = params['value']['file'] data = sale_order.id return self.response(data) @@ -165,9 +174,11 @@ class SaleOrder(controller.Controller): md5_valid = rest_api.md5_salt_valid(id, 'sale.order', token) if not md5_valid: return self.response('Unauthorized') - - sale_order = request.env['sale.order'].sudo().search_read([('id', '=', id)], ['partner_purchase_order_name']) - attachment = rest_api.get_single_attachment('sale.order', 'partner_purchase_order_file', id) + + sale_order = request.env['sale.order'].sudo().search_read( + [('id', '=', id)], ['partner_purchase_order_name']) + attachment = rest_api.get_single_attachment( + 'sale.order', 'partner_purchase_order_file', id) if attachment and len(sale_order) > 0: return rest_api.response_attachment({ 'content': attachment['datas'], @@ -185,9 +196,11 @@ class SaleOrder(controller.Controller): md5_valid = rest_api.md5_salt_valid(id, 'sale.order', token) if not md5_valid: return self.response('Unauthorized') - - sale_order = request.env['sale.order'].sudo().search_read([('id', '=', id)], ['name']) - pdf, type = request.env['ir.actions.report'].sudo().search([('report_name', '=', 'indoteknik_custom.report_saleorder_website')])._render_qweb_pdf([id]) + + sale_order = request.env['sale.order'].sudo( + ).search_read([('id', '=', id)], ['name']) + pdf, type = request.env['ir.actions.report'].sudo().search( + [('report_name', '=', 'indoteknik_custom.report_saleorder_website')])._render_qweb_pdf([id]) if pdf and len(sale_order) > 0: return rest_api.response_attachment({ 'content': pdf, @@ -204,9 +217,10 @@ class SaleOrder(controller.Controller): 'id': ['number'] }) if not params['valid']: - return self.response(code=400, description=params) + 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 = [ ('id', '=', params['value']['id']), ('partner_id', 'in', partner_child_ids) @@ -248,10 +262,14 @@ class SaleOrder(controller.Controller): @controller.Controller.must_authorized(private=True, private_key='partner_id') def create_partner_sale_order(self, **kw): config = request.env['ir.config_parameter'] - product_pricelist_default_discount_id = int(config.get_param('product.pricelist.default_discount_id')) - product_pricelist_tier1 = int(config.get_param('product.pricelist.tier1')) - product_pricelist_tier2 = int(config.get_param('product.pricelist.tier2')) - product_pricelist_tier3 = int(config.get_param('product.pricelist.tier3')) + product_pricelist_default_discount_id = int( + config.get_param('product.pricelist.default_discount_id')) + product_pricelist_tier1 = int( + config.get_param('product.pricelist.tier1')) + product_pricelist_tier2 = int( + config.get_param('product.pricelist.tier2')) + product_pricelist_tier3 = int( + config.get_param('product.pricelist.tier3')) params = self.get_request_params(kw, { 'partner_id': ['number'], @@ -263,16 +281,17 @@ class SaleOrder(controller.Controller): 'type': [], 'delivery_amount': ['number', 'default:0'], 'carrier_id': [], - 'delivery_service_type': [] + 'delivery_service_type': [], + 'voucher': [] }) - + if not params['valid']: return self.response(code=400, description=params) parameters = { 'warehouse_id': 8, 'carrier_id': 1, - 'sales_tax_id': 23, + 'sales_tax_id': 20, 'pricelist_id': product_pricelist_default_discount_id, 'payment_term_id': 26, 'team_id': 2, @@ -291,6 +310,8 @@ class SaleOrder(controller.Controller): 'shipping_paid_by': 'customer', 'carrier_id': params['value']['carrier_id'], 'delivery_service_type': params['value']['delivery_service_type'], + 'customer_type': 'nonpkp', + 'npwp': '0' } if params['value']['type'] == 'sale_order': parameters['approval_status'] = 'pengajuan1' @@ -298,10 +319,12 @@ class SaleOrder(controller.Controller): order_line = json.loads(params['value']['order_line']) parameters = [] - partner = request.env['res.partner'].browse(params['value']['partner_id']) + partner = request.env['res.partner'].browse( + params['value']['partner_id']) partner_pricelist = partner.property_product_pricelist for line in order_line: - product = request.env['product.product'].search([('id', '=', line['product_id'])], limit=1) + product = request.env['product.product'].search( + [('id', '=', line['product_id'])], limit=1) discount = product._get_website_disc(0) price_tier = False @@ -311,15 +334,19 @@ class SaleOrder(controller.Controller): 'tier3': product._get_pricelist_tier3, } partner_pricelist_id = partner_pricelist.id if partner_pricelist else False - if partner_pricelist_id == product_pricelist_tier1: price_tier = 'tier1' - if partner_pricelist_id == product_pricelist_tier2: price_tier = 'tier2' - if partner_pricelist_id == product_pricelist_tier3: price_tier = 'tier3' + if partner_pricelist_id == product_pricelist_tier1: + price_tier = 'tier1' + if partner_pricelist_id == product_pricelist_tier2: + price_tier = 'tier2' + if partner_pricelist_id == product_pricelist_tier3: + price_tier = 'tier3' if price_tier: price = pricelist[price_tier]() discount_key = 'discount_%s' % price_tier - if price[discount_key] > 0: discount = price[discount_key] - + if price[discount_key] > 0: + discount = price[discount_key] + flashsale = product._get_flashsale_price() flashsale_discount = flashsale['flashsale_discount'] if flashsale_discount > 0 and flashsale_discount > discount: @@ -333,13 +360,32 @@ class SaleOrder(controller.Controller): 'price_unit': product._get_website_price_exclude_tax(), 'discount': discount }) - + request.env['sale.order.line'].create(parameters) + + amount_untaxed = sale_order.amount_untaxed + voucher = request.env['voucher'].search([ + ('code', '=', params['value']['voucher']) + ]) + if voucher: + voucher_discount = voucher.calculate_discount(amount_untaxed) + sale_order.voucher_id = voucher.id + sale_order.amount_voucher_disc = voucher_discount + + total_qty = sum(line.product_uom_qty for line in sale_order.order_line) + voucher_discount_item = voucher_discount / total_qty + for line in sale_order.order_line: + discount_decimal = line.discount / 100 + voucher_discount_line = voucher_discount_item / (1 - discount_decimal) + price = line.price_unit - voucher_discount_line + line.price_unit = price + line.amount_voucher_disc = voucher_discount_item * line.product_uom_qty + return self.response({ 'id': sale_order.id, 'name': sale_order.name }) - + @http.route('/api/sale_order/invoiced', auth='public', methods=['GET']) def get_sale_order_invoiced_by_partner_id(self, **kw): if not self.authenticate(): @@ -351,8 +397,10 @@ class SaleOrder(controller.Controller): 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))]) + 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] # Get sale order by company member and invoiced @@ -401,9 +449,12 @@ class SaleOrder(controller.Controller): ('id', '=', id), ('state', 'in', ['sale', 'done']) ] - 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)] + 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_filter('sale.order', kw, default_domain) diff --git a/indoteknik_api/controllers/api_v1/voucher.py b/indoteknik_api/controllers/api_v1/voucher.py new file mode 100644 index 00000000..0990a1a0 --- /dev/null +++ b/indoteknik_api/controllers/api_v1/voucher.py @@ -0,0 +1,22 @@ +from .. import controller +from odoo import http +from odoo.http import request + +class Voucher(controller.Controller): + prefix = '/api/v1/' + + @http.route(prefix + 'voucher', auth='public', methods=['GET', 'OPTIONS']) + @controller.Controller.must_authorized() + def get_vouchers(self, **kw): + code = kw.get('code') + visibility = 'public' + + parameter = [] + if code: + visibility = 'private' + parameter += [('code', '=', code)] + + parameter += [('visibility', '=', visibility)] + vouchers = request.env['voucher'].get_active_voucher(parameter) + data = vouchers.res_format() + return self.response(data) |
