summaryrefslogtreecommitdiff
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
parent3aa64db9c10d0fcb8009e9e6f942672a12669099 (diff)
rest api for website pricelist
-rw-r--r--indoteknik_api/controllers/api_v1/product.py110
-rw-r--r--indoteknik_api/models/product_product.py66
-rw-r--r--indoteknik_custom/models/res_partner.py1
3 files changed, 176 insertions, 1 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():
diff --git a/indoteknik_api/models/product_product.py b/indoteknik_api/models/product_product.py
index 2e84b9f4..f83ede27 100644
--- a/indoteknik_api/models/product_product.py
+++ b/indoteknik_api/models/product_product.py
@@ -1,4 +1,5 @@
from odoo import models
+import math
class ProductProduct(models.Model):
@@ -34,4 +35,67 @@ class ProductProduct(models.Model):
'image_promotion_1': self.env['ir.attachment'].api_image('x_manufactures', 'image_promotion_1', manufacture.id),
'image_promotion_2': self.env['ir.attachment'].api_image('x_manufactures', 'image_promotion_2', manufacture.id),
}
- return {} \ No newline at end of file
+ return {}
+
+ def _get_website_price_include_tax(self):
+ default_pricelist_id = int(1)
+
+ query = [
+ ('pricelist_id.id', '=', default_pricelist_id),
+ ('product_id.id', '=', self.id)
+ ]
+ pl_item1 = self.env['product.pricelist.item'].search(query, limit=1)
+
+ retValue = pl_item1.fixed_price
+ retValue = math.floor(retValue)
+ return retValue
+
+ def _get_website_price_exclude_tax(self):
+ default_divide_tax = float(1.11)
+ price_incl = self._get_website_price_include_tax()
+ res = price_incl / default_divide_tax
+ return math.floor(res)
+
+ def _get_website_disc(self, partner_id):
+ default_discount_id = int(4)
+
+ # compile partner
+ partner = self.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_discount_id),
+ ('product_id.id', '=', self.id)
+ ]
+
+ pl_item2 = self.env['product.pricelist.item'].search(query, limit=1)
+
+ retValue = pl_item2.price_discount
+ return retValue
+
+ def _get_website_price_after_disc_and_tax(self):
+ default_divide_tax = float(1.11)
+ price_after_disc = self._get_website_price_after_disc()
+ res = price_after_disc / default_divide_tax
+ res = math.floor(res)
+ return res
+
+ def _get_website_price_after_disc(self):
+ discount = self._get_website_disc(0)
+ price_incl = self._get_website_price_include_tax()
+ res = 0
+ if discount > 0:
+ res = price_incl - (price_incl * discount / 100)
+ else:
+ res = price_incl
+ return math.floor(res)
+
+ def _get_website_tax(self):
+ default_percent_tax = float(11)
+ price_after_disc = self._get_website_price_after_disc_and_tax()
+ res = price_after_disc * default_percent_tax / 100
+ return math.floor(res)
diff --git a/indoteknik_custom/models/res_partner.py b/indoteknik_custom/models/res_partner.py
index 1cdf7c72..ad88957f 100644
--- a/indoteknik_custom/models/res_partner.py
+++ b/indoteknik_custom/models/res_partner.py
@@ -6,3 +6,4 @@ class ResPartner(models.Model):
reference_number = fields.Char(string="Reference Number")
company_type_id = fields.Many2one('res.partner.company_type', string='Company Type')
+ custom_pricelist_id = fields.Many2one('product.pricelist', string='Price Matrix')