From 0f8b80686941cd536612a70a52edc5432b839209 Mon Sep 17 00:00:00 2001 From: Rafi Zadanly Date: Mon, 13 Feb 2023 10:35:23 +0700 Subject: quotation to checkout --- indoteknik_api/models/sale_order.py | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/indoteknik_api/models/sale_order.py b/indoteknik_api/models/sale_order.py index c7d488be..afaf6ae6 100644 --- a/indoteknik_api/models/sale_order.py +++ b/indoteknik_api/models/sale_order.py @@ -22,9 +22,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['assigned'] > 0: + data['status'] = 'shipping' + if picking_count['done'] > 0: + data['status'] = 'partial_shipping' if sale_order.state == 'done': data['status'] = 'done' -- cgit v1.2.3 From fb04f8f3c533740c79c130ab4bc097b8529cae8e Mon Sep 17 00:00:00 2001 From: Rafi Zadanly Date: Mon, 13 Feb 2023 10:35:49 +0700 Subject: sale order status --- indoteknik_api/controllers/api_v1/sale_order.py | 28 +++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/indoteknik_api/controllers/api_v1/sale_order.py b/indoteknik_api/controllers/api_v1/sale_order.py index 52ccf9fa..57a933f9 100644 --- a/indoteknik_api/controllers/api_v1/sale_order.py +++ b/indoteknik_api/controllers/api_v1/sale_order.py @@ -105,6 +105,34 @@ class SaleOrder(controller.Controller): return self.response(data) + @http.route(PREFIX_PARTNER + 'sale_order//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.state = 'sale' + data = request.env['sale.order'].api_v1_single_response(sale_order, context='with_detail') + + return self.response(data) + @http.route(PREFIX_PARTNER + 'sale_order/checkout', auth='public', method=['POST', 'OPTIONS'], csrf=False) def create_partner_sale_order(self, **kw): user_token = self.authenticate() -- cgit v1.2.3 From c68437fc15bd25e00c81001a4d1324a29c50c6bd Mon Sep 17 00:00:00 2001 From: Rafi Zadanly Date: Mon, 13 Feb 2023 17:08:20 +0700 Subject: Bug fix --- indoteknik_api/controllers/api_v1/sale_order.py | 2 +- indoteknik_api/models/account_move.py | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/indoteknik_api/controllers/api_v1/sale_order.py b/indoteknik_api/controllers/api_v1/sale_order.py index 5f888e6c..8fe4b1d5 100644 --- a/indoteknik_api/controllers/api_v1/sale_order.py +++ b/indoteknik_api/controllers/api_v1/sale_order.py @@ -129,7 +129,7 @@ class SaleOrder(controller.Controller): data = {} sale_order = request.env['sale.order'].search(domain) if sale_order: - sale_order.state = 'sale' + sale_order.approval_status = 'pengajuan1' data = request.env['sale.order'].api_v1_single_response(sale_order, context='with_detail') return self.response(data) 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': [], -- cgit v1.2.3 From 4a7d62d40a47ae894e2e22171105332ada9516ee Mon Sep 17 00:00:00 2001 From: stephanchrst Date: Mon, 20 Feb 2023 09:52:14 +0700 Subject: add date order in midtrans --- indoteknik_api/controllers/api_v1/sale_order.py | 1 + 1 file changed, 1 insertion(+) diff --git a/indoteknik_api/controllers/api_v1/sale_order.py b/indoteknik_api/controllers/api_v1/sale_order.py index 1c67d6c5..e140605c 100644 --- a/indoteknik_api/controllers/api_v1/sale_order.py +++ b/indoteknik_api/controllers/api_v1/sale_order.py @@ -37,6 +37,7 @@ class SaleOrder(controller.Controller): 'id': sale.id, 'name': sale.name, 'amount_total': sale.amount_total, + 'date_order': sale.date_order, 'state': sale.state, 'product_name': product_name, 'product_not_in_id': product_not_in_id, -- cgit v1.2.3 From 28a205be163323cfad8596bbbcf0d1f7b3e4b993 Mon Sep 17 00:00:00 2001 From: stephanchrst Date: Mon, 20 Feb 2023 10:48:33 +0700 Subject: fix error date conversion to str --- indoteknik_api/controllers/api_v1/sale_order.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indoteknik_api/controllers/api_v1/sale_order.py b/indoteknik_api/controllers/api_v1/sale_order.py index 84c34a7d..f6c6faa5 100644 --- a/indoteknik_api/controllers/api_v1/sale_order.py +++ b/indoteknik_api/controllers/api_v1/sale_order.py @@ -37,7 +37,7 @@ class SaleOrder(controller.Controller): 'id': sale.id, 'name': sale.name, 'amount_total': sale.amount_total, - 'date_order': sale.date_order, + 'date_order': self.time_to_str(sale.date_order, '%d/%m/%Y %H:%M:%S'), 'state': sale.state, 'product_name': product_name, 'product_not_in_id': product_not_in_id, -- cgit v1.2.3 From b9cf801ad8334fe1b5be7b13b5d0483303c297c7 Mon Sep 17 00:00:00 2001 From: stephanchrst Date: Mon, 20 Feb 2023 11:29:15 +0700 Subject: add details in sale order api midtrans --- indoteknik_api/controllers/api_v1/sale_order.py | 1 + indoteknik_api/models/sale_order.py | 15 +++++++++++++++ 2 files changed, 16 insertions(+) diff --git a/indoteknik_api/controllers/api_v1/sale_order.py b/indoteknik_api/controllers/api_v1/sale_order.py index f6c6faa5..727d49b7 100644 --- a/indoteknik_api/controllers/api_v1/sale_order.py +++ b/indoteknik_api/controllers/api_v1/sale_order.py @@ -41,6 +41,7 @@ class SaleOrder(controller.Controller): 'state': sale.state, '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) diff --git a/indoteknik_api/models/sale_order.py b/indoteknik_api/models/sale_order.py index 7ce8ff61..66ef27fa 100644 --- a/indoteknik_api/models/sale_order.py +++ b/indoteknik_api/models/sale_order.py @@ -63,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 -- cgit v1.2.3 From e4cd78fc169df2ad092023ab5ffda3fa639d8704 Mon Sep 17 00:00:00 2001 From: stephanchrst Date: Mon, 20 Feb 2023 11:32:01 +0700 Subject: add amount --- indoteknik_api/controllers/api_v1/sale_order.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/indoteknik_api/controllers/api_v1/sale_order.py b/indoteknik_api/controllers/api_v1/sale_order.py index 727d49b7..4d27312e 100644 --- a/indoteknik_api/controllers/api_v1/sale_order.py +++ b/indoteknik_api/controllers/api_v1/sale_order.py @@ -39,6 +39,9 @@ class SaleOrder(controller.Controller): '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] -- cgit v1.2.3 From 30548ae7462eebbf28ffad5398d0510541f462c0 Mon Sep 17 00:00:00 2001 From: stephanchrst Date: Mon, 20 Feb 2023 11:34:12 +0700 Subject: remove duplicate --- indoteknik_api/controllers/api_v1/sale_order.py | 1 - 1 file changed, 1 deletion(-) diff --git a/indoteknik_api/controllers/api_v1/sale_order.py b/indoteknik_api/controllers/api_v1/sale_order.py index 4d27312e..15dcf0ba 100644 --- a/indoteknik_api/controllers/api_v1/sale_order.py +++ b/indoteknik_api/controllers/api_v1/sale_order.py @@ -36,7 +36,6 @@ 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, -- cgit v1.2.3 From 78e791eb0c0d28a02fd4417d5d0761066c271c86 Mon Sep 17 00:00:00 2001 From: stephanchrst Date: Tue, 21 Feb 2023 10:51:53 +0700 Subject: refactor function notification in midtrans, complicated with wati --- indoteknik_api/controllers/api_v1/midtrans.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indoteknik_api/controllers/api_v1/midtrans.py b/indoteknik_api/controllers/api_v1/midtrans.py index fdc801d3..2adf3c50 100644 --- a/indoteknik_api/controllers/api_v1/midtrans.py +++ b/indoteknik_api/controllers/api_v1/midtrans.py @@ -8,7 +8,7 @@ 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'] -- cgit v1.2.3 From 093b0160a1f6146e93cb0294341d65dcee707d9c Mon Sep 17 00:00:00 2001 From: stephanchrst Date: Tue, 21 Feb 2023 10:59:31 +0700 Subject: only save withour parsing data json in midtrans notification --- indoteknik_api/controllers/api_v1/midtrans.py | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/indoteknik_api/controllers/api_v1/midtrans.py b/indoteknik_api/controllers/api_v1/midtrans.py index 2adf3c50..d5c91cb4 100644 --- a/indoteknik_api/controllers/api_v1/midtrans.py +++ b/indoteknik_api/controllers/api_v1/midtrans.py @@ -10,17 +10,18 @@ class Midtrans(controller.Controller): @http.route(prefix + 'midtrans/notification', auth='none', type='json', csrf=False, cors='*', methods=['POST', 'OPTIONS']) 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 -- cgit v1.2.3 From e4158dc69c7d6bca17970dfbc838d9c29a76bd2b Mon Sep 17 00:00:00 2001 From: stephanchrst Date: Tue, 21 Feb 2023 12:01:57 +0700 Subject: scheduler for parsing midtrans notification --- indoteknik_custom/models/midtrans.py | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/indoteknik_custom/models/midtrans.py b/indoteknik_custom/models/midtrans.py index 76dee447..df14c129 100644 --- a/indoteknik_custom/models/midtrans.py +++ b/indoteknik_custom/models/midtrans.py @@ -1,5 +1,6 @@ from odoo import fields, models, api import logging +import json _logger = logging.getLogger(__name__) @@ -24,6 +25,30 @@ class MidtransNotification(models.Model): ('authorize', 'Authorize'), ], string='Payment Status', help='Payment Gateway Status / Midtrans / Web, https://docs.midtrans.com/en/after-payment/status-cycle') + payment_type = fields.Char(string='Payment Type', help='Jenis pembayaran dengan Midtrans') + gross_amount = fields.Float(string='Gross Amount', help='Jumlah pembayaran yang dilakukan dengan Midtrans') + + def _parse_notification(self): + query = [ + ('payment_status', '=', False) + ] + notifications = self.env['midtrans.notification'].search(query, order='id') + for notif in notifications: + payment_status = json.loads(notif.json_raw)['transaction_status'] + payment_type = json.loads(notif.json_raw)['payment_type'] + gross_amount = json.loads(notif.json_raw)['gross_amount'] + order_id = json.loads(notif.json_raw)['order_id'] + + orders = order_id.split('_') + order = orders[0] + sale_order = self.env['sale.order'].search([('name', '=', order)], limit=1) + + notif.payment_status = payment_status + notif.payment_type = payment_type + notif.gross_amount = gross_amount + notif.sale_order_id = sale_order.id + + _logger.info('Success Parsing Midtrans Notification %s' % notif.id) class MidtransRecurring(models.Model): -- cgit v1.2.3 From c2105f6b0efdd0bb74b934205bb0acc43b297bdc Mon Sep 17 00:00:00 2001 From: stephanchrst Date: Tue, 21 Feb 2023 13:07:57 +0700 Subject: sale order set midtrans status and others --- indoteknik_custom/models/midtrans.py | 8 ++++---- indoteknik_custom/models/sale_order.py | 2 ++ 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/indoteknik_custom/models/midtrans.py b/indoteknik_custom/models/midtrans.py index df14c129..11b10292 100644 --- a/indoteknik_custom/models/midtrans.py +++ b/indoteknik_custom/models/midtrans.py @@ -25,8 +25,6 @@ class MidtransNotification(models.Model): ('authorize', 'Authorize'), ], string='Payment Status', help='Payment Gateway Status / Midtrans / Web, https://docs.midtrans.com/en/after-payment/status-cycle') - payment_type = fields.Char(string='Payment Type', help='Jenis pembayaran dengan Midtrans') - gross_amount = fields.Float(string='Gross Amount', help='Jumlah pembayaran yang dilakukan dengan Midtrans') def _parse_notification(self): query = [ @@ -44,10 +42,12 @@ class MidtransNotification(models.Model): sale_order = self.env['sale.order'].search([('name', '=', order)], limit=1) notif.payment_status = payment_status - notif.payment_type = payment_type - notif.gross_amount = gross_amount notif.sale_order_id = sale_order.id + sale_order.payment_type = payment_type + sale_order.gross_amount = gross_amount + sale_order.payment_status = payment_status + _logger.info('Success Parsing Midtrans Notification %s' % notif.id) diff --git a/indoteknik_custom/models/sale_order.py b/indoteknik_custom/models/sale_order.py index 519e55ce..35f1af8e 100755 --- a/indoteknik_custom/models/sale_order.py +++ b/indoteknik_custom/models/sale_order.py @@ -67,6 +67,8 @@ class SaleOrder(models.Model): ('authorize', 'Authorize'), ], string='Payment Status', help='Payment Gateway Status / Midtrans / Web, https://docs.midtrans.com/en/after-payment/status-cycle') date_doc_kirim = fields.Datetime(string='Tanggal Kirim di SJ', help="Tanggal Kirim di cetakan SJ yang terakhir, tidak berpengaruh ke Accounting") + payment_type = fields.Char(string='Payment Type', help='Jenis pembayaran dengan Midtrans') + gross_amount = fields.Float(string='Gross Amount', help='Jumlah pembayaran yang dilakukan dengan Midtrans') def calculate_line_no(self): line_no = 0 -- cgit v1.2.3 From e2e755caeb00b12f469841a9b17db135790cbd32 Mon Sep 17 00:00:00 2001 From: stephanchrst Date: Tue, 21 Feb 2023 13:35:14 +0700 Subject: add cron for parsing midtrans notification --- indoteknik_custom/__manifest__.py | 1 + indoteknik_custom/views/midtrans.xml | 14 ++++++++++++++ 2 files changed, 15 insertions(+) create mode 100644 indoteknik_custom/views/midtrans.xml diff --git a/indoteknik_custom/__manifest__.py b/indoteknik_custom/__manifest__.py index a794a822..243b3028 100755 --- a/indoteknik_custom/__manifest__.py +++ b/indoteknik_custom/__manifest__.py @@ -62,6 +62,7 @@ 'views/leads_monitoring.xml', 'views/ip_lookup.xml', 'views/wati.xml', + 'views/midtrans.xml', 'report/report.xml', 'report/report_banner_banner.xml', 'report/report_banner_banner2.xml', diff --git a/indoteknik_custom/views/midtrans.xml b/indoteknik_custom/views/midtrans.xml new file mode 100644 index 00000000..487e7b7e --- /dev/null +++ b/indoteknik_custom/views/midtrans.xml @@ -0,0 +1,14 @@ + + + + Midtrans: Parsing Notification + 17 + minutes + -1 + + + model._parse_notification() + code + 29 + + -- cgit v1.2.3 From d67936f7c5f2e471690d0dc682b8ed97f4097e22 Mon Sep 17 00:00:00 2001 From: stephanchrst Date: Tue, 21 Feb 2023 13:43:01 +0700 Subject: replace strip with slash if searching sale order midtrans --- indoteknik_custom/models/midtrans.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indoteknik_custom/models/midtrans.py b/indoteknik_custom/models/midtrans.py index 11b10292..c99c8410 100644 --- a/indoteknik_custom/models/midtrans.py +++ b/indoteknik_custom/models/midtrans.py @@ -38,7 +38,7 @@ class MidtransNotification(models.Model): order_id = json.loads(notif.json_raw)['order_id'] orders = order_id.split('_') - order = orders[0] + order = orders[0].replace('-', '/') sale_order = self.env['sale.order'].search([('name', '=', order)], limit=1) notif.payment_status = payment_status -- cgit v1.2.3 From 644093559480ed41b53de9f265f1ad508f8cae79 Mon Sep 17 00:00:00 2001 From: stephanchrst Date: Tue, 21 Feb 2023 13:51:27 +0700 Subject: add midtrans info in sale order form --- indoteknik_custom/views/sale_order.xml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/indoteknik_custom/views/sale_order.xml b/indoteknik_custom/views/sale_order.xml index ff684451..d6df24a0 100755 --- a/indoteknik_custom/views/sale_order.xml +++ b/indoteknik_custom/views/sale_order.xml @@ -69,13 +69,18 @@ - + + + + + + -- cgit v1.2.3 From b9eddb17ac8eeed2b8af734844bb1149ec4184eb Mon Sep 17 00:00:00 2001 From: stephanchrst Date: Tue, 21 Feb 2023 14:29:50 +0700 Subject: change json raw to json dump in midtrans recurring and payaccount --- indoteknik_api/controllers/api_v1/midtrans.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/indoteknik_api/controllers/api_v1/midtrans.py b/indoteknik_api/controllers/api_v1/midtrans.py index d5c91cb4..49ebce0f 100644 --- a/indoteknik_api/controllers/api_v1/midtrans.py +++ b/indoteknik_api/controllers/api_v1/midtrans.py @@ -29,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 -- cgit v1.2.3 From 2a5d4886d2924ef9dae451c841dc3bae9478f9ab Mon Sep 17 00:00:00 2001 From: Rafi Zadanly Date: Wed, 22 Feb 2023 15:52:40 +0700 Subject: fix sale order status --- indoteknik_api/models/sale_order.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/indoteknik_api/models/sale_order.py b/indoteknik_api/models/sale_order.py index 7ce8ff61..398d1ef5 100644 --- a/indoteknik_api/models/sale_order.py +++ b/indoteknik_api/models/sale_order.py @@ -33,9 +33,9 @@ class SaleOrder(models.Model): picking_count['assigned'] += 1 if picking.state == 'done': picking_count['done'] += 1 - if picking_count['assigned'] > 0: + if picking_count['done'] > 0: data['status'] = 'shipping' - if picking_count['done'] > 0: + if picking_count['assigned'] > 0: data['status'] = 'partial_shipping' if sale_order.state == 'done': data['status'] = 'done' -- cgit v1.2.3 From 5fdade43dd264f834a52194b22a9d687c4dc6aab Mon Sep 17 00:00:00 2001 From: Rafi Zadanly Date: Wed, 22 Feb 2023 17:08:53 +0700 Subject: user company request and register logic --- indoteknik_api/controllers/api_v1/user.py | 32 ++++++++++++++-- indoteknik_custom/__manifest__.py | 1 + indoteknik_custom/models/__init__.py | 1 + indoteknik_custom/models/user_company_request.py | 15 ++++++++ indoteknik_custom/security/ir.model.access.csv | 3 +- indoteknik_custom/views/user_company_request.xml | 49 ++++++++++++++++++++++++ 6 files changed, 96 insertions(+), 5 deletions(-) create mode 100644 indoteknik_custom/models/user_company_request.py create mode 100644 indoteknik_custom/views/user_company_request.xml 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_custom/__manifest__.py b/indoteknik_custom/__manifest__.py index 243b3028..5a3ffe0a 100755 --- a/indoteknik_custom/__manifest__.py +++ b/indoteknik_custom/__manifest__.py @@ -25,6 +25,7 @@ 'views/sale_monitoring.xml', 'views/sale_monitoring_detail.xml', 'views/user_activity_log.xml', + 'views/user_company_request.xml', 'views/vit_kelurahan.xml', 'views/vit_kecamatan.xml', 'views/vit_kota.xml', diff --git a/indoteknik_custom/models/__init__.py b/indoteknik_custom/models/__init__.py index 62a024e3..4cb8bdda 100755 --- a/indoteknik_custom/models/__init__.py +++ b/indoteknik_custom/models/__init__.py @@ -32,6 +32,7 @@ from . import stock_picking_type from . import stock_picking from . import stock_vendor from . import user_activity_log +from . import user_company_request from . import users from . import website_brand_homepage from . import website_categories_homepage diff --git a/indoteknik_custom/models/user_company_request.py b/indoteknik_custom/models/user_company_request.py new file mode 100644 index 00000000..c69b789c --- /dev/null +++ b/indoteknik_custom/models/user_company_request.py @@ -0,0 +1,15 @@ +from odoo import models, fields + + +class UserCompanyRequest(models.Model): + _name = 'user.company.request' + _rec_name = 'user_id' + + user_id = fields.Many2one('res.partner', string='User') + user_company_id = fields.Many2one('res.partner', string='Company') + user_input = fields.Char(string='User Input') + is_approve = fields.Selection([ + ('approved', 'Approve'), + ('rejected', 'Reject'), + ], string='Approval') + \ No newline at end of file diff --git a/indoteknik_custom/security/ir.model.access.csv b/indoteknik_custom/security/ir.model.access.csv index 977f3a1b..26c1bd73 100755 --- a/indoteknik_custom/security/ir.model.access.csv +++ b/indoteknik_custom/security/ir.model.access.csv @@ -33,4 +33,5 @@ access_midtrans_recurring,access.midtrans.recurring,model_midtrans_recurring,,1, access_midtrans_account,access.midtrans.account,model_midtrans_account,,1,1,1,1 access_ip_lookup,access.ip.lookup,model_ip_lookup,,1,1,1,1 access_ip_lookup_line,access.ip.lookup.line,model_ip_lookup_line,,1,1,1,1 -access_wati_notification,access.wati.notification,model_wati_notification,,1,1,1,1 \ No newline at end of file +access_wati_notification,access.wati.notification,model_wati_notification,,1,1,1,1 +access_user_company_request,access.user.company.request,model_user_company_request,,1,1,1,1 \ No newline at end of file diff --git a/indoteknik_custom/views/user_company_request.xml b/indoteknik_custom/views/user_company_request.xml new file mode 100644 index 00000000..a44a48e0 --- /dev/null +++ b/indoteknik_custom/views/user_company_request.xml @@ -0,0 +1,49 @@ + + + + user.company.request.tree + user.company.request + + + + + + + + + + + + user.company.request.form + user.company.request + +
+ + + + + + + + + + +
+
+
+ + + User Company Request + ir.actions.act_window + user.company.request + tree,form + + + +
\ No newline at end of file -- cgit v1.2.3 From 5c9214c1c846e61c5356e1b19341b070c2303198 Mon Sep 17 00:00:00 2001 From: Rafi Zadanly Date: Thu, 23 Feb 2023 10:39:40 +0700 Subject: partner company type and edit partner data --- indoteknik_api/controllers/api_v1/partner.py | 57 ++++++++++++++++++++++ indoteknik_api/models/res_users.py | 7 ++- indoteknik_custom/__manifest__.py | 1 + indoteknik_custom/models/__init__.py | 1 + indoteknik_custom/models/res_partner.py | 1 + .../models/res_partner_company_type.py | 7 +++ indoteknik_custom/security/ir.model.access.csv | 3 +- indoteknik_custom/views/res_partner.xml | 3 ++ .../views/res_partner_company_type.xml | 43 ++++++++++++++++ indoteknik_custom/views/user_company_request.xml | 2 +- 10 files changed, 122 insertions(+), 3 deletions(-) create mode 100644 indoteknik_custom/models/res_partner_company_type.py create mode 100644 indoteknik_custom/views/res_partner_company_type.xml diff --git a/indoteknik_api/controllers/api_v1/partner.py b/indoteknik_api/controllers/api_v1/partner.py index 09b3caa0..8c7dbd57 100644 --- a/indoteknik_api/controllers/api_v1/partner.py +++ b/indoteknik_api/controllers/api_v1/partner.py @@ -81,3 +81,60 @@ class Partner(controller.Controller): 'id': partner.id, }) + @http.route(prefix + 'partner/', auth='public', methods=['PUT', 'OPTIONS'], csrf=False) + def write_partner_by_id(self, **kw): + if not self.authenticate(): + return self.response(code=401, description='Unauthorized') + + 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') + + 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/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_custom/__manifest__.py b/indoteknik_custom/__manifest__.py index 5a3ffe0a..449fd09c 100755 --- a/indoteknik_custom/__manifest__.py +++ b/indoteknik_custom/__manifest__.py @@ -16,6 +16,7 @@ 'views/delivery_order.xml', 'views/product_pricelist.xml', 'views/res_groups.xml', + 'views/res_partner_company_type.xml', 'views/res_partner.xml', 'views/product_pricelist_item.xml', 'views/product_public_category.xml', diff --git a/indoteknik_custom/models/__init__.py b/indoteknik_custom/models/__init__.py index 4cb8bdda..ebbf2e09 100755 --- a/indoteknik_custom/models/__init__.py +++ b/indoteknik_custom/models/__init__.py @@ -19,6 +19,7 @@ from . import purchase_order_line from . import purchase_order from . import purchase_outstanding from . import purchase_pricelist +from . import res_partner_company_type from . import res_partner from . import res_users from . import sale_monitoring_detail diff --git a/indoteknik_custom/models/res_partner.py b/indoteknik_custom/models/res_partner.py index 403245fb..1cdf7c72 100644 --- a/indoteknik_custom/models/res_partner.py +++ b/indoteknik_custom/models/res_partner.py @@ -5,3 +5,4 @@ class ResPartner(models.Model): _inherit = 'res.partner' reference_number = fields.Char(string="Reference Number") + company_type_id = fields.Many2one('res.partner.company_type', string='Company Type') diff --git a/indoteknik_custom/models/res_partner_company_type.py b/indoteknik_custom/models/res_partner_company_type.py new file mode 100644 index 00000000..2bd356a1 --- /dev/null +++ b/indoteknik_custom/models/res_partner_company_type.py @@ -0,0 +1,7 @@ +from odoo import models, fields + + +class ResPartnerCompanyType(models.Model): + _name = 'res.partner.company_type' + + name = fields.Char('Name') \ No newline at end of file diff --git a/indoteknik_custom/security/ir.model.access.csv b/indoteknik_custom/security/ir.model.access.csv index 26c1bd73..d5142381 100755 --- a/indoteknik_custom/security/ir.model.access.csv +++ b/indoteknik_custom/security/ir.model.access.csv @@ -34,4 +34,5 @@ access_midtrans_account,access.midtrans.account,model_midtrans_account,,1,1,1,1 access_ip_lookup,access.ip.lookup,model_ip_lookup,,1,1,1,1 access_ip_lookup_line,access.ip.lookup.line,model_ip_lookup_line,,1,1,1,1 access_wati_notification,access.wati.notification,model_wati_notification,,1,1,1,1 -access_user_company_request,access.user.company.request,model_user_company_request,,1,1,1,1 \ No newline at end of file +access_user_company_request,access.user.company.request,model_user_company_request,,1,1,1,1 +access_res_partner_company_type,access.res.partner.company_type,model_res_partner_company_type,,1,1,1,1 \ No newline at end of file diff --git a/indoteknik_custom/views/res_partner.xml b/indoteknik_custom/views/res_partner.xml index 673718c4..47f41ab2 100644 --- a/indoteknik_custom/views/res_partner.xml +++ b/indoteknik_custom/views/res_partner.xml @@ -9,6 +9,9 @@ + + + diff --git a/indoteknik_custom/views/res_partner_company_type.xml b/indoteknik_custom/views/res_partner_company_type.xml new file mode 100644 index 00000000..ed21c1c9 --- /dev/null +++ b/indoteknik_custom/views/res_partner_company_type.xml @@ -0,0 +1,43 @@ + + + + res.partner.company_type.tree + res.partner.company_type + + + + + + + + + res.partner.company_type.form + res.partner.company_type + +
+ + + + + + + +
+
+
+ + + Company Type + ir.actions.act_window + res.partner.company_type + tree,form + + + +
\ No newline at end of file diff --git a/indoteknik_custom/views/user_company_request.xml b/indoteknik_custom/views/user_company_request.xml index a44a48e0..0b787683 100644 --- a/indoteknik_custom/views/user_company_request.xml +++ b/indoteknik_custom/views/user_company_request.xml @@ -43,7 +43,7 @@ id="menu_user_company_request" name="User Company Request" parent="contacts.menu_contacts" - sequence="5" + sequence="3" action="action_user_company_request" /> \ No newline at end of file -- cgit v1.2.3 From b94e4ff577c023d0ce1717c01c6080efc988acb7 Mon Sep 17 00:00:00 2001 From: stephanchrst Date: Thu, 23 Feb 2023 10:44:53 +0700 Subject: change scheduled action to automated action for parsing midtrans --- indoteknik_custom/views/midtrans.xml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/indoteknik_custom/views/midtrans.xml b/indoteknik_custom/views/midtrans.xml index 487e7b7e..1773b9fd 100644 --- a/indoteknik_custom/views/midtrans.xml +++ b/indoteknik_custom/views/midtrans.xml @@ -9,6 +9,7 @@ model._parse_notification() code - 29 + 100 + False -- cgit v1.2.3 From 58602284da96024060a553e12245638004d8f95f Mon Sep 17 00:00:00 2001 From: Rafi Zadanly Date: Thu, 23 Feb 2023 10:51:39 +0700 Subject: add secure on write partner data --- indoteknik_api/controllers/api_v1/partner.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/indoteknik_api/controllers/api_v1/partner.py b/indoteknik_api/controllers/api_v1/partner.py index 8c7dbd57..ba59a1ce 100644 --- a/indoteknik_api/controllers/api_v1/partner.py +++ b/indoteknik_api/controllers/api_v1/partner.py @@ -83,8 +83,9 @@ class Partner(controller.Controller): @http.route(prefix + 'partner/', auth='public', methods=['PUT', 'OPTIONS'], csrf=False) def write_partner_by_id(self, **kw): - if not self.authenticate(): - return self.response(code=401, description='Unauthorized') + user_token = self.authenticate() + if not user_token: + return self.unauthorized_response() params = self.get_request_params(kw, { 'id': ['required', 'number'], @@ -101,7 +102,10 @@ class Partner(controller.Controller): 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({ -- cgit v1.2.3 From 029e8fce907060de2a2514b5abc731f4cd9da96e Mon Sep 17 00:00:00 2001 From: Rafi Zadanly Date: Fri, 24 Feb 2023 15:44:15 +0700 Subject: User company request approve and reject action --- indoteknik_custom/models/user_company_request.py | 16 ++++++++++++++++ indoteknik_custom/views/user_company_request.xml | 17 ++++++++++++++--- 2 files changed, 30 insertions(+), 3 deletions(-) diff --git a/indoteknik_custom/models/user_company_request.py b/indoteknik_custom/models/user_company_request.py index c69b789c..2467261a 100644 --- a/indoteknik_custom/models/user_company_request.py +++ b/indoteknik_custom/models/user_company_request.py @@ -1,4 +1,5 @@ from odoo import models, fields +from odoo.exceptions import UserError class UserCompanyRequest(models.Model): @@ -12,4 +13,19 @@ class UserCompanyRequest(models.Model): ('approved', 'Approve'), ('rejected', 'Reject'), ], string='Approval') + + def write(self, vals): + is_approve = vals.get('is_approve') + if self.is_approve and is_approve: + raise UserError('Tidak dapat mengubah approval yang sudah diisi') + + if not self.is_approve and is_approve: + if is_approve == 'approved': + self.user_id.parent_id = self.user_company_id.id + else: + new_company = self.env['res.partner'].create({ + 'name': self.user_input + }) + self.user_id.parent_id = new_company.id + return super(UserCompanyRequest, self).write(vals) \ No newline at end of file diff --git a/indoteknik_custom/views/user_company_request.xml b/indoteknik_custom/views/user_company_request.xml index 0b787683..2efc1e9b 100644 --- a/indoteknik_custom/views/user_company_request.xml +++ b/indoteknik_custom/views/user_company_request.xml @@ -4,11 +4,17 @@ user.company.request.tree user.company.request - + - + + @@ -24,7 +30,12 @@ - + -- cgit v1.2.3