diff options
| author | Rafi Zadanly <zadanlyr@gmail.com> | 2023-02-25 11:53:29 +0700 |
|---|---|---|
| committer | Rafi Zadanly <zadanlyr@gmail.com> | 2023-02-25 11:53:29 +0700 |
| commit | 13c90b5a95391d797b89c39b90c1430400ed29b7 (patch) | |
| tree | 1df668fee68e72a76cbcc5255e5d533b3721d190 /indoteknik_api | |
| parent | 0f7f7fa273295fadde403c4ff9333b3bbe14489a (diff) | |
| parent | 029e8fce907060de2a2514b5abc731f4cd9da96e (diff) | |
Merge branch 'staging' into release
Diffstat (limited to 'indoteknik_api')
| -rw-r--r-- | indoteknik_api/controllers/api_v1/midtrans.py | 25 | ||||
| -rw-r--r-- | indoteknik_api/controllers/api_v1/partner.py | 61 | ||||
| -rw-r--r-- | indoteknik_api/controllers/api_v1/sale_order.py | 36 | ||||
| -rw-r--r-- | indoteknik_api/controllers/api_v1/user.py | 32 | ||||
| -rw-r--r-- | indoteknik_api/models/account_move.py | 3 | ||||
| -rw-r--r-- | indoteknik_api/models/res_users.py | 7 | ||||
| -rw-r--r-- | indoteknik_api/models/sale_order.py | 29 |
7 files changed, 171 insertions, 22 deletions
diff --git a/indoteknik_api/controllers/api_v1/midtrans.py b/indoteknik_api/controllers/api_v1/midtrans.py index fdc801d3..49ebce0f 100644 --- a/indoteknik_api/controllers/api_v1/midtrans.py +++ b/indoteknik_api/controllers/api_v1/midtrans.py @@ -8,19 +8,20 @@ class Midtrans(controller.Controller): prefix = '/api/v1/' @http.route(prefix + 'midtrans/notification', auth='none', type='json', csrf=False, cors='*', methods=['POST', 'OPTIONS']) - def notification(self, **kw): + def midtrans_notification(self, **kw): json_raw = json.loads(request.httprequest.data) - trx_status = json.loads(request.httprequest.data)['transaction_status'] - order_no = json.loads(request.httprequest.data)['order_id'] + json_dump = json.dumps(json_raw, indent=4, sort_keys=True) + # trx_status = json.loads(request.httprequest.data)['transaction_status'] + # order_no = json.loads(request.httprequest.data)['order_id'] - query = [('name', '=', order_no)] - order = request.env['sale.order'].sudo().search(query, limit=1) - order.payment_status = trx_status + # query = [('name', '=', order_no)] + # order = request.env['sale.order'].sudo().search(query, limit=1) + # order.payment_status = trx_status request.env['midtrans.notification'].create([{ - 'sale_order_id': order.id, - 'json_raw': json_raw, - 'payment_status': trx_status, + # 'sale_order_id': order.id, + 'json_raw': json_dump, + # 'payment_status': trx_status, }]) return @@ -28,15 +29,17 @@ class Midtrans(controller.Controller): @http.route(prefix + 'midtrans/recurring', auth='none', type='json', csrf=False, cors='*', methods=['POST', 'OPTIONS']) def recurring(self, **kw): json_raw = json.loads(request.httprequest.data) + json_dump = json.dumps(json_raw, indent=4, sort_keys=True) request.env['midtrans.recurring'].create([{ - 'json_raw': json_raw, + 'json_raw': json_dump, }]) return @http.route(prefix + 'midtrans/payaccount', auth='none', type='json', csrf=False, cors='*', methods=['POST', 'OPTIONS']) def payaccount(self, **kw): json_raw = json.loads(request.httprequest.data) + json_dump = json.dumps(json_raw, indent=4, sort_keys=True) request.env['midtrans.account'].create([{ - 'json_raw': json_raw, + 'json_raw': json_dump, }]) return
\ No newline at end of file diff --git a/indoteknik_api/controllers/api_v1/partner.py b/indoteknik_api/controllers/api_v1/partner.py index 09b3caa0..ba59a1ce 100644 --- a/indoteknik_api/controllers/api_v1/partner.py +++ b/indoteknik_api/controllers/api_v1/partner.py @@ -81,3 +81,64 @@ class Partner(controller.Controller): 'id': partner.id, }) + @http.route(prefix + 'partner/<id>', auth='public', methods=['PUT', 'OPTIONS'], csrf=False) + def write_partner_by_id(self, **kw): + user_token = self.authenticate() + if not user_token: + return self.unauthorized_response() + + params = self.get_request_params(kw, { + 'id': ['required', 'number'], + 'name': [], + 'company_type_id': ['number'], + 'industry_id': ['number'], + 'tax_name': ['alias:nama_wajib_pajak'], + 'npwp': [], + }) + + 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') + + if user_token['partner_id'] not in self.get_partner_child_ids(partner.id): + return self.unauthorized_response() + + partner.write(params['value']) + + return self.response({ + 'id': partner.id + }) + + @http.route(prefix + 'partner/industry', auth='public', methods=['GET', 'OPTIONS']) + def get_partner_industry(self): + if not self.authenticate(): + return self.response(code=401, description='Unauthorized') + + partner_industry = request.env['res.partner.industry'].search([]) + data = [] + for industry in partner_industry: + data.append({ + 'id': industry.id, + 'name': industry.name + }) + + return self.response(data) + + @http.route(prefix + 'partner/company_type', auth='public', methods=['GET', 'OPTIONS']) + def get_partner_company_type(self): + if not self.authenticate(): + return self.response(code=401, description='Unauthorized') + + 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) + diff --git a/indoteknik_api/controllers/api_v1/sale_order.py b/indoteknik_api/controllers/api_v1/sale_order.py index 1c67d6c5..15dcf0ba 100644 --- a/indoteknik_api/controllers/api_v1/sale_order.py +++ b/indoteknik_api/controllers/api_v1/sale_order.py @@ -36,10 +36,14 @@ class SaleOrder(controller.Controller): data.append({ 'id': sale.id, 'name': sale.name, - 'amount_total': sale.amount_total, + 'date_order': self.time_to_str(sale.date_order, '%d/%m/%Y %H:%M:%S'), 'state': sale.state, + 'amount_untaxed': sale.amount_untaxed, + 'amount_tax': sale.amount_tax, + 'amount_total': sale.amount_total, 'product_name': product_name, 'product_not_in_id': product_not_in_id, + 'details': [request.env['sale.order.line'].api_single_response(x, context='with_detail') for x in sale.order_line] }) return self.response(data) @@ -106,6 +110,34 @@ class SaleOrder(controller.Controller): return self.response(data) + @http.route(PREFIX_PARTNER + 'sale_order/<id>/checkout', auth='public', method=['POST', 'OPTIONS'], csrf=False) + def partner_checkout_sale_order_by_id(self, **kw): + user_token = self.authenticate() + if not user_token: + return self.unauthorized_response() + + params = self.get_request_params(kw, { + 'partner_id': ['number'], + 'id': ['number'] + }) + if not user_token['partner_id'] == params['value']['partner_id']: + 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']) + domain = [ + ('id', '=', params['value']['id']), + ('partner_id', 'in', partner_child_ids) + ] + data = {} + 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') + + 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() @@ -187,7 +219,7 @@ class SaleOrder(controller.Controller): if not user_token['partner_id'] == params['value']['partner_id']: return self.unauthorized_response() 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']) domain = [ diff --git a/indoteknik_api/controllers/api_v1/user.py b/indoteknik_api/controllers/api_v1/user.py index 17bc931e..800f6bf1 100644 --- a/indoteknik_api/controllers/api_v1/user.py +++ b/indoteknik_api/controllers/api_v1/user.py @@ -3,6 +3,7 @@ from odoo import http from odoo.http import request from odoo.tools.config import config import random, string +from difflib import SequenceMatcher class User(controller.Controller): @@ -62,20 +63,43 @@ class User(controller.Controller): return self.response(code=400, description='email, name and password is required') user = self.get_user_by_email(email) - if user: return self.response({ 'register': False, 'reason': 'EMAIL_USED' }) - - user = request.env['res.users'].create({ + + user_data = { 'name': name, 'login': email, 'password': password, 'active': False, 'sel_groups_1_9_10': 9 - }) + } + + user = request.env['res.users'].create(user_data) + + company = kw.get('company', False) + 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.7: + request.env['user.company.request'].create({ + 'user_id': user.partner_id.id, + 'user_company_id': match_company.id, + 'user_input': company + }) + else: + new_company = request.env['res.partner'].create({ + 'name': company + }) + user.parent_id = new_company.id return self.response({'register': True}) diff --git a/indoteknik_api/models/account_move.py b/indoteknik_api/models/account_move.py index 5c31f010..9bbe8c94 100644 --- a/indoteknik_api/models/account_move.py +++ b/indoteknik_api/models/account_move.py @@ -15,7 +15,7 @@ class AccountMove(models.Model): 'sales': account_move.invoice_user_id.name, 'amount_total': account_move.amount_total, 'amount_residual': account_move.amount_residual, - 'invoice_date': '', + 'invoice_date': account_move.invoice_date.strftime('%d/%m/%Y') or '', 'efaktur': True if account_move.efaktur_document else False, } if isinstance(object, datetime.date): @@ -31,7 +31,6 @@ class AccountMove(models.Model): 'sales': account_move.invoice_user_id.name, 'amount_total': account_move.amount_total, 'amount_residual': account_move.amount_residual, - 'invoice_date': account_move.invoice_date.strftime('%d/%m/%Y') or '', 'invoice_date_due': account_move.invoice_date_due.strftime('%d/%m/%Y') or '', 'customer': res_users.api_address_response(account_move.partner_id), 'products': [], diff --git a/indoteknik_api/models/res_users.py b/indoteknik_api/models/res_users.py index 99a3838d..5032f3af 100644 --- a/indoteknik_api/models/res_users.py +++ b/indoteknik_api/models/res_users.py @@ -7,6 +7,7 @@ class ResUsers(models.Model): def api_single_response(self, res_user, with_detail=''): data = { 'id': res_user.id, + 'parent_id': res_user.parent_id.id or False, 'partner_id': res_user.partner_id.id, 'name': res_user.name, 'email': res_user.login, @@ -32,7 +33,11 @@ class ResUsers(models.Model): 'city': None, 'district': None, 'sub_district': None, - 'zip': user.zip or '' + 'zip': user.zip or '', + 'company_type_id': user.company_type_id.id or None, + 'industry_id': user.industry_id.id or None, + 'tax_name': user.nama_wajib_pajak or '', + 'npwp': user.npwp or '', } if user.kota_id: diff --git a/indoteknik_api/models/sale_order.py b/indoteknik_api/models/sale_order.py index c3f3dccb..ca6baff0 100644 --- a/indoteknik_api/models/sale_order.py +++ b/indoteknik_api/models/sale_order.py @@ -24,9 +24,19 @@ class SaleOrder(models.Model): data['status'] = 'waiting' if sale_order.state == 'sale': data['status'] = 'sale' + picking_count = { + 'assigned': 0, + 'done': 0, + } for picking in sale_order.picking_ids: - if picking.state == 'assigned': - data['status'] = 'shipping' + if picking.state in ['confirmed', 'assigned']: + picking_count['assigned'] += 1 + if picking.state == 'done': + picking_count['done'] += 1 + if picking_count['done'] > 0: + data['status'] = 'shipping' + if picking_count['assigned'] > 0: + data['status'] = 'partial_shipping' if sale_order.state == 'done': data['status'] = 'done' @@ -53,3 +63,18 @@ class SaleOrder(models.Model): data_with_detail['invoices'].append(self.env['account.move'].api_v1_single_response(invoice)) data.update(data_with_detail) return data + + +class SaleOrderLine(models.Model): + _inherit = 'sale.order.line' + + def api_single_response(self, sale_order_line, context=False): + data = { + 'image': self.env['ir.attachment'].api_image('product.template', 'image_128', sale_order_line.product_id.product_tmpl_id.id), + 'item_code': sale_order_line.product_id.default_code, + 'product_name': sale_order_line.product_id.name, + 'price_before_discount': sale_order_line.price_unit * sale_order_line.product_uom_qty, + 'price_after_discount': sale_order_line.price_total, + 'tax': sale_order_line.price_tax + } + return data |
