summaryrefslogtreecommitdiff
path: root/indoteknik_api/controllers/api_v1
diff options
context:
space:
mode:
authorstephanchrst <stephanchrst@gmail.com>2023-03-24 15:48:24 +0700
committerstephanchrst <stephanchrst@gmail.com>2023-03-24 15:48:24 +0700
commita9fd6502729bbd337c0ba762d2cc88fcd8f60900 (patch)
tree21cf933c6d1c4a810a10bbc34a3f58eaf950335e /indoteknik_api/controllers/api_v1
parent3aa64db9c10d0fcb8009e9e6f942672a12669099 (diff)
rest api for website pricelist
Diffstat (limited to 'indoteknik_api/controllers/api_v1')
-rw-r--r--indoteknik_api/controllers/api_v1/product.py110
1 files changed, 110 insertions, 0 deletions
diff --git a/indoteknik_api/controllers/api_v1/product.py b/indoteknik_api/controllers/api_v1/product.py
index dc941f13..22030eab 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,115 @@ _logger = logging.getLogger(__name__)
class Product(controller.Controller):
prefix = '/api/v1/'
+ @http.route(prefix + 'product/template/price/<id>', auth='public', methods=['GET'])
+ def get_product_template_price_by_id(self, **kw):
+ if not self.authenticate():
+ return self.response(code=401, description='Unauthorized')
+ id = kw.get('id')
+ partner_id = int(kw.get('partner_id', 0))
+ product_template = request.env['product.template'].search([('id', '=', id)], limit=1)
+
+ data = self.get_product_price_for_website(product_template.product_variant_id.id, partner_id)
+ data = {
+ 'price_include': product_template.product_variant_id._get_website_price_include_tax(),
+ 'price_exclude': product_template.product_variant_id._get_website_price_exclude_tax(),
+ 'discount': product_template.product_variant_id._get_website_disc(partner_id),
+ 'price_include_after_discount': product_template.product_variant_id._get_website_price_after_disc(),
+ 'price_exclude_after_discount': product_template.product_variant_id._get_website_price_after_disc_and_tax(),
+ 'tax': product_template.product_variant_id._get_website_tax(),
+ }
+
+ if product_template.product_variant_count > 1:
+ price_excl_after_disc = price_excl = 0
+ for variant in product_template.product_variant_ids:
+ if price_excl_after_disc == 0:
+ price_excl = variant._get_website_price_exclude_tax()
+ price_excl_after_disc = variant._get_website_price_after_disc_and_tax()
+ elif variant._get_website_price_after_disc_and_tax() < price_excl_after_disc:
+ price_excl_after_disc = variant._get_website_price_after_disc_and_tax()
+ price_excl = variant._get_website_price_exclude_tax()
+ else:
+ price_excl_after_disc = price_excl_after_disc
+ price_excl = price_excl
+
+ start_from = {
+ 'price_start_from': price_excl,
+ 'price_disc_start_from': price_excl_after_disc
+ }
+ data.update(start_from)
+
+ return self.response(data)
+
+ def get_product_price_for_website(self, product_id, partner_id=0):
+ # default_pricelist_id = request.env['ir.config_parameter'].get_param('product.pricelist.default_price_id')
+ # default_discount_id = request.env['ir.config.parameter'].get_param('product.pricelist.default_discount_id')
+ # default_divide_tax = request.env['ir.config.parameter'].get_param('product.pricelist.default_divide_tax')
+ default_pricelist_id = int(1)
+ default_discount_id = int(4)
+ default_divide_tax = float(1.11)
+
+ # compile partner
+ partner = request.env['res.partner'].search([('id', '=', partner_id)], limit=1)
+
+ if partner:
+ if not partner.parent_id: # it means this is a parent
+ default_discount_id = partner.custom_pricelist_id
+ else: # it means this is NOT parent
+ default_discount_id = partner.parent_id.custom_pricelist_id
+
+ query = [
+ ('pricelist_id.id', '=', default_pricelist_id),
+ ('product_id.id', '=', product_id)
+ ]
+ pl_item1 = request.env['product.pricelist.item'].search(query, limit=1)
+ query = [
+ ('pricelist_id.id', '=', default_discount_id),
+ ('product_id.id', '=', product_id)
+ ]
+ pl_item2 = request.env['product.pricelist.item'].search(query, limit=1)
+
+ price_coret = float(pl_item1.fixed_price)
+ price_include = math.floor(price_coret)
+ discount = float(pl_item2.price_discount)
+
+ data = []
+ if price_coret > 0 and discount > 0:
+ price_coret = price_coret / default_divide_tax
+ price_coret = math.floor(price_coret)
+ price_discount = price_coret - (price_coret * discount / 100)
+ price_discount = math.floor(price_discount)
+ ppn = price_discount * 11/100
+ ppn = math.floor(ppn)
+
+ data = {
+ 'price_include': price_include,
+ 'price': price_coret,
+ 'discount': discount,
+ 'price_discount': price_discount,
+ 'ppn': ppn
+ }
+ elif price_coret > 0:
+ price_coret = price_coret / default_divide_tax
+ price_coret = math.floor(price_coret)
+ ppn = price_coret * 11/100
+ ppn = math.floor(ppn)
+ data = {
+ 'price_include': price_include,
+ 'price': price_coret,
+ 'discount': 0,
+ 'price_discount': price_coret,
+ 'ppn': ppn
+ }
+ else:
+ data = {
+ 'price': 0,
+ 'discount': 0,
+ 'price_discount': 0,
+ 'ppn': 0
+ }
+ return data
+
+
@http.route(prefix + 'new_product', auth='public', methods=['GET', 'OPTIONS'])
def get_new_product(self, **kw):
if not self.authenticate():