diff options
| author | trisusilo48 <tri.susilo@altama.co.id> | 2024-10-02 09:44:39 +0700 |
|---|---|---|
| committer | trisusilo48 <tri.susilo@altama.co.id> | 2024-10-02 09:44:39 +0700 |
| commit | 2739d3040a69228192096ee16373610149a2fb47 (patch) | |
| tree | 545aa797d7407e8f22250dff15648495b891928f /indoteknik_api/controllers/api_v1 | |
| parent | 4d3d219b5f1002822a16067a28261fd59b170ff8 (diff) | |
| parent | 7d3780ede67579b5891218efc370dc82eef510a1 (diff) | |
Merge branch 'production' of https://bitbucket.org/altafixco/indoteknik-addons into production
Diffstat (limited to 'indoteknik_api/controllers/api_v1')
| -rw-r--r-- | indoteknik_api/controllers/api_v1/cart.py | 22 | ||||
| -rw-r--r-- | indoteknik_api/controllers/api_v1/category_management.py | 3 | ||||
| -rw-r--r-- | indoteknik_api/controllers/api_v1/partner.py | 73 | ||||
| -rw-r--r-- | indoteknik_api/controllers/api_v1/sale_order.py | 20 | ||||
| -rw-r--r-- | indoteknik_api/controllers/api_v1/user.py | 280 |
5 files changed, 363 insertions, 35 deletions
diff --git a/indoteknik_api/controllers/api_v1/cart.py b/indoteknik_api/controllers/api_v1/cart.py index f472a9b0..2a24b205 100644 --- a/indoteknik_api/controllers/api_v1/cart.py +++ b/indoteknik_api/controllers/api_v1/cart.py @@ -16,10 +16,28 @@ class Cart(controller.Controller): offset = int(kw.get('offset', 0)) query = [('user_id', '=', user_id)] carts = user_cart.search(query, limit=limit, offset=offset, order='create_date desc') - carts.write({'source': 'add_to_cart'}) + # carts.write({'source': 'add_to_cart'}) + products = [] + products_inactive = [] + for cart in carts: + if cart.product_id: + price = cart.product_id._v2_get_website_price_include_tax() + if cart.product_id.active and price > 0: + product = cart.with_context(price_for="web").get_products() + for product_active in product: + products.append(product_active) + else: + product_inactives = cart.with_context(price_for="web").get_products() + for inactives in product_inactives: + products_inactive.append(inactives) + else: + program = cart.with_context(price_for="web").get_products() + for programs in program: + products.append(programs) data = { 'product_total': user_cart.search_count(query), - 'products': carts.with_context(price_for="web").get_products() + 'products': products, + 'products_inactive': products_inactive } return self.response(data) diff --git a/indoteknik_api/controllers/api_v1/category_management.py b/indoteknik_api/controllers/api_v1/category_management.py index 836f4493..c0ecc6b9 100644 --- a/indoteknik_api/controllers/api_v1/category_management.py +++ b/indoteknik_api/controllers/api_v1/category_management.py @@ -2,6 +2,7 @@ from odoo import http from odoo.http import request from .. import controller + class CategoryManagement(controller.Controller): prefix = '/api/v1/' @@ -42,5 +43,3 @@ class CategoryManagement(controller.Controller): 'categories': category_id2_data, }) return self.response(data, headers=[('Cache-Control', 'max-age=3600, public')]) - - diff --git a/indoteknik_api/controllers/api_v1/partner.py b/indoteknik_api/controllers/api_v1/partner.py index 69a2f861..369f2125 100644 --- a/indoteknik_api/controllers/api_v1/partner.py +++ b/indoteknik_api/controllers/api_v1/partner.py @@ -66,11 +66,13 @@ class Partner(controller.Controller): 'name': ['required'], 'email': ['required'], 'mobile': ['required'], + 'phone': [''], 'street': ['required'], 'city_id': ['required', 'number', 'alias:kota_id'], 'district_id': ['number', 'alias:kecamatan_id'], 'sub_district_id': ['number', 'alias:kelurahan_id', 'exclude_if_null'], 'zip': ['required'], + 'alamat_lengkap_text': [] }) if not params['valid']: @@ -95,6 +97,7 @@ class Partner(controller.Controller): 'name': ['required'], 'email': ['required'], 'mobile': ['required'], + 'phone': [''], 'street': ['required'], 'city_id': ['required', 'number', 'alias:kota_id'], 'district_id': ['number', 'alias:kecamatan_id'], @@ -115,23 +118,55 @@ class Partner(controller.Controller): @controller.Controller.must_authorized() def write_partner_by_id(self, **kw): params = self.get_request_params(kw, { - 'id': ['required', 'number'], + 'id': ['', 'number'], 'name': [], 'company_type_id': ['number'], 'industry_id': ['number'], 'tax_name': ['alias:nama_wajib_pajak'], 'npwp': [], + 'alamat_lengkap_text': [], + 'street': [], + }) + + # Mengambil id_user dari request + id_user = self.get_request_params(kw, { + 'id_user': ['number'] + }) + + # Mengambil parameter user dari request + params_user = self.get_request_params(kw, { + 'company_type_id': ['number'], + 'industry_id': ['number'], + 'tax_name': ['alias:nama_wajib_pajak'], + 'npwp': [], + 'alamat_lengkap_text': [], }) + # Cek validitas parameter if not params['valid']: return self.response(code=400, description=params) - + + # Mencari partner dan user berdasarkan ID partner = request.env[self._name].search([('id', '=', params['value']['id'])], limit=1) + user = request.env[self._name].search([('id', '=', id_user['value']['id_user'])], limit=1) + if not partner: - return self.response(code=404, description='User not found') - - partner.write(params['value']) + return self.response(code=404, description='Partner not found') + + # Filter parameter yang memiliki nilai saja untuk partner + params_filtered = {k: v for k, v in params['value'].items() if v} + + # Filter parameter yang memiliki nilai saja untuk user + params_user_filtered = {k: v for k, v in params_user['value'].items() if v} + # Update partner dan user hanya dengan parameter yang memiliki nilai + if params_filtered: + partner.write(params_filtered) + + if params_user_filtered: + user.write(params_user_filtered) + + # Return response dengan ID partner yang di-update return self.response({ 'id': partner.id }) @@ -164,4 +199,32 @@ class Partner(controller.Controller): }) return self.response(data) + + @http.route(prefix + 'check/<partner_id>/tempo', auth='public', methods=['GET', 'OPTIONS']) + @controller.Controller.must_authorized() + def get_check_tempo_partner(self, **kw): + partner_id = int(kw.get('partner_id')) + + partner = request.env['res.partner'].search([('id', '=', partner_id)], limit=1) + if not partner: + return self.response(code=404, description='Partner not found') + + partner = partner.parent_id or partner + + if any(line.days == 0 for line in partner.property_payment_term_id.line_ids): + return self.response(code=402, description='Partner not tempo') + + result_tempo = sum(m.amount_total_signed for m in request.env['account.move'].search([('partner_id', '=', partner.id), ('payment_state', '=', 'not_paid'), ('state', '=', 'posted')])) + + remaining_limit = partner.blocking_stage - result_tempo if partner.active_limit else None + + data = { + 'name': partner.name, + 'amount_due': result_tempo, + 'remaining_limit': remaining_limit + } + + return self.response(data) + + diff --git a/indoteknik_api/controllers/api_v1/sale_order.py b/indoteknik_api/controllers/api_v1/sale_order.py index 1b7c1af4..e7664c79 100644 --- a/indoteknik_api/controllers/api_v1/sale_order.py +++ b/indoteknik_api/controllers/api_v1/sale_order.py @@ -388,6 +388,9 @@ class SaleOrder(controller.Controller): if not params['valid']: return self.response(code=400, description=params) + # Fetch partner details + sales_partner = request.env['res.partner'].browse(params['value']['partner_id']) + parameters = { 'warehouse_id': 8, 'carrier_id': 1, @@ -407,7 +410,7 @@ class SaleOrder(controller.Controller): 'real_invoice_id': params['value']['partner_invoice_id'], 'partner_purchase_order_name': params['value']['po_number'], 'partner_purchase_order_file': params['value']['po_file'], - 'delivery_amt': params['value']['delivery_amount'], + 'delivery_amt': params['value']['delivery_amount'] * 1.10, 'estimated_arrival_days': params['value']['estimated_arrival_days'], 'shipping_cost_covered': 'customer', 'shipping_paid_by': 'customer', @@ -415,9 +418,11 @@ class SaleOrder(controller.Controller): 'delivery_service_type': params['value']['delivery_service_type'], 'flash_sale': params['value']['flash_sale'], 'note_website': params['value']['note_website'], - 'customer_type': 'nonpkp', - 'npwp': '0', - 'user_id': 3222 # User ID: Nadia Rauhadatul Firdaus + 'customer_type': sales_partner.customer_type if sales_partner else 'nonpkp', # Get Customer Type from partner + 'npwp': sales_partner.npwp or '0', # Get NPWP from partner + 'sppkp': sales_partner.sppkp, # Get SPPKP from partner + 'email': sales_partner.email, # Get Email from partner + 'user_id': 3222 # User ID: Nadia Rauhadatul Firdaus } sales_partner = request.env['res.partner'].browse(parameters['partner_id']) @@ -460,11 +465,16 @@ class SaleOrder(controller.Controller): sale_order.apply_promotion_program() voucher_code = params['value']['voucher'] - voucher = request.env['voucher'].search([('code', '=', voucher_code)]) + voucher = request.env['voucher'].search([('code', '=', voucher_code),('apply_type', 'in', ['all', 'brand'])], limit=1) + voucher_shipping = request.env['voucher'].search([('code', '=', voucher_code),('apply_type', 'in', ['shipping'])], limit=1) if voucher and len(promotions) == 0: sale_order.voucher_id = voucher.id sale_order.apply_voucher() + if voucher_shipping and len(promotions) == 0: + sale_order.voucher_shipping_id = voucher_shipping.id + sale_order.apply_voucher_shipping() + cart_ids = [x['cart_id'] for x in carts] if sale_order._requires_approval_margin_leader(): #jika ada error tambahkan kondisi if params['value']['type'] == 'sale_order': sale_order.approval_status = 'pengajuan2' diff --git a/indoteknik_api/controllers/api_v1/user.py b/indoteknik_api/controllers/api_v1/user.py index 10508149..529873c0 100644 --- a/indoteknik_api/controllers/api_v1/user.py +++ b/indoteknik_api/controllers/api_v1/user.py @@ -9,6 +9,8 @@ import string import requests import json from difflib import SequenceMatcher +import mimetypes +import base64 class User(controller.Controller): @@ -105,12 +107,28 @@ class User(controller.Controller): name = kw.get('name') email = kw.get('email') password = kw.get('password') - if not name or not email or not password: - return self.response(code=400, description='email, name and password is required') - - company = kw.get('company', False) phone = kw.get('phone') + # Form Data + npwp = kw.get('npwp') + npwp_document = kw.get('npwp_document', False) + npwp_filename = kw.get('npwp_filename', 'npwp_document') + sppkp = kw.get('sppkp', False) + sppkp_document = kw.get('sppkp_document', False) + sppkp_filename = kw.get('sppkp_filename', 'sppkp_document') + email_partner = kw.get('email_partner') + business_name = kw.get('business_name', False) + industry_id = int(kw.get('industry_id', '0') or 0) + company_type_id = int(kw.get('company_type_id', '0') or 0) + alamat_wajib_pajak = kw.get('alamat_wajib_pajak', False) + alamat_bisnis = kw.get('alamat_bisnis', False) + nama_wajib_pajak = kw.get('nama_wajib_pajak', False) + is_pkp = kw.get('is_pkp') + type_acc = kw.get('type_acc', 'individu') or 'individu' + + if not name or not email or not password: + return self.response(code=400, description='email, name, and password are required') + response = { 'register': False, 'reason': None @@ -126,10 +144,11 @@ class User(controller.Controller): return self.response(response) + # Create user data user_data = { 'name': name, 'login': email, - 'phone': phone, + 'mobile': phone, 'password': password, 'active': False, 'sel_groups_1_9_10': 9 @@ -137,27 +156,97 @@ class User(controller.Controller): user = request.env['res.users'].create(user_data) user.partner_id.email = email - - if company: - parameter = [ - ('company_type', '=', 'company'), - ('name', 'ilike', company) - ] - match_company = request.env['res.partner'].search(parameter, limit=1) - match_ratio = 0 - if match_company: - match_ratio = SequenceMatcher(None, match_company.name, company).ratio() - if match_ratio > 0.8: + user.partner_id.mobile = phone + + if type_acc == 'business' and business_name: + # Eksekusi query SQL menggunakan Levenshtein distance + query = """ + SELECT name, levenshtein(name::text, %s) AS distance + FROM res_partner + WHERE levenshtein(name::text, %s) < 3 + ORDER BY distance ASC + """ + params = (business_name, business_name) + request.env.cr.execute(query, params) + result = request.env.cr.fetchone() + + if result: + match_company_name = result[0] + match_company_id = result[2] + + # Create a user company request request.env['user.company.request'].create({ 'user_id': user.partner_id.id, - 'user_company_id': match_company.id, - 'user_input': company + 'user_company_id': match_company_id, + 'user_input': business_name }) else: - new_company = request.env['res.partner'].create({ - 'name': company + if not nama_wajib_pajak and is_pkp == 'false': + nama_wajib_pajak = business_name + + if not alamat_wajib_pajak and is_pkp == 'false': + alamat_wajib_pajak = alamat_bisnis + + new_company_data = { + 'name': business_name if business_name else business_name, + 'company_type_id': company_type_id if company_type_id else False, + 'industry_id': industry_id, + 'customer_type': 'pkp' if is_pkp == 'true' else 'nonpkp', + 'npwp': npwp if is_pkp == 'true' else (npwp if npwp else '00.000.000.0-000.000'), + 'sppkp': sppkp if is_pkp == 'true' else (sppkp if sppkp else '-'), + 'nama_wajib_pajak': nama_wajib_pajak, + 'alamat_lengkap_text': alamat_wajib_pajak, + 'email': email_partner, + 'street': alamat_bisnis, + 'company_type': 'company', + 'user_id': 3222, + 'property_account_receivable_id': 395, + 'property_account_payable_id': 438, + 'active': False, + } + new_company = request.env['res.partner'].create(new_company_data) + request.env['user.company.request'].create({ + 'user_id': user.partner_id.id, + 'user_company_id': new_company.id, + 'user_input': business_name }) - user.parent_id = new_company.id + + if npwp_document: + npwp_mimetype, _ = mimetypes.guess_type(npwp_filename) + npwp_mimetype = npwp_mimetype or 'application/octet-stream' + pdf_data = base64.b64decode(npwp_document) + npwp_attachment = request.env['ir.attachment'].create({ + 'name': 'NPWP Document', + 'type': 'binary', + 'datas': base64.b64encode(pdf_data), + 'res_model': 'res.partner', + 'res_id': new_company.id, + 'mimetype': npwp_mimetype + }) + new_company.message_post(body="NPWP Uploaded", attachment_ids=[npwp_attachment.id]) + + if sppkp_document: + sppkp_mimetype, _ = mimetypes.guess_type(sppkp_filename) + sppkp_mimetype = sppkp_mimetype or 'application/octet-stream' + pdf_data = base64.b64decode(sppkp_document) + sppkp_attachment = request.env['ir.attachment'].create({ + 'name': 'SPPKP Document', + 'type': 'binary', + 'datas': base64.b64encode(pdf_data), + 'res_model': 'res.partner', + 'res_id': new_company.id, + 'mimetype': sppkp_mimetype + }) + new_company.message_post(body="SPPKP Uploaded", attachment_ids=[sppkp_attachment.id]) + + if type_acc == 'individu': + user.partner_id.customer_type = 'nonpkp' + user.partner_id.npwp = '0.000.000.0-000.000' + user.partner_id.sppkp = '-' + user.partner_id.nama_wajib_pajak = name + user.partner_id.user_id = 3222 + user.partner_id.property_account_receivable_id= 395 + user.partner_id.property_account_payable_id = 438 user.send_activation_mail() @@ -240,6 +329,14 @@ class User(controller.Controller): 'activation': True, 'user': self.response_with_token(user) }) + parameter = [ + ('user_id', '=', user.partner_id.id) + ] + company_request = request.env['user.company.request'].search(parameter, limit=1) + if company_request: + user.parent_name = company_request.user_input + if company_request.is_approve == False: + user.send_company_request_mail() return self.response(response) @http.route(prefix + 'user/forgot-password', auth='public', methods=['POST'], csrf=False) @@ -315,3 +412,144 @@ class User(controller.Controller): x) for x in partners] return self.response(address) + + @http.route(prefix + 'user/<id>/switch', auth='public', methods=['PUT', 'OPTIONS'], csrf=False) + @controller.Controller.must_authorized() + def switch_account(self, **kw): + id = kw.get('id') + user = request.env['res.users'].search([('id', '=', id)], limit=1) + + response = { + 'switch': False, + 'reason': None + } + + # Form Data + npwp = kw.get('npwp') + npwp_document = kw.get('npwp_document', False) + npwp_filename = kw.get('npwp_filename', 'npwp_document') + sppkp = kw.get('sppkp', False) + sppkp_document = kw.get('sppkp_document', False) + sppkp_filename = kw.get('sppkp_filename', 'sppkp_document') + email_partner = kw.get('email_partner') + business_name = kw.get('business_name', False) + industry_id = int(kw.get('industry_id', '0') or 0) + company_type_id = int(kw.get('company_type_id', '0') or 0) + alamat_wajib_pajak = kw.get('alamat_wajib_pajak', False) + alamat_bisnis = kw.get('alamat_bisnis', False) + nama_wajib_pajak = kw.get('nama_wajib_pajak', False) + is_pkp = kw.get('is_pkp') + type_acc = kw.get('type_acc', False) + + + response = { + 'switch': False, + 'reason': None + } + + if type_acc == 'business': + parameter = [ + ('company_type', '=', 'company'), + ('name', 'ilike', business_name) + ] + match_company = request.env['res.partner'].search(parameter, limit=1) + match_ratio = 0 + if match_company: + match_ratio = SequenceMatcher(None, match_company.name, business_name).ratio() + if match_ratio > 0.8: + # Create a user company request + request.env['user.company.request'].create({ + 'user_id': user.partner_id.id, + 'user_company_id': match_company.id, + 'user_input': business_name + }) + else: + if not nama_wajib_pajak and is_pkp == 'false': + nama_wajib_pajak = business_name + + if not alamat_wajib_pajak and is_pkp == 'false': + alamat_wajib_pajak = alamat_bisnis + + new_company_data = { + 'name': business_name if business_name else business_name, + 'company_type_id': company_type_id if company_type_id else False, + 'industry_id': industry_id, + 'customer_type': 'pkp' if is_pkp == 'true' else 'nonpkp', + 'npwp': npwp if is_pkp == 'true' else (npwp if npwp else '00.000.000.0-000.000'), + 'sppkp': sppkp if is_pkp == 'true' else (sppkp if sppkp else '-'), + 'nama_wajib_pajak': nama_wajib_pajak, + 'alamat_lengkap_text': alamat_wajib_pajak, + 'email': email_partner, + 'street': alamat_bisnis, + 'company_type': 'company', + 'user_id': 3222, + 'property_account_receivable_id': 395, + 'property_account_payable_id': 438, + 'active': False, + } + new_company = request.env['res.partner'].create(new_company_data) + request.env['user.company.request'].create({ + 'user_id': user.partner_id.id, + 'user_company_id': new_company.id, + 'user_input': business_name + }) + # user.partner_id.parent_id = new_company.id + # user.partner_id.customer_type = new_company.customer_type + # user.partner_id.npwp = new_company.npwp + # user.partner_id.sppkp = new_company.sppkp + # user.partner_id.nama_wajib_pajak = new_company.nama_wajib_pajak + # user.partner_id.alamat_lengkap_text = new_company.alamat_lengkap_text + + if npwp_document: + npwp_mimetype, _ = mimetypes.guess_type(npwp_filename) + npwp_mimetype = npwp_mimetype or 'application/octet-stream' + pdf_data = base64.b64decode(npwp_document) + npwp_attachment = request.env['ir.attachment'].create({ + 'name': 'NPWP Document', + 'type': 'binary', + 'datas': base64.b64encode(pdf_data), + 'res_model': 'res.partner', + 'res_id': new_company.id, + 'mimetype': npwp_mimetype + }) + new_company.message_post(body="NPWP Uploaded", attachment_ids=[npwp_attachment.id]) + + if sppkp_document: + sppkp_mimetype, _ = mimetypes.guess_type(sppkp_filename) + sppkp_mimetype = sppkp_mimetype or 'application/octet-stream' + pdf_data = base64.b64decode(sppkp_document) + sppkp_attachment = request.env['ir.attachment'].create({ + 'name': 'SPPKP Document', + 'type': 'binary', + 'datas': base64.b64encode(pdf_data), + 'res_model': 'res.partner', + 'res_id': new_company.id, + 'mimetype': sppkp_mimetype + }) + new_company.message_post(body="SPPKP Uploaded", attachment_ids=[sppkp_attachment.id]) + + response['switch'] = 'Pending' + return self.response(response) + + @http.route(prefix + 'user/<id>/switch_progres', auth='public', methods=['GET', 'OPTIONS'], csrf=False) + # @controller.Controller.must_authorized() + def switch_account_progres(self, **kw): + id = int(kw.get('id')) + user = request.env['res.users'].search([('id', '=', id)], limit=1) + response = { + 'status': '' + } + parameter = [ + ('user_id', '=', id) + ] + new_company_request = request.env['user.company.request'].search(parameter, limit=1) + is_approve = '' + if new_company_request: + # Mengambil nilai is_approve + if new_company_request.is_approve == False: + response['status'] = 'pending' + else: + response['status'] = new_company_request.is_approve + else: + response['status'] = 'unknown' + return self.response(response)
\ No newline at end of file |
