from .. import controller from odoo import http from odoo.http import request import json class Sales(controller.Controller): _name = 'sale.order' prefix = '/api/v1/' @http.route(prefix + 'sale/', auth='public', methods=['GET', 'OPTIONS']) @controller.Controller.must_authorized() def get_sale_order(self, **kw): sale_id = int(kw.get('id', '0')) ref = str(kw.get('ref', '0')) if sale_id == 0 and ref == '0': return self.response(code=500, description='Internal Server Error') if sale_id > 0: query = [('id', '=', sale_id)] else: query = [('client_order_ref', '=', ref)] sale_order = request.env['sale.order'].search(query) data = [] for sale in sale_order: data.append({ 'id': sale.id, 'name': sale.name, 'partner_id': sale.partner_id.id, 'partner_name': sale.partner_id.name, 'date_order': str(sale.date_order), 'ref': sale.client_order_ref, 'details': [request.env['sale.order.line'].api_single_response(x) for x in sale.order_line] }) return self.response(data) @http.route(prefix + 'sale/confirm', auth='public', methods=['POST', 'OPTIONS'], csrf=False) @controller.Controller.must_authorized() def confirm_sale_order(self, **kw): sale_id = int(kw.get('id', '0')) ref = str(kw.get('ref', '0')) if sale_id == 0 and ref == '0': return self.response(code=500, description='Internal Server Error') if sale_id > 0: query = [('id', '=', sale_id)] else: query = [('client_order_ref', '=', ref)] sales = request.env['sale.order'].search(query) data = [] for sale in sales: sale.action_confirm() data.append({ 'id': sale.id, 'name': sale.name, 'state': sale.state }) return self.response(data) @http.route(prefix + 'sale/update_shipper', auth='public', methods=['POST', 'OPTIONS'], csrf=False) @controller.Controller.must_authorized() def update_shipper_sale_order(self, **kw): sale_id = int(kw.get('id', '0')) ref = str(kw.get('ref', '0')) shipper = str(kw.get('shipper', '0')) if sale_id == 0 and ref == '0': return self.response(code=500, description='Internal Server Error') if shipper == '0': return self.response(code=500, description='Internal Server Error') if sale_id > 0: query = [('id', '=', sale_id)] else: query = [('client_order_ref', '=', ref)] sales = request.env['sale.order'].search(query) carrier = request.env['delivery.carrier'].search([('name', '=', shipper)]) if not carrier: return self.response(code=500, description='Internal Server Error') data = [] for sale in sales: sale.carrier_id = carrier.id data.append({ 'id': sale.id, 'name': sale.name, 'shipper': carrier.name }) return self.response(data) @http.route(prefix + 'sale/create', type='json', auth='public', methods=['POST', 'OPTIONS'], csrf=False) @controller.Controller.must_authorized() def create_sale_order(self, **kw): data = request.jsonrequest ginee_shop_id = data['ginee_shop_id'] ref = data['ref'] discount = data['discount'] lines = data['lines'] if ginee_shop_id == '0': return {'status': 'error', 'message': 'partner not found'} partner = request.env['res.partner'].search([('ginee_shop_id', '=', ginee_shop_id)]) if not partner: return {'status': 'error', 'message': 'partner not found'} partner_id = partner.id params = { 'partner_id': partner_id, 'partner_shipping_id': partner_id, 'partner_invoice_id': partner_id, 'client_order_ref': ref, 'company_id': 4, # Fixco Karya Nusantara 'currency_id': 12, # IDR 'user_id': 8, # Web Service it@fixcomart.co.id 'team_id': 6, # Marketplace 'warehouse_id': 4, # Bandengan Tengah 'state': 'draft', 'picking_policy': 'direct' } sale_order = request.env['sale.order'].create(params) param_line = [] for line in lines: item_code = line['item_code'] product = request.env['product.product'].search([('default_code', '=', item_code)]) if not product: return {'status': 'error', 'message': 'product not found'} param_line.append({ 'order_id': sale_order.id, 'product_id': product.id, 'name': product.display_name, 'product_uom_qty': line['qty'], 'price_unit': line['price'], 'tax_id': [13] #tax include }) request.env['sale.order.line'].create(param_line) # create sales discount here if discount > 0: param_line = [{ 'order_id': sale_order.id, 'product_id': 55, # diskon penjualan 'name': 'Diskon Penjualan', 'product_uom_qty': -1, 'price_unit': discount }] request.env['sale.order.line'].create(param_line) sale_order.action_confirm() return { 'status': 'success', 'id': sale_order.id, 'name': sale_order.name, 'ref': sale_order.client_order_ref, 'state': sale_order.state } @http.route(prefix + 'do/confirm', auth='public', methods=['POST', 'OPTIONS'], csrf=False) @controller.Controller.must_authorized() def complete_delivery_order(self, **kw): sale_id = int(kw.get('id', '0')) ref = str(kw.get('ref', '0')) if sale_id == 0 and ref == '0': return self.response(code=500, description='Internal Server Error') if sale_id > 0: query = [('id', '=', sale_id)] else: query = [('client_order_ref', '=', ref)] sales = request.env['sale.order'].search(query) data = [] data_picking = [] for sale in sales: picking_ids = sale.picking_ids # reserved = validated = False for picking in picking_ids: reserved = picking.action_assign() if reserved == True: for line in picking.move_line_ids_without_package: line.qty_done = line.product_uom_qty validated = picking.button_validate() data_picking.append({ 'id': picking.id, 'name': picking.name, 'state': picking.state, 'reserved': reserved, 'validated': str(validated) }) data.append({ 'id': sale.id, 'name': sale.name, 'ref': sale.client_order_ref, 'pickings': data_picking }) return self.response(data) @http.route(prefix + 'invoice/create', auth='public', methods=['POST', 'OPTIONS'], csrf=False) @controller.Controller.must_authorized() def create_invoice(self, **kw): sale_id = int(kw.get('id', '0')) ref = str(kw.get('ref', '0')) if sale_id == 0 and ref == '0': return self.response(code=500, description='Internal Server Error') if sale_id > 0: query = [('id', '=', sale_id)] else: query = [('client_order_ref', '=', ref)] sales = request.env['sale.order'].search(query) invoiced = [] for sale in sales: invoiced = sale.api_create_invoices(sale.id) return self.response(invoiced) @http.route(prefix + 'invoice/paid', auth='public', methods=['POST', 'OPTIONS'], csrf=False) @controller.Controller.must_authorized() def paid_invoice(self, **kw): # action_create_payments in account_payment_register.py sale_id = int(kw.get('id', '0')) ref = str(kw.get('ref', '0')) if sale_id == 0 and ref == '0': return self.response(code=500, description='Internal Server Error') if sale_id > 0: query = [('id', '=', sale_id)] else: query = [('client_order_ref', '=', ref)] sales = request.env['sale.order'].search(query) for sale in sales: for invoice in sale.invoice_ids: invoice._register_payment_automatically() # register = invoice.env['account.payment.register'].create({ # 'journal_id': 24, # 'payment_method_id': 1, # 'partner_bank_id': 5, # 'amount': invoice.amount_total, # 'payment_date': '2024-05-31 08:50:00', # 'communication': invoice.name # }) # register.action_create_payments() return self.response({'status': True})