summaryrefslogtreecommitdiff
path: root/indoteknik_api
diff options
context:
space:
mode:
authorit-fixcomart <it@fixcomart.co.id>2025-03-13 10:11:33 +0700
committerit-fixcomart <it@fixcomart.co.id>2025-03-13 10:11:33 +0700
commited9a8ebd0e3a16ac501da848fd4dbc5ae0ce6ff5 (patch)
tree5585297ea85e86eaa09da2d0c20373fd64bd8c5b /indoteknik_api
parent60de643d4a5f19abc7bee34ccd2e6e6f6219a750 (diff)
parent1ff9a57e2f7a7ecb3ba9321f7133f43e7009aa47 (diff)
Merge branch 'odoo-backup' into CR/renca-banner
Diffstat (limited to 'indoteknik_api')
-rw-r--r--indoteknik_api/controllers/api_v1/partner.py590
-rw-r--r--indoteknik_api/controllers/api_v1/product.py81
-rw-r--r--indoteknik_api/controllers/api_v1/sale_order.py4
-rw-r--r--indoteknik_api/controllers/api_v1/stock_picking.py50
-rw-r--r--indoteknik_api/models/res_partner.py8
5 files changed, 446 insertions, 287 deletions
diff --git a/indoteknik_api/controllers/api_v1/partner.py b/indoteknik_api/controllers/api_v1/partner.py
index 307165b3..126fded4 100644
--- a/indoteknik_api/controllers/api_v1/partner.py
+++ b/indoteknik_api/controllers/api_v1/partner.py
@@ -64,37 +64,43 @@ class Partner(controller.Controller):
@http.route(prefix + 'partner/<id>/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'],
- 'state_id': ['required', 'number', 'alias:state_id'],
- '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'],
- 'longtitude': [],
- 'latitude': [],
- 'address_map': [],
- 'alamat_lengkap_text': []
- })
+ try:
+ params = self.get_request_params(kw, {
+ 'id': ['required', 'number'],
+ 'type': ['default:other'],
+ 'name': ['required'],
+ 'email': ['required'],
+ 'mobile': ['required'],
+ 'phone': [''],
+ 'street': ['required'],
+ 'state_id': ['required', 'number', 'alias:state_id'],
+ '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'],
+ 'longtitude': '',
+ 'latitude': '',
+ 'address_map': [],
+ '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'])
+ if not params['valid']:
+ return self.response(code=400, description=params)
- return self.response({
- 'id': partner.id
- })
+ partner = request.env[self._name].sudo().search([('id', '=', params['value']['id'])], limit=1)
+
+ if not partner:
+ return self.response(code=404, description='User not found')
+
+ try:
+ partner.write(params['value'])
+ except Exception as e:
+ return self.response(code=500, description=f'Error writing partner data: {str(e)}')
+
+ return self.response({'id': partner.id})
+
+ except Exception as e:
+ return self.response(code=500, description=f'Unexpected error: {str(e)}')
@http.route(prefix + 'partner/address', auth='public', methods=['POST', 'OPTIONS'], csrf=False)
@controller.Controller.must_authorized()
@@ -111,8 +117,8 @@ class Partner(controller.Controller):
'city_id': ['required', 'number', 'alias:kota_id'],
'district_id': ['number', 'alias:kecamatan_id'],
'sub_district_id': ['number', 'alias:kelurahan_id', 'exclude_if_null'],
- 'longtitude': [],
- 'latitude': [],
+ 'longtitude': '',
+ 'latitude': '',
'address_map': [],
'zip': ['required']
})
@@ -303,270 +309,310 @@ class Partner(controller.Controller):
@http.route(prefix + 'partner/pengajuan_tempo', auth='public', methods=['POST'], csrf=False)
@controller.Controller.must_authorized()
def write_pengajuan_tempo(self, **kw):
- id = int(kw.get('partner_id'))
- user_id = int(kw.get('user_id'))
- tempo_request = True if kw.get('tempo_request') == 'true' else False
- pengajuan_tempo = request.env['user.pengajuan.tempo'].search([('name_tempo', '=', user_id)], limit=1)
- user = request.env['res.partner'].search([('id', '=', user_id)], limit=1)
- company_name = kw.get('name', pengajuan_tempo.name_tempo.name)
- partner_id = request.env['res.partner'].search([('name', 'like', company_name)], limit=1)
- user_account = self.get_user_by_email(user.email)
-
- params = self.get_request_params(kw, {
-
- # informasi perusahaan
- # 'name': ['required', 'alias:name_tempo'],
- 'industryId': ['alias:industry_id_tempo'],
- 'street': ['alias:street_tempo'],
- 'state': ['alias:state_id_tempo'],
- 'city': ['alias:city_id_tempo'],
- 'district': ['alias:district_id_tempo'],
- 'subDistrict': ['alias:subDistrict_id_tempo'],
- 'zip': ['alias:zip_tempo'],
- 'mobile': ['alias:mobile_tempo'],
- 'bankName': ['alias:bank_name_tempo'],
- 'accountName': ['alias:account_name_tempo'],
- 'accountNumber': ['alias:account_number_tempo'],
- 'website': ['alias:website_tempo'],
- 'estimasi': ['alias:estimasi_tempo'],
- 'portal': ['alias:portal'],
- 'bersedia': ['alias:bersedia'],
- 'tempoDuration': ['alias:tempo_duration'],
- 'tempoLimit': ['alias:tempo_limit'],
-
- # informasi perusahaan
- 'direkturTittle': ['alias:direktur_tittle'],
- 'direkturName': ['alias:direktur_name'],
- 'direkturMobile': ['alias:direktur_mobile'],
- 'direkturEmail': ['alias:direktur_email'],
- 'purchasingTittle': ['alias:purchasing_tittle'],
- 'purchasingName': ['alias:purchasing_name'],
- 'purchasingMobile': ['alias:purchasing_mobile'],
- 'purchasingEmail': ['alias:purchasing_email'],
- 'financeTittle': ['alias:finance_tittle'],
- 'financeName': ['alias:finance_name'],
- 'financeMobile': ['alias:finance_mobile'],
- 'financeEmail': ['alias:finance_email'],
-
- # Pengiriman
- 'PICTittle': ['alias:pic_tittle'],
- 'PICName': ['alias:pic_name'],
- 'streetPengiriman': ['alias:street_pengiriman'],
- 'statePengiriman': ['alias:state_id_pengiriman'],
- 'cityPengiriman': ['alias:city_id_pengiriman'],
- 'districtPengiriman': ['alias:district_id_pengiriman'],
- 'subDistrictPengiriman': ['alias:subDistrict_id_pengiriman'],
- 'zipPengiriman': ['alias:zip_pengiriman'],
- 'invoicePicTittle': ['alias:invoice_pic_tittle'],
- 'invoicePic': ['alias:invoice_pic'],
- 'streetInvoice': ['alias:street_invoice'],
- 'stateInvoice': ['alias:state_id_invoice'],
- 'cityInvoice': ['alias:city_id_invoice'],
- 'districtInvoice': ['alias:district_id_invoice'],
- 'subDistrictInvoice': ['alias:subDistrict_id_invoice'],
- 'zipInvoice': ['alias:zip_invoice'],
- 'isSameAddrees':['alias:is_same_address'],
- 'isSameAddreesStreet':['alias:is_same_address_street'],
- })
-
- # # Konversi nilai 'true' ke boolean True
- # is_same_address = kw.get('isSameAddrees', 'false').lower() == 'true'
- # is_same_address_street = kw.get('isSameAddreesStreet', 'false').lower() == 'true'
- #
- # # Tambahkan nilai yang dikonversi ke params
- # if 'isSameAddress' in kw:
- # params['value']['is_same_address'] = is_same_address
- # if 'is_same_address_street' in kw:
- # params['value']['is_same_address_street'] = is_same_address_street
+ try:
+ id = int(kw.get('partner_id'))
+ user_id = int(kw.get('user_id'))
+ tempo_request = True if kw.get('tempo_request') == 'true' else False
+ pengajuan_tempo = request.env['user.pengajuan.tempo'].search([('name_tempo', '=', user_id)], limit=1)
+ user = request.env['res.partner'].search([('id', '=', user_id)], limit=1)
+ company_name = kw.get('name', pengajuan_tempo.name_tempo.name)
+ partner_id = request.env['res.partner'].search([('name', 'like', company_name)], limit=1)
+ user_account = self.get_user_by_email(user.email)
+ dokumen_prosedur = False
+ if kw.get('formDokumenProsedur') and kw.get('formDokumenProsedur') != 'false':
+ dokumen_prosedur = kw.get('formDokumenProsedur')
+ params = self.get_request_params(kw, {
+
+ # informasi perusahaan
+ # 'name': ['required', 'alias:name_tempo'],
+ 'industryId': ['alias:industry_id_tempo'],
+ 'street': ['alias:street_tempo'],
+ 'state': ['alias:state_id_tempo'],
+ 'city': ['alias:city_id_tempo'],
+ 'district': ['alias:district_id_tempo'],
+ 'subDistrict': ['alias:subDistrict_id_tempo'],
+ 'zip': ['alias:zip_tempo'],
+ 'mobile': ['alias:mobile_tempo'],
+ 'bankName': ['alias:bank_name_tempo'],
+ 'accountName': ['alias:account_name_tempo'],
+ 'accountNumber': ['alias:account_number_tempo'],
+ 'website': ['alias:website_tempo'],
+ 'estimasi': ['alias:estimasi_tempo'],
+ 'portal': ['alias:portal'],
+ 'bersedia': ['alias:bersedia'],
+ 'tempoDuration': ['alias:tempo_duration'],
+ 'tempoLimit': ['alias:tempo_limit'],
+
+ # informasi perusahaan
+ 'direkturTittle': ['alias:direktur_tittle'],
+ 'direkturName': ['alias:direktur_name'],
+ 'direkturMobile': ['alias:direktur_mobile'],
+ 'direkturEmail': ['alias:direktur_email'],
+ 'purchasingTittle': ['alias:purchasing_tittle'],
+ 'purchasingName': ['alias:purchasing_name'],
+ 'purchasingMobile': ['alias:purchasing_mobile'],
+ 'purchasingEmail': ['alias:purchasing_email'],
+ 'financeTittle': ['alias:finance_tittle'],
+ 'financeName': ['alias:finance_name'],
+ 'financeMobile': ['alias:finance_mobile'],
+ 'financeEmail': ['alias:finance_email'],
+
+ # Pengiriman
+ 'PICTittle': ['alias:pic_tittle'],
+ 'PICBarangMobile': ['alias:pic_mobile'],
+ 'PICName': ['alias:pic_name'],
+ 'streetPengiriman': ['alias:street_pengiriman'],
+ 'statePengiriman': ['alias:state_id_pengiriman'],
+ 'cityPengiriman': ['alias:city_id_pengiriman'],
+ 'districtPengiriman': ['alias:district_id_pengiriman'],
+ 'subDistrictPengiriman': ['alias:subDistrict_id_pengiriman'],
+ 'zipPengiriman': ['alias:zip_pengiriman'],
+ 'invoicePicTittle': ['alias:invoice_pic_tittle'],
+ 'invoicePicMobile': ['alias:invoice_pic_mobile'],
+ 'invoicePic': ['alias:invoice_pic'],
+ 'streetInvoice': ['alias:street_invoice'],
+ 'stateInvoice': ['alias:state_id_invoice'],
+ 'cityInvoice': ['alias:city_id_invoice'],
+ 'districtInvoice': ['alias:district_id_invoice'],
+ 'subDistrictInvoice': ['alias:subDistrict_id_invoice'],
+ 'zipInvoice': ['alias:zip_invoice'],
+ 'isSameAddrees':['alias:is_same_address'],
+ 'isSameAddreesStreet':['alias:is_same_address_street'],
+ })
- if not params['valid']:
- return self.response(code=400, description=params)
- if params['value']['portal']:
- if params['value']['portal'] == 'ada':
- params['value']['portal'] = True
+ # # Konversi nilai 'true' ke boolean True
+ # is_same_address = kw.get('isSameAddrees', 'false').lower() == 'true'
+ # is_same_address_street = kw.get('isSameAddreesStreet', 'false').lower() == 'true'
+ #
+ # # Tambahkan nilai yang dikonversi ke params
+ # if 'isSameAddress' in kw:
+ # params['value']['is_same_address'] = is_same_address
+ # if 'is_same_address_street' in kw:
+ # params['value']['is_same_address_street'] = is_same_address_street
+
+ if not params['valid']:
+ return self.response(code=400, description=params)
+ if params['value']['portal']:
+ if params['value']['portal'] == 'ada':
+ params['value']['portal'] = True
+ else:
+ params['value']['portal'] = False
+ # Filter data baru yang dikirim (non-kosong, boolean False tetap masuk)
+ new_data = {key: value for key, value in params['value'].items() if value != ''}
+
+ if pengajuan_tempo:
+ try:
+ pengajuan_tempo.write(new_data)
+ except Exception as e:
+ return self.response(code=500, description=f'Error updating partner data: {str(e)}')
else:
- params['value']['portal'] = False
- # Filter data baru yang dikirim (non-kosong, boolean False tetap masuk)
- new_data = {key: value for key, value in params['value'].items() if value != ''}
+ try:
+ pengajuan_tempo = request.env['user.pengajuan.tempo'].create(new_data)
+ pengajuan_tempo.partner_id = user_id
+ except Exception as e:
+ return self.response(code=500, description=f'Error creating partner data: {str(e)}')
+
+ if partner_id:
+ try:
+ pengajuan_tempo.name_tempo = partner_id
+ except Exception as e:
+ return self.response(code=500, description=f'Error updating partner data: {str(e)}')
+
+ # Prosedur Pengiriman
+ if dokumen_prosedur:
+ dokumen_prosedur = json.loads(dokumen_prosedur)
+ mimetype, _ = mimetypes.guess_type(dokumen_prosedur['name'])
+ mimetype = mimetype or 'application/octet-stream'
+ data = base64.b64decode(dokumen_prosedur['base64'])
+ dokumen_prosedur_attachment = request.env['ir.attachment'].create({
+ 'name': dokumen_prosedur['name'],
+ 'type': 'binary',
+ 'datas': base64.b64encode(data),
+ 'res_model': 'user.pengajuan.tempo',
+ 'res_id': pengajuan_tempo.id,
+ 'mimetype': mimetype
+ })
+ pengajuan_tempo.dokumen_prosedur = [(6, 0, [dokumen_prosedur_attachment.id])]
+ pengajuan_tempo.message_post(body="Dokumen Prosedur", attachment_ids=[dokumen_prosedur_attachment.id])
+
+
+ form_supplier_data = kw.get('formSupplier', False)
+
+ if form_supplier_data:
+ try:
+ form_supplier_data = json.loads(form_supplier_data)
+
+ supplier_ids_to_add = []
+ for item in form_supplier_data:
+ supplier_name = item.get("supplier")
+ pic_name = item.get("pic")
+ phone = item.get("telepon")
+ tempo_duration = item.get("durasiTempo")
+ credit_limit = item.get("creditLimit")
+
+ new_data = {
+ 'name_supplier': supplier_name,
+ 'pic_name': pic_name,
+ 'phone': phone,
+ 'tempo_duration': tempo_duration,
+ 'credit_limit': credit_limit,
+ }
+ new_supplier_data = request.env['user.pengajuan.tempo.line'].create(new_data)
+
+ supplier_ids_to_add.append(new_supplier_data.id)
+
+ pengajuan_tempo.write({'supplier_ids': [(6, 0, supplier_ids_to_add)]})
+
+ except json.JSONDecodeError:
+ return http.Response(status=400, json_body={'error': 'Invalid JSON format for formSupplier'})
+ category_produk_ids = kw.get('categoryProduk', False)
+ category_ids = ''
+ if category_produk_ids:
+ try:
+ category_ids = list(map(int, category_produk_ids.split(',')))
+ pengajuan_tempo.category_produk_ids = [(6, 0, category_ids)]
+ except Exception as e:
+ return self.response(code=500, description=f'Unexpected error: {str(e)}')
+
+
+ tukar_invoice_input = kw.get('tukarInvoiceInput')
+ if tukar_invoice_input:
+ pengajuan_tempo.tukar_invoice = tukar_invoice_input
+
+ tukar_invoice_input_pembayaran = kw.get('tukarInvoiceInputPembayaran')
+ if tukar_invoice_input_pembayaran:
+ pengajuan_tempo.jadwal_bayar = tukar_invoice_input_pembayaran
+
+ dokumen_kirim = [
+ 'Surat Tanda Terima Barang (STTB)',
+ 'Good Receipt (GR)',
+ 'Surat Terima Barang (STB)',
+ 'Lembar Penerimaan Barang (LPB)'
+ ]
+
+ dokumen_kirim_barang_ids = kw.get('dokumenPengiriman')
+ dokumen_kirim_input = kw.get('dokumenKirimInput', '')
+ dokumen_kirim_barang_input = kw.get('dokumenPengirimanInput', '')
+ dokumen_kirim_barang = []
+
+ if dokumen_kirim_barang_ids:
+ dokumen_kirim_ids = list(map(int, dokumen_kirim_barang_ids.split(',')))
+ dokumen_kirim_barang = [dokumen_kirim[i] for i in dokumen_kirim_ids if 0 <= i < len(dokumen_kirim)]
+ if dokumen_kirim_input:
+ input_items = [item.strip() for item in dokumen_kirim_input.split(',')]
+ dokumen_kirim_barang.extend(item for item in input_items if item and item not in dokumen_kirim_barang)
+ pengajuan_tempo.dokumen_kirim_input = dokumen_kirim_input
+ if dokumen_kirim_barang:
+ pengajuan_tempo.dokumen_pengiriman = ', '.join(dokumen_kirim_barang)
+ if dokumen_kirim_barang_input:
+ pengajuan_tempo.dokumen_pengiriman_input = dokumen_kirim_barang_input
+
+ dokumen = [
+ 'Invoice Pembelian',
+ 'Surat Jalan',
+ 'Berita Acara Serah Terima (BAST)',
+ 'Faktur Pajak',
+ 'Good Receipt (GR)'
+ ]
+
+ dokumen_invoice = kw.get('dokumenPengirimanInvoice', '')
+ if dokumen_invoice:
+ pengajuan_tempo.dokumen_invoice = dokumen_invoice
+ user_tempo_request = []
+ if tempo_request:
+ user_tempo_request = request.env['user.pengajuan.tempo.request'].create({
+ 'user_id': id,
+ 'pengajuan_tempo_id': pengajuan_tempo.id,
+ 'user_company_id': partner_id.id,
+ 'tempo_duration': pengajuan_tempo.tempo_duration.id,
+ 'tempo_limit': pengajuan_tempo.tempo_limit,
+ })
- if pengajuan_tempo:
- # Jika pengajuan_tempo sudah ada, hanya write data baru yang non-kosong
- pengajuan_tempo.write(new_data)
- else:
- # Jika belum ada, buat record baru
- pengajuan_tempo = request.env['user.pengajuan.tempo'].create(new_data)
- pengajuan_tempo.partner_id = user_id
+ form_dokumen_data = kw.get('formDocs', False)
+ if form_dokumen_data:
+ try:
+ form_dokumen = json.loads(form_dokumen_data)
- if partner_id:
- pengajuan_tempo.name_tempo = partner_id
+ for dokumen in form_dokumen:
+ if dokumen['details']['base64'] != '':
+ mimetype, _ = mimetypes.guess_type(dokumen['details']['name'])
+ mimetype = mimetype or 'application/octet-stream'
+ data = base64.b64decode(dokumen['details']['base64'])
+ sppkp_attachment = request.env['ir.attachment'].create({
+ 'name': dokumen['details']['name'],
+ 'type': 'binary',
+ 'datas': base64.b64encode(data),
+ 'res_model': 'user.pengajuan.tempo',
+ 'res_id': pengajuan_tempo.id,
+ 'mimetype': mimetype
+ })
- form_supplier_data = kw.get('formSupplier', False)
+ if dokumen['documentName'] == 'dokumenNib':
+ pengajuan_tempo.dokumen_nib = [(6, 0, [sppkp_attachment.id])]
- if form_supplier_data:
- try:
- form_supplier_data = json.loads(form_supplier_data)
-
- supplier_ids_to_add = []
- for item in form_supplier_data:
- supplier_name = item.get("supplier")
- pic_name = item.get("pic")
- phone = item.get("telepon")
- tempo_duration = item.get("durasiTempo")
- credit_limit = item.get("creditLimit")
-
- new_data = {
- 'name_supplier': supplier_name,
- 'pic_name': pic_name,
- 'phone': phone,
- 'tempo_duration': tempo_duration,
- 'credit_limit': credit_limit,
- }
- new_supplier_data = request.env['user.pengajuan.tempo.line'].create(new_data)
-
- supplier_ids_to_add.append(new_supplier_data.id)
-
- pengajuan_tempo.write({'supplier_ids': [(6, 0, supplier_ids_to_add)]})
-
- except json.JSONDecodeError:
- return http.Response(status=400, json_body={'error': 'Invalid JSON format for formSupplier'})
- category_produk_ids = kw.get('categoryProduk', False)
- category_ids = ''
- if category_produk_ids:
- category_ids = list(map(int, category_produk_ids.split(',')))
- pengajuan_tempo.category_produk_ids = [(6, 0, category_ids)]
-
- tukar_invoice_input = kw.get('tukarInvoiceInput')
- if tukar_invoice_input:
- pengajuan_tempo.tukar_invoice = tukar_invoice_input
-
- tukar_invoice_input_pembayaran = kw.get('tukarInvoiceInputPembayaran')
- if tukar_invoice_input_pembayaran:
- pengajuan_tempo.jadwal_bayar = tukar_invoice_input_pembayaran
-
- dokumen_kirim = [
- 'Surat Tanda Terima Barang (STTB)',
- 'Good Receipt (GR)',
- 'Surat Terima Barang (STB)',
- 'Lembar Penerimaan Barang (LPB)'
- ]
-
- dokumen_kirim_barang_ids = kw.get('dokumenPengiriman')
- dokumen_kirim_input = kw.get('dokumenKirimInput', '')
- dokumen_kirim_barang_input = kw.get('dokumenPengirimanInput', '')
- dokumen_kirim_barang = []
-
- if dokumen_kirim_barang_ids:
- dokumen_kirim_ids = list(map(int, dokumen_kirim_barang_ids.split(',')))
- dokumen_kirim_barang = [dokumen_kirim[i] for i in dokumen_kirim_ids if 0 <= i < len(dokumen_kirim)]
- if dokumen_kirim_input:
- input_items = [item.strip() for item in dokumen_kirim_input.split(',')]
- dokumen_kirim_barang.extend(item for item in input_items if item and item not in dokumen_kirim_barang)
- pengajuan_tempo.dokumen_kirim_input = dokumen_kirim_input
- if dokumen_kirim_barang:
- pengajuan_tempo.dokumen_pengiriman = ', '.join(dokumen_kirim_barang)
- if dokumen_kirim_barang_input:
- pengajuan_tempo.dokumen_pengiriman_input = dokumen_kirim_barang_input
-
- dokumen = [
- 'Invoice Pembelian',
- 'Surat Jalan',
- 'Berita Acara Serah Terima (BAST)',
- 'Faktur Pajak',
- 'Good Receipt (GR)'
- ]
-
- dokumen_invoice = kw.get('dokumenPengirimanInvoice', '')
- if dokumen_invoice:
- pengajuan_tempo.dokumen_invoice = dokumen_invoice
- user_tempo_request = []
- if tempo_request:
- user_tempo_request = request.env['user.pengajuan.tempo.request'].create({
- 'user_id': id,
- 'pengajuan_tempo_id': pengajuan_tempo.id,
- 'user_company_id': partner_id.id,
- 'tempo_duration': pengajuan_tempo.tempo_duration.id,
- 'tempo_limit': pengajuan_tempo.tempo_limit,
- })
+ elif dokumen['documentName'] == 'dokumenSiup':
+ pengajuan_tempo.dokumen_siup = [(6, 0, [sppkp_attachment.id])]
- form_dokumen_data = kw.get('formDocs', False)
- if form_dokumen_data:
- try:
- form_dokumen = json.loads(form_dokumen_data)
+ elif dokumen['documentName'] == 'dokumenTdp':
+ pengajuan_tempo.dokumen_tdp = [(6, 0, [sppkp_attachment.id])]
- for dokumen in form_dokumen:
- if dokumen['details']['base64'] != '':
- mimetype, _ = mimetypes.guess_type(dokumen['details']['name'])
- mimetype = mimetype or 'application/octet-stream'
- data = base64.b64decode(dokumen['details']['base64'])
- sppkp_attachment = request.env['ir.attachment'].create({
- 'name': dokumen['details']['name'],
- 'type': 'binary',
- 'datas': base64.b64encode(data),
- 'res_model': 'user.pengajuan.tempo',
- 'res_id': pengajuan_tempo.id,
- 'mimetype': mimetype
- })
+ elif dokumen['documentName'] == 'dokumenSkdp':
+ pengajuan_tempo.dokumen_skdp = [(6, 0, [sppkp_attachment.id])]
- if dokumen['documentName'] == 'dokumenNib':
- pengajuan_tempo.dokumen_nib = [(6, 0, [sppkp_attachment.id])]
+ elif dokumen['documentName'] == 'dokumenSkt':
+ pengajuan_tempo.dokumen_skt = [(6, 0, [sppkp_attachment.id])]
- elif dokumen['documentName'] == 'dokumenSiup':
- pengajuan_tempo.dokumen_siup = [(6, 0, [sppkp_attachment.id])]
+ elif dokumen['documentName'] == 'dokumenNpwp':
+ pengajuan_tempo.dokumen_npwp = [(6, 0, [sppkp_attachment.id])]
- elif dokumen['documentName'] == 'dokumenTdp':
- pengajuan_tempo.dokumen_tdp = [(6, 0, [sppkp_attachment.id])]
+ elif dokumen['documentName'] == 'dokumenSppkp':
+ pengajuan_tempo.dokumen_sppkp = [(6, 0, [sppkp_attachment.id])]
- elif dokumen['documentName'] == 'dokumenSkdp':
- pengajuan_tempo.dokumen_skdp = [(6, 0, [sppkp_attachment.id])]
+ elif dokumen['documentName'] == 'dokumenAktaPerubahan':
+ pengajuan_tempo.dokumen_akta_perubahan = [(6, 0, [sppkp_attachment.id])]
- elif dokumen['documentName'] == 'dokumenSkt':
- pengajuan_tempo.dokumen_skt = [(6, 0, [sppkp_attachment.id])]
+ elif dokumen['documentName'] == 'dokumenKtpDirut':
+ pengajuan_tempo.dokumen_ktp_dirut = [(6, 0, [sppkp_attachment.id])]
- elif dokumen['documentName'] == 'dokumenNpwp':
- pengajuan_tempo.dokumen_npwp = [(6, 0, [sppkp_attachment.id])]
+ elif dokumen['documentName'] == 'dokumenAktaPendirian':
+ pengajuan_tempo.dokumen_akta_pendirian = [(6, 0, [sppkp_attachment.id])]
- elif dokumen['documentName'] == 'dokumenSppkp':
- pengajuan_tempo.dokumen_sppkp = [(6, 0, [sppkp_attachment.id])]
+ elif dokumen['documentName'] == 'dokumenLaporanKeuangan':
+ pengajuan_tempo.dokumen_laporan_keuangan = [(6, 0, [sppkp_attachment.id])]
- elif dokumen['documentName'] == 'dokumenAktaPerubahan':
- pengajuan_tempo.dokumen_akta_perubahan = [(6, 0, [sppkp_attachment.id])]
+ elif dokumen['documentName'] == 'dokumenFotoKantor':
+ pengajuan_tempo.dokumen_foto_kantor = [(6, 0, [sppkp_attachment.id])]
- elif dokumen['documentName'] == 'dokumenKtpDirut':
- pengajuan_tempo.dokumen_ktp_dirut = [(6, 0, [sppkp_attachment.id])]
+ elif dokumen['documentName'] == 'dokumenTempatBekerja':
+ pengajuan_tempo.dokumen_tempat_bekerja = [(6, 0, [sppkp_attachment.id])]
- elif dokumen['documentName'] == 'dokumenAktaPendirian':
- pengajuan_tempo.dokumen_akta_pendirian = [(6, 0, [sppkp_attachment.id])]
+ formatted_text = ''.join([' ' + char if char.isupper() and i != 0 else char for i, char in
+ enumerate(dokumen['documentName'])])
+ teks = formatted_text.strip().title()
+ pengajuan_tempo.message_post(body=teks, attachment_ids=[sppkp_attachment.id])
+ if tempo_request:
+ user_tempo_request.message_post(body=teks, attachment_ids=[sppkp_attachment.id])
- elif dokumen['documentName'] == 'dokumenLaporanKeuangan':
- pengajuan_tempo.dokumen_laporan_keuangan = [(6, 0, [sppkp_attachment.id])]
- elif dokumen['documentName'] == 'dokumenFotoKantor':
- pengajuan_tempo.dokumen_foto_kantor = [(6, 0, [sppkp_attachment.id])]
+ except json.JSONDecodeError:
+ return http.Response(status=400, json_body={'error': 'Invalid JSON format for formDokumen'})
- elif dokumen['documentName'] == 'dokumenTempatBekerja':
- pengajuan_tempo.dokumen_tempat_bekerja = [(6, 0, [sppkp_attachment.id])]
+ if tempo_request:
+ # pengajuan_tempo.user_id = id
+ template = pengajuan_tempo.env.ref('indoteknik_custom.mail_template_res_user_company_request_tempo_review')
+ template.send_mail(pengajuan_tempo.id, force_send=True)
+ template2 = pengajuan_tempo.env.ref('indoteknik_custom.mail_template_res_user_company_new_tempo_to_sales')
+ template2.send_mail(pengajuan_tempo.id, force_send=True)
+ if not pengajuan_tempo:
+ return self.response(code=500, description="Failed to create or update pengajuan_tempo")
- formatted_text = ''.join([' ' + char if char.isupper() and i != 0 else char for i, char in
- enumerate(dokumen['documentName'])])
- teks = formatted_text.strip().title()
- pengajuan_tempo.message_post(body=teks, attachment_ids=[sppkp_attachment.id])
- if tempo_request:
- user_tempo_request.message_post(body=teks, attachment_ids=[sppkp_attachment.id])
-
-
- except json.JSONDecodeError:
- return http.Response(status=400, json_body={'error': 'Invalid JSON format for formDokumen'})
+ return self.response({
+ 'id': pengajuan_tempo.id,
+ 'user_id': user_id,
+ })
+ except Exception as e:
+ return self.response(code=500, description=f'Unexpected error: {str(e)}')
- if tempo_request:
- # pengajuan_tempo.user_id = id
- template = pengajuan_tempo.env.ref('indoteknik_custom.mail_template_res_user_company_request_tempo_review')
- template.send_mail(pengajuan_tempo.id, force_send=True)
- template2 = pengajuan_tempo.env.ref('indoteknik_custom.mail_template_res_user_company_new_tempo_to_sales')
- template2.send_mail(pengajuan_tempo.id, force_send=True)
- return self.response({
- 'id': pengajuan_tempo.id,
- 'user_id': user_id,
- })
def get_user_by_email(self, email):
return request.env['res.users'].search([
diff --git a/indoteknik_api/controllers/api_v1/product.py b/indoteknik_api/controllers/api_v1/product.py
index 32362582..557215ea 100644
--- a/indoteknik_api/controllers/api_v1/product.py
+++ b/indoteknik_api/controllers/api_v1/product.py
@@ -1,13 +1,13 @@
from .. import controller
from odoo import http
-from odoo.http import request
+from odoo.http import request, Response
from datetime import datetime, timedelta
import ast
import logging
import math
import json
-_logger = logging.getLogger(__name__)
+_logger = logging.getLogger(__name__)
class Product(controller.Controller):
@@ -33,9 +33,64 @@ class Product(controller.Controller):
categories.reverse()
return self.response(categories, headers=[('Cache-Control', 'max-age=3600, public')])
-
- @http.route(prefix + 'product_variant/<id>/stock', auth='public', methods=['GET', 'OPTIONS'])
+
+ @http.route(prefix + 'product/variants/sla', auth='public', methods=['GET', 'OPTIONS'])
@controller.Controller.must_authorized()
+ def get_product_template_sla_by_id(self, **kwargs):
+ body_params = kwargs.get('ids')
+
+ if not body_params:
+ return self.response('Failed', code=400, description='id is required')
+
+ ids = [int(id.strip()) for id in body_params.split(',') if id.strip().isdigit()]
+
+ sla_duration = 0
+ sla_unit = 'Hari'
+ include_instant = True
+ products = request.env['product.product'].search([('id', 'in', ids)])
+ if len(products) < 1:
+ return self.response(
+ 'Failed',
+ code=400,
+ description='Produk Tidak Di Temukan.'
+ )
+
+ product_slas = request.env['product.sla'].search([('product_variant_id', 'in', ids)])
+ if len(product_slas) < 1:
+ return self.response(
+ 'Failed',
+ code=400,
+ description='SLA Tidak Di Temukan.'
+ )
+
+ # Mapping SLA untuk mempermudah lookup
+ sla_map = {sla.product_variant_id.id: sla for sla in product_slas}
+
+ for product in products:
+ product_sla = sla_map.get(product.id)
+ if product_sla:
+ sla_duration = max(sla_duration, int(product_sla.sla))
+ sla_unit = product_sla.sla_vendor_id.unit
+ if product.qty_free_bandengan < 1 :
+ if product_sla.sla_vendor_id.unit != 'jam':
+ include_instant = False
+ break
+
+ start_date = datetime.today().date()
+ additional_days = request.env['sale.order'].get_days_until_next_business_day(start_date)
+
+ # Jika semua loop selesai tanpa include_instant menjadi False
+ return self.response({
+ 'include_instant': include_instant,
+ 'sla_duration': sla_duration,
+ 'sla_additional_days': additional_days,
+ 'sla_total' : int(sla_duration) + int(additional_days),
+ 'sla_unit': 'Hari' if additional_days > 0 else sla_unit
+ }
+ )
+
+ @http.route(prefix + 'product_variant/<id>/stock', auth='public', methods=['GET', 'OPTIONS'])
+ @controller.Controller.must_authorized()
def get_product_template_stock_by_id(self, **kw):
id = int(kw.get('id'))
date_7_days_ago = datetime.now() - timedelta(days=7)
@@ -49,10 +104,11 @@ class Product(controller.Controller):
], limit=1)
qty_available = product.qty_free_bandengan
-
- if qty_available < 0:
- qty_available = 0
-
+
+
+ if qty_available < 1 :
+ qty_available = 0
+
qty = 0
sla_date = '-'
@@ -74,24 +130,25 @@ class Product(controller.Controller):
if qty_available > 0:
qty = qty_available + total_adem + total_excell
+ sla_date = product_sla.sla or 1
elif qty_altama > 0 or qty_vendor > 0:
qty = total_adem if qty_altama > 0 else total_excell
- sla_date = '2-4 Hari'
+ sla_date = product_sla.sla
else:
- sla_date = '3-7 Hari'
+ sla_date = product_sla.sla
except:
print('error')
else:
if qty_available > 0:
qty = qty_available
- sla_date = product_sla.sla or '-'
+ sla_date = product_sla.sla or 'Indent'
elif qty_vendor > 0:
qty = total_excell
sla_date = '2-4 Hari'
data = {
'qty': qty,
- 'sla_date': sla_date,
+ 'sla_date': sla_date
}
return self.response(data, headers=[('Cache-Control', 'max-age=600, private')])
diff --git a/indoteknik_api/controllers/api_v1/sale_order.py b/indoteknik_api/controllers/api_v1/sale_order.py
index a7e027c8..6815bf6c 100644
--- a/indoteknik_api/controllers/api_v1/sale_order.py
+++ b/indoteknik_api/controllers/api_v1/sale_order.py
@@ -386,7 +386,8 @@ class SaleOrder(controller.Controller):
'note_website': [],
'voucher': [],
'source': [],
- 'estimated_arrival_days': ['number', 'default:0']
+ 'estimated_arrival_days': ['number', 'default:0'],
+ 'estimated_arrival_days_start': ['number', 'default:0']
})
if not params['valid']:
@@ -417,6 +418,7 @@ class SaleOrder(controller.Controller):
'partner_purchase_order_file': params['value']['po_file'],
'delivery_amt': params['value']['delivery_amount'] * 1.10,
'estimated_arrival_days': params['value']['estimated_arrival_days'],
+ 'estimated_arrival_days_start': params['value']['estimated_arrival_days_start'],
'shipping_cost_covered': 'customer',
'shipping_paid_by': 'customer',
'carrier_id': params['value']['carrier_id'],
diff --git a/indoteknik_api/controllers/api_v1/stock_picking.py b/indoteknik_api/controllers/api_v1/stock_picking.py
index 2e0c4ad0..55e07152 100644
--- a/indoteknik_api/controllers/api_v1/stock_picking.py
+++ b/indoteknik_api/controllers/api_v1/stock_picking.py
@@ -101,7 +101,7 @@ class StockPicking(controller.Controller):
picking = picking_model.browse(id)
if not picking:
return self.response(None)
-
+ hostori = picking.get_tracking_detail()
return self.response(picking.get_tracking_detail())
@http.route(prefix + 'stock-picking/<id>/tracking', auth='public', method=['GET', 'OPTIONS'])
@@ -136,4 +136,50 @@ class StockPicking(controller.Controller):
return self.response({
'name': picking_data.name
- }) \ No newline at end of file
+ })
+
+ @http.route(prefix + 'webhook/biteship', type='json', auth='public', methods=['POST'], csrf=False)
+ def udpate_status_from_bitehsip(self, **kw):
+ try:
+ if not request.jsonrequest:
+ return "ok"
+
+ data = request.jsonrequest # Ambil data JSON dari request
+ event = data.get('event')
+
+ # Handle Event Berdasarkan Jenisnya
+ if event == "order.status":
+ self.process_order_status(data)
+ elif event == "order.price":
+ self.process_order_price(data)
+ elif event == "order.waybill_id":
+ self.process_order_waybill(data)
+
+ return {'success': True, 'message': f'Webhook {event} received'}
+ except Exception as e:
+ return {'success': False, 'message': str(e)}
+
+ def process_order_status(self, data):
+ picking_model = request.env['stock.picking'].sudo().search([('biteship_id', '=', data.get('order_id'))], limit=1)
+ if data.get('status') == 'picked':
+ picking_model.write({'driver_departure_date': datetime.utcnow()})
+ elif data.get('status') == 'delivered':
+ picking_model.write({'driver_arrival_date': datetime.utcnow()})
+
+ def process_order_price(self, data):
+ picking_model = request.env['stock.picking'].sudo().search([('biteship_id', '=', data.get('order_id'))], limit=1)
+ order = request.env['sale.order'].sudo().search([('name', '=', picking_model.sale_id.name)], limit=1)
+ if order:
+ order.write({
+ 'delivery_amt': data.get('price')
+ })
+
+ def process_order_waybill(self, data):
+ picking_model = request.env['stock.picking'].sudo().search([('biteship_id', '=', data.get('order_id'))], limit=1)
+ if picking_model:
+ picking_model.write({
+ 'biteship_waybill_id': data.get('courier_waybill_id'),
+ 'delivery_tracking_no': data.get('courier_waybill_id'),
+ 'biteship_tracking_id':data.get('courier_tracking_id')
+ })
+ \ No newline at end of file
diff --git a/indoteknik_api/models/res_partner.py b/indoteknik_api/models/res_partner.py
index 0e09fbc6..3a98f3bc 100644
--- a/indoteknik_api/models/res_partner.py
+++ b/indoteknik_api/models/res_partner.py
@@ -59,6 +59,7 @@ class ResPartner(models.Model):
# Pengiriman
'PIC_tittle' : pengajuan_tempo.pic_tittle if pengajuan_tempo.pic_tittle else '',
+ 'PICBarangMobile' : pengajuan_tempo.pic_mobile if pengajuan_tempo.pic_mobile else '',
'PIC_name' : pengajuan_tempo.pic_name if pengajuan_tempo.pic_name else '',
'street_pengiriman' : pengajuan_tempo.street_pengiriman if pengajuan_tempo.street_pengiriman else '',
'state_pengiriman' : pengajuan_tempo.state_id_pengiriman.id if pengajuan_tempo.state_id_pengiriman else '',
@@ -67,6 +68,7 @@ class ResPartner(models.Model):
'subDistrict_pengiriman': pengajuan_tempo.subDistrict_id_pengiriman.id if pengajuan_tempo.subDistrict_id_pengiriman else '',
'zip_pengiriman' : pengajuan_tempo.zip_pengiriman if pengajuan_tempo.zip_pengiriman else '',
'invoice_pic_tittle' : pengajuan_tempo.invoice_pic_tittle if pengajuan_tempo.invoice_pic_tittle else '',
+ 'invoice_pic_mobile' : pengajuan_tempo.invoice_pic_mobile if pengajuan_tempo.invoice_pic_mobile else '',
'invoice_pic' : pengajuan_tempo.invoice_pic if pengajuan_tempo.invoice_pic else '',
'street_invoice' : pengajuan_tempo.street_invoice if pengajuan_tempo.street_invoice else '',
'state_invoice' : pengajuan_tempo.state_id_invoice.id if pengajuan_tempo.state_id_invoice else '',
@@ -82,6 +84,12 @@ class ResPartner(models.Model):
'dokumen_pengiriman_invoice' : pengajuan_tempo.dokumen_invoice if pengajuan_tempo.dokumen_invoice else '',
'is_same_addrees': pengajuan_tempo.is_same_address if pengajuan_tempo.is_same_address else False,
'is_same_addrees_street': pengajuan_tempo.is_same_address_street if pengajuan_tempo.is_same_address_street else False,
+ 'dokumen_prosedur':
+ {
+ 'name': pengajuan_tempo.dokumen_prosedur.name,
+ 'base64': pengajuan_tempo.dokumen_prosedur.datas.decode('utf-8'),
+ 'format': pengajuan_tempo.dokumen_prosedur.mimetype,
+ } if pengajuan_tempo.dokumen_prosedur else '',
'supplier_ids': [
{
'id': supplier.id,