from .. import controller from odoo import http from odoo.http import request class Partner(controller.Controller): _name = 'res.partner' prefix = '/api/v1/' def get_partner_child_ids(self, partner_id): partner = request.env[self._name].search([('id', '=', partner_id)], limit=1) if not partner.parent_id: partner_child_ids = [x['id'] for x in partner.child_ids] + [partner.id] if partner.parent_id: partner_child_ids = [x['id'] for x in partner.parent_id.child_ids] return partner_child_ids @http.route(prefix + 'partner//list/site', auth='public', methods=['GET', 'OPTIONS']) @controller.Controller.must_authorized() def get_list_partner_by_id(self, **kw): params = self.get_request_params(kw, { 'id': ['required', 'number'] }) if not params['valid']: return self.response(code=400, description=params) partner_id = params['value']['id'] partner_child_ids = self.get_partner_child_ids(partner_id) partners = request.env['res.partner'].search([('id', 'in', partner_child_ids)]) site_names = set() for partner in partners: if partner.site_id: site_names.add(partner.site_id.name) data = { 'sites': list(site_names) } return self.response(data) @http.route(prefix + 'partner//address', auth='public', methods=['GET', 'OPTIONS']) @controller.Controller.must_authorized() def get_partner_address_by_id(self, **kw): params = self.get_request_params(kw, { 'id': ['required', 'number'] }) if not params['valid']: return self.response(code=400, description=params) partner = request.env[self._name].search([('id', '=', params['value']['id'])]) partner = request.env['res.users'].api_address_response(partner) return self.response(partner) @http.route(prefix + 'partner//address', auth='public', methods=['PUT', 'OPTIONS'], csrf=False) @controller.Controller.must_authorized() def write_partner_address_by_id(self, **kw): params = self.get_request_params(kw, { 'id': ['required', 'number'], 'type': ['default:other'], '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']: return self.response(code=400, description=params) partner = request.env[self._name].search([('id', '=', params['value']['id'])], limit=1) if not partner: return self.response(code=404, description='User not found') partner.write(params['value']) return self.response({ 'id': partner.id }) @http.route(prefix + 'partner/address', auth='public', methods=['POST', 'OPTIONS'], csrf=False) @controller.Controller.must_authorized() def create_partner_address(self, **kw): params = self.get_request_params(kw, { 'parent_id': ['required', 'number'], 'type': ['default:other'], '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'], }) if not params['valid']: return self.response(code=400, description=params) partner = request.env[self._name].create([ params['value'] ]) return self.response({ 'id': partner.id, }) @http.route(prefix + 'partner/', auth='public', methods=['PUT', 'OPTIONS'], csrf=False) @controller.Controller.must_authorized() def write_partner_by_id(self, **kw): params = self.get_request_params(kw, { 'id': ['', 'number'], 'name': [], 'company_type_id': ['number'], 'industry_id': ['number'], 'tax_name': ['alias:nama_wajib_pajak'], 'npwp': [], 'alamat_lengkap_text': [], 'street': [], }) id_user = self.get_request_params(kw, { 'id_user': ['number'] }) params_user = self.get_request_params(kw, { 'company_type_id': ['number'], 'industry_id': ['number'], 'tax_name': ['alias:nama_wajib_pajak'], 'npwp': [], 'alamat_lengkap_text': [], }) if not params['valid']: return self.response(code=400, description=params) 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='Partner not found') if not params['value'].get('tax_name'): params['value']['nama_wajib_pajak'] = params['value'].get('name') params_user['value']['nama_wajib_pajak'] = params_user['value'].get('name') if not params['value'].get('alamat_lengkap_text'): params['value']['alamat_lengkap_text'] = params['value'].get('street') params_user['value']['alamat_lengkap_text'] = params_user['value'].get('street') if not params['value'].get('npwp'): params['value']['npwp'] = "00.000.000.0-000.000" params_user['value']['npwp'] = "00.000.000.0-000.000" # 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 }) @http.route(prefix + 'partner/industry', auth='public', methods=['GET', 'OPTIONS']) @controller.Controller.must_authorized() def get_partner_industry(self): partner_industry = request.env['res.partner.industry'].search([]) data = [] for industry in partner_industry: full_name = industry.full_name category = full_name.title() if full_name else '-' data.append({ 'id': industry.id, 'name': industry.name, 'category': category }) return self.response(data) @http.route(prefix + 'partner/company_type', auth='public', methods=['GET', 'OPTIONS']) @controller.Controller.must_authorized() def get_partner_company_type(self): partner_company_type = request.env['res.partner.company_type'].search([]) data = [] for company_type in partner_company_type: data.append({ 'id': company_type.id, 'name': company_type.name }) return self.response(data) @http.route(prefix + 'check//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)