summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorit-fixcomart <it@fixcomart.co.id>2025-05-23 09:22:27 +0700
committerit-fixcomart <it@fixcomart.co.id>2025-05-23 09:22:27 +0700
commitf6f59e660af6c4229ada54f7313d68867df1ba15 (patch)
tree9a27b4e0e6571c639ba173df5ae25a2e7014aefd
parent68378dd2fb8d61b282a672ca0f09033d15d82283 (diff)
parent558130bbf48c33ddfa6080450c80bc8801a570f0 (diff)
Merge branch 'CR/form-merchant' into odoo-backup
# Conflicts: # indoteknik_custom/models/sale_order.py # indoteknik_custom/views/sale_order.xml
-rw-r--r--indoteknik_api/controllers/api_v1/lead.py207
-rw-r--r--indoteknik_api/controllers/api_v1/sale_order.py24
-rw-r--r--indoteknik_api/controllers/api_v1/user.py4
-rw-r--r--indoteknik_api/models/res_partner.py95
-rwxr-xr-xindoteknik_custom/__manifest__.py2
-rwxr-xr-xindoteknik_custom/models/__init__.py2
-rw-r--r--indoteknik_custom/models/res_partner.py184
-rwxr-xr-xindoteknik_custom/models/sale_order.py46
-rw-r--r--indoteknik_custom/models/user_form_merchant.py98
-rw-r--r--indoteknik_custom/models/user_merchant_request.py125
-rwxr-xr-xindoteknik_custom/security/ir.model.access.csv4
-rw-r--r--indoteknik_custom/views/res_partner.xml60
-rwxr-xr-xindoteknik_custom/views/sale_order.xml13
-rw-r--r--indoteknik_custom/views/user_form_merchant.xml109
-rw-r--r--indoteknik_custom/views/user_merchant_request.xml112
15 files changed, 1082 insertions, 3 deletions
diff --git a/indoteknik_api/controllers/api_v1/lead.py b/indoteknik_api/controllers/api_v1/lead.py
index d5cc7c5c..389f36b8 100644
--- a/indoteknik_api/controllers/api_v1/lead.py
+++ b/indoteknik_api/controllers/api_v1/lead.py
@@ -1,6 +1,9 @@
from .. import controller
from odoo import http
from odoo.http import request
+import base64
+import mimetypes
+import json
class Lead(controller.Controller):
@http.route('/api/v1/lead', auth='public', methods=['POST', 'OPTIONS'], csrf=False)
@@ -26,4 +29,206 @@ class Lead(controller.Controller):
lead = request.env['crm.lead'].create(params['value'])
- return self.response(True) \ No newline at end of file
+ return self.response(True)
+
+ @http.route('/api/v1/merchant/<id>', auth='public', methods=['POST', 'OPTIONS'], csrf=False)
+ @controller.Controller.must_authorized()
+ def create_merchant(self, **kw):
+ merchant_request = True if kw.get('merchant_request') == 'true' else False
+ params = self.get_request_params(kw, {
+ # informasi perusahaan
+ "name_merchant": [],
+ "pejabat_name": [],
+ "pic_merchant": [],
+ "pic_position": [],
+ "address": [],
+ "state": ['number'],
+ "city": ['number'],
+ "district": ['number'],
+ "subDistrict": ['number'],
+ "zip": [],
+ "bank_name": [],
+ "rekening_name": [],
+ "account_number": [],
+ "email_company": [],
+ "email_sales": [],
+ "email_finance": [],
+ "phone": [],
+ "mobile": [],
+ "bisnis_type": [],
+ "category_perusahaan": [],
+ "website": [],
+ "description": [],
+
+ # informasi vendor
+ "harga_tayang": [],
+ "merk_dagang": [],
+ "tempo_duration": [],
+ "kredit_limit": [],
+ "is_pengajuan_tempo": [],
+ "waktu_pengiriman": [],
+ "terhitung_sejak": [],
+
+ # Syarat Perdagangan
+ "is_kembali_barang": [],
+ "tempo_garansi": [],
+ "is_order_quantity": [],
+ "explain_garansi": [],
+ "custom_sertifikat_produk": [],
+
+ # # dokumen
+
+ "file_npwp": [],
+ "file_sppkp": [],
+ "file_dokumenKtpDirut ": [],
+ "file_kartuNama": [],
+ "file_suratPernyataan": [],
+ "file_fotoKantor": [],
+ # "file_dataProduk": [],
+ # "file_pricelist": [],
+ })
+ partner_id = int(kw.get('id'))
+ partner = request.env['res.partner'].search([('id', '=', partner_id)], limit=1)
+ main_partner = partner.get_main_parent()
+
+ if params['value']['is_pengajuan_tempo']:
+ if params['value']['is_pengajuan_tempo'] == 'ada':
+ params['value']['is_pengajuan_tempo'] = True
+ else:
+ params['value']['is_pengajuan_tempo'] = False
+
+ if params['value']['is_kembali_barang']:
+ if params['value']['is_kembali_barang'] == 'ya':
+ params['value']['is_kembali_barang'] = kw.get('textReturn')
+ else:
+ params['value']['is_kembali_barang'] = 'Tidak dapat direturn'
+
+ if kw.get('tenggat_waktu'):
+ if kw.get('tenggat_waktu') != 'custom':
+ params['value']['tenggat_waktu'] = kw.get('tenggat_waktu') + ' hari sejak data dikirimkan'
+ else:
+ params['value']['tenggat_waktu'] = kw.get('custom_tenggat_waktu')
+
+ if params['value']['is_order_quantity']:
+ if params['value']['is_order_quantity'] == 'ya':
+ params['value']['is_order_quantity'] = kw.get('minimum_pembelian')
+ else:
+ params['value']['is_order_quantity'] = 'Tidak ada minimum order quantity'
+
+ filtered_params = {key: value for key, value in params['value'].items() if kw.get(key) is not None}
+ form_merchant = request.env['user.form.merchant'].search([('partner_id', '=', main_partner.id)], limit=1)
+ lead = []
+ if form_merchant:
+ form_merchant.write(filtered_params)
+ else:
+ lead = request.env['user.form.merchant'].create(filtered_params)
+ lead.partner_id = main_partner.id
+
+ sertifikat = [
+ 'TKDN',
+ 'SNI',
+ 'K3L',
+ ]
+ sertifikat_ids = kw.get('sertifikat_produk')
+ sertifikat_input = kw.get('custom_sertifikat_produk')
+ dokumen_sertifikat = []
+
+ if sertifikat_ids:
+ dokumen_kirim_ids = list(map(int, sertifikat_ids.split(',')))
+ dokumen_sertifikat = [sertifikat[i] for i in dokumen_kirim_ids if 0 <= i < len(sertifikat)]
+ if sertifikat_input != 'false' and sertifikat_input:
+ input_items = [item.strip() for item in sertifikat_input.split(',')]
+ dokumen_sertifikat.extend(item for item in input_items if item and item not in dokumen_sertifikat)
+ form_merchant.sertifikat_produk = sertifikat_input
+ else:
+ # Jika sertifikat_input kosong, hapus elemen custom (yang tidak ada di daftar `sertifikat`)
+ dokumen_sertifikat = [item for item in dokumen_sertifikat if item in sertifikat]
+ if dokumen_sertifikat:
+ form_merchant.sertifikat_produk = ', '.join(dokumen_sertifikat)
+
+ category_ids = ''
+ category_produk_ids = kw.get('categoryProduk', False)
+ if category_produk_ids:
+ category_ids = list(map(int, category_produk_ids.split(',')))
+ valid_category_ids = request.env['product.public.category'].search([('id', 'in', category_ids)]).ids
+ form_merchant.category_produk_ids = [(6, 0, valid_category_ids)]
+
+ file_dokumen = kw.get('file_dokumen', False)
+ if file_dokumen:
+ form_dokumen = json.loads(file_dokumen)
+
+ for dokumen in form_dokumen:
+ if form_dokumen[dokumen]['details']:
+ mimetype, _ = mimetypes.guess_type(form_dokumen[dokumen]['details']['name'])
+ mimetype = mimetype or 'application/octet-stream'
+ data = base64.b64decode(form_dokumen[dokumen]['details']['format'])
+ sppkp_attachment = request.env['ir.attachment'].create({
+ 'name': form_dokumen[dokumen]['details']['name'],
+ 'type': 'binary',
+ 'datas': base64.b64encode(data),
+ 'res_model': 'user.form.merchant',
+ 'res_id': form_merchant.id,
+ 'mimetype': mimetype
+ })
+
+ if dokumen == 'file_npwp':
+ form_merchant.file_npwp = sppkp_attachment.id
+
+ elif dokumen == 'file_sppkp':
+ form_merchant.file_sppkp = sppkp_attachment.id
+
+ elif dokumen == 'file_dokumenKtpDirut':
+ form_merchant.file_dokumenKtpDirut = sppkp_attachment.id
+
+ elif dokumen == 'file_kartuNama':
+ form_merchant.file_kartuNama = sppkp_attachment.id
+
+ elif dokumen == 'file_suratPernyataan':
+ form_merchant.file_suratPernyataan = sppkp_attachment.id
+
+ elif dokumen == 'file_fotoKantor':
+ form_merchant.file_fotoKantor = sppkp_attachment.id
+
+ elif dokumen == 'file_dataProduk':
+ form_merchant.file_dataProduk = sppkp_attachment.id
+
+ elif dokumen == 'file_pricelist':
+ form_merchant.file_pricelist = sppkp_attachment.id
+ if not params['valid']:
+ return self.response(code=400, description=params)
+ if merchant_request:
+ user_merchant_request = request.env['user.merchant.request'].create({
+ 'user_id': partner.id,
+ 'merchant_id': form_merchant.id,
+ 'user_company_id': main_partner.id
+ })
+
+ return self.response(True)
+
+ @http.route('/api/v1/detail-merchant/<id>', auth='public', methods=['GET', 'OPTIONS'])
+ @controller.Controller.must_authorized()
+ def get_partner_detail_merchant(self, **kw):
+ params = self.get_request_params(kw, {
+ 'id': ['required', 'number']
+ })
+ partner = request.env['res.partner'].search([('id', '=', params['value']['id'])], limit=1)
+ main_partner = partner.get_main_parent()
+ form_merchant = request.env['user.form.merchant'].search([('partner_id', '=', main_partner.id)],limit=1)
+ if not form_merchant:
+ return self.response(code=404, description='form merchant not found')
+ form_merchant = request.env['res.partner'].api_single_response_merchant(form_merchant)
+ return self.response(form_merchant)
+
+ @http.route('/api/v1/check-merchant/<id>', auth='public', methods=['GET', 'OPTIONS'])
+ @controller.Controller.must_authorized()
+ def get_partner_form_merchant(self, **kw):
+ params = self.get_request_params(kw, {
+ 'id': ['required', 'number']
+ })
+ partner = request.env['res.partner'].search([('id', '=', params['value']['id'])], limit=1)
+ main_partner = partner.get_main_parent()
+ form_merchant = request.env['user.merchant.request'].search([('user_company_id', '=', main_partner.id)], limit=1)
+ if form_merchant:
+ return self.response(form_merchant.state_merchant)
+ else:
+ return self.response(code=404, description='form merchant not found') \ No newline at end of file
diff --git a/indoteknik_api/controllers/api_v1/sale_order.py b/indoteknik_api/controllers/api_v1/sale_order.py
index 98b13cad..d5208fb1 100644
--- a/indoteknik_api/controllers/api_v1/sale_order.py
+++ b/indoteknik_api/controllers/api_v1/sale_order.py
@@ -54,6 +54,20 @@ class SaleOrder(controller.Controller):
# sales = request.env['sale.order'].search_read([('name', '=', sale_number)], fields=['id', 'name', 'amount_total', 'state'])
sales = request.env['sale.order'].search(query, limit=1)
data = []
+ INDONESIAN_MONTHS = {
+ 1: 'Januari',
+ 2: 'Februari',
+ 3: 'Maret',
+ 4: 'April',
+ 5: 'Mei',
+ 6: 'Juni',
+ 7: 'Juli',
+ 8: 'Agustus',
+ 9: 'September',
+ 10: 'Oktober',
+ 11: 'November',
+ 12: 'Desember',
+ }
for sale in sales:
product_name = ''
product_not_in_id = 0
@@ -65,6 +79,7 @@ class SaleOrder(controller.Controller):
'id': sale.id,
'name': sale.name,
'date_order': self.time_to_str(sale.date_order, '%d/%m/%Y %H:%M:%S'),
+ 'expected_ready_to_ship': f"{sale.expected_ready_to_ship.day} {INDONESIAN_MONTHS[sale.expected_ready_to_ship.month]} {sale.expected_ready_to_ship.year}",
'state': sale.state,
'amount_untaxed': sale.amount_untaxed,
'amount_tax': sale.amount_tax,
@@ -142,6 +157,15 @@ class SaleOrder(controller.Controller):
sale_order = request.env['sale.order'].search(domain)
if sale_order:
data = request.env['sale.order'].api_v1_single_response(sale_order, context='with_detail')
+ if sale_order.expected_ready_to_ship:
+ bulan_id = [
+ "Januari", "Februari", "Maret", "April", "Mei", "Juni",
+ "Juli", "Agustus", "September", "Oktober", "November", "Desember"
+ ]
+ tanggal = sale_order.expected_ready_to_ship.day
+ bulan = bulan_id[sale_order.expected_ready_to_ship.month - 1]
+ tahun = sale_order.expected_ready_to_ship.year
+ data['expected_ready_to_ship'] = f"{tanggal} {bulan} {tahun}"
return self.response(data)
diff --git a/indoteknik_api/controllers/api_v1/user.py b/indoteknik_api/controllers/api_v1/user.py
index b5b7e055..967bbcc9 100644
--- a/indoteknik_api/controllers/api_v1/user.py
+++ b/indoteknik_api/controllers/api_v1/user.py
@@ -60,7 +60,9 @@ class User(controller.Controller):
'user': self.response_with_token(user),
}
return self.response(data)
- except:
+ except Exception as e:
+ respon = str(e)
+ print(respon)
return self.response({
'is_auth': False,
'reason': 'NOT_FOUND'
diff --git a/indoteknik_api/models/res_partner.py b/indoteknik_api/models/res_partner.py
index 3a98f3bc..2cebab83 100644
--- a/indoteknik_api/models/res_partner.py
+++ b/indoteknik_api/models/res_partner.py
@@ -175,4 +175,99 @@ class ResPartner(models.Model):
} if pengajuan_tempo.dokumen_tempat_bekerja else '',
}
+ return data
+
+ def api_single_response_merchant(self, form_merchant, with_detail=''):
+ sertifikat = [
+ ['TKDN', '0'],
+ ['SNI', '1'],
+ ['K3L', '2'],
+ ]
+ dokumen_sertifikat = []
+ if form_merchant.sertifikat_produk:
+ form_merchant_dokumen_sertifikat = form_merchant.sertifikat_produk
+ mapping_dokumen = {item[0]: item[1] for item in sertifikat}
+ dokumen_pengiriman_list = [dokumen.strip() for dokumen in form_merchant_dokumen_sertifikat.split(',')]
+ dokumen_sertifikat = [mapping_dokumen.get(dokumen, '3') for dokumen in dokumen_pengiriman_list]
+ data = {
+ 'name_merchant' : form_merchant.name_merchant,
+ 'pejabat_name' : form_merchant.pejabat_name,
+ 'pic_merchant' : form_merchant.pic_merchant,
+ 'pic_position' : form_merchant.pic_position,
+ 'address' : form_merchant.address,
+ 'state' : form_merchant.state.id,
+ 'city' : form_merchant.city.id,
+ 'district' : form_merchant.district.id,
+ 'subDistrict' : form_merchant.subDistrict.id,
+ 'zip' : form_merchant.zip,
+ 'bank_name' : form_merchant.bank_name,
+ 'rekening_name' : form_merchant.rekening_name,
+ 'account_number' : form_merchant.account_number,
+ 'email_company' : form_merchant.email_company,
+ 'email_sales' : form_merchant.email_sales,
+ 'email_finance' : form_merchant.email_finance,
+ 'phone' : form_merchant.phone,
+ 'mobile' : form_merchant.mobile,
+ 'bisnis_type' : form_merchant.bisnis_type,
+ 'category_perusahaan': form_merchant.category_perusahaan,
+ 'website' : form_merchant.website,
+
+ # informasi Vendor
+ 'harga_tayang' : form_merchant.harga_tayang,
+ 'category_produk': ','.join([str(cat.id) for cat in form_merchant.category_produk_ids]) if form_merchant.category_produk_ids else '',
+ 'merk_dagang' : form_merchant.merk_dagang,
+ 'is_pengajuan_tempo' : 'ada' if form_merchant.is_pengajuan_tempo else 'tidak',
+ 'tempo_duration' : form_merchant.tempo_duration.id,
+ 'kredit_limit' : form_merchant.kredit_limit,
+ 'waktu_pengiriman' : form_merchant.waktu_pengiriman,
+ 'terhitung_sejak' : form_merchant.terhitung_sejak,
+
+
+ # syarat perdagangan
+ 'is_kembali_barang': 'tidak' if form_merchant.is_kembali_barang == 'Tidak dapat direturn' else 'ya',
+ 'text_return': form_merchant.is_kembali_barang if form_merchant.is_kembali_barang != 'Tidak dapat direturn' else '',
+ 'tenggat_waktu': form_merchant.tenggat_waktu,
+ 'sertifikat_produk': ','.join(dokumen_sertifikat) if dokumen_sertifikat else '',
+ 'custom_sertifikat_produk': '' if form_merchant.custom_sertifikat_produk == 'false' else form_merchant.custom_sertifikat_produk,
+ 'tempo_garansi': form_merchant.tempo_garansi,
+ 'explain_garansi': form_merchant.explain_garansi,
+ 'is_order_quantity': 'ya' if form_merchant.is_order_quantity != 'Tidak ada minimum order quantity' else 'tidak',
+ 'minimum_pembelian': form_merchant.is_order_quantity,
+
+ #dokumen
+ 'file_npwp':
+ {
+ 'name': form_merchant.file_npwp.name,
+ } if form_merchant.file_npwp else '',
+ 'file_sppkp': {
+ 'name': form_merchant.file_sppkp.name,
+ } if form_merchant.file_sppkp else '',
+ 'file_dokumenKtpDirut':
+ {
+ 'name': form_merchant.file_dokumenKtpDirut.name,
+ }if form_merchant.file_dokumenKtpDirut else '',
+ 'file_kartuNama':
+ {
+ 'name': form_merchant.file_kartuNama.name,
+ }if form_merchant.file_kartuNama else '',
+ 'file_suratPernyataan':
+ {
+ 'name': form_merchant.file_suratPernyataan.name,
+ }if form_merchant.file_suratPernyataan else '',
+ 'file_fotoKantor':
+ {
+ 'name': form_merchant.file_fotoKantor.name
+ }if form_merchant.file_fotoKantor else '',
+ 'file_dataProduk':
+ {
+ 'name': form_merchant.file_dataProduk.name,
+ }if form_merchant.file_dataProduk else '',
+ 'file_pricelist': {
+ 'name': form_merchant.file_pricelist.name,
+ } if form_merchant.file_pricelist else '',
+
+
+
+ }
+
return data \ No newline at end of file
diff --git a/indoteknik_custom/__manifest__.py b/indoteknik_custom/__manifest__.py
index 9fe3dcdb..d93db041 100755
--- a/indoteknik_custom/__manifest__.py
+++ b/indoteknik_custom/__manifest__.py
@@ -31,6 +31,8 @@
'views/web_logging/web_utm_source.xml',
'views/user_company_request.xml',
'views/user_pengajuan_tempo_request.xml',
+ 'views/user_form_merchant.xml',
+ 'views/user_merchant_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 08fa9803..e17f68d1 100755
--- a/indoteknik_custom/models/__init__.py
+++ b/indoteknik_custom/models/__init__.py
@@ -144,6 +144,8 @@ from . import stock_immediate_transfer
from . import coretax_fatur
from . import public_holiday
from . import ir_actions_report
+from . import user_form_merchant
+from . import user_merchant_request
from . import barcoding_product
from . import sales_order_koli
from . import stock_backorder_confirmation
diff --git a/indoteknik_custom/models/res_partner.py b/indoteknik_custom/models/res_partner.py
index 191a44c9..ff07c94c 100644
--- a/indoteknik_custom/models/res_partner.py
+++ b/indoteknik_custom/models/res_partner.py
@@ -161,6 +161,86 @@ class ResPartner(models.Model):
"this feature", tracking=3)
telegram_id = fields.Char(string="Telegram")
+ # MERCHANT
+ # informasi perusahaan
+ name_merchant = fields.Char(string='Name')
+ pejabat_name = fields.Char(string='Pejabat Name')
+ pic_merchant = fields.Char(string='PIC Merchant', required=True)
+ pic_position = fields.Char(string='Jabatan PIC')
+ address_merchant = fields.Char(string='Alamat')
+ state_merchant = fields.Many2one('res.country.state', string='State')
+ city_merchant = fields.Many2one('vit.kota', string='Kota')
+ district_merchant = fields.Many2one('vit.kecamatan', string='Kecamatan')
+ subDistrict_merchant = fields.Many2one('vit.kelurahan', string='Kelurahan')
+ zip_merchant = fields.Char(string='Kode Pos')
+ bank_name_merchant = fields.Char(string='Nama Bank')
+ rekening_name_merchant = fields.Char(string='Nama Rekening')
+ account_number_merchant = fields.Char(string='Nomor Rekening Bank')
+ email_company_merchant = fields.Char(string='Email Perusahaan')
+ email_sales_merchant = fields.Char(string='Email Sales')
+ email_finance_merchant = fields.Char(string='Email Finance')
+ phone_merchant = fields.Char(string='No. Telepon Perusahaan')
+ mobile_merchant = fields.Char(string='No. Handphone')
+ bisnis_type = fields.Selection([
+ ('1', 'PT'),
+ ('2', 'CV'),
+ ('3', 'Perorangan'),
+ ])
+ website_merchant = fields.Char(string='Website')
+ category_perusahaan = fields.Selection([
+ ('1', 'Principal (Pemegang merk/Produsen)'),
+ ('2', 'Sole Distributor (Distributor Tunggal)'),
+ ('3', 'Authorized Distributor (Distributor Resmi)'),
+ ('4', 'Importer (Pengimpor Barang)'),
+ ('5', 'Wholesaler (Pedagang Besar)'),
+ ])
+ # Informasi Vendor
+ harga_tayang = fields.Char(string='Harga Tayang (HET)')
+ category_produk_ids_merchant = fields.Many2many(
+ 'product.public.category',
+ string='Kategori Produk Merchant',
+ domain=lambda self: self._get_default_category_domain(),
+ relation='res_partner_category_produk_ids_merchant_rel' # Nama tabel relasi berbeda
+ )
+
+ @api.model
+ def _get_default_category_domain(self):
+ return [('parent_id', '=', False)]
+
+ merk_dagang = fields.Char(string='Merk Dagang')
+ is_pengajuan_tempo = fields.Boolean(string='Apakah anda memiliki Form Pengajuan Tempo?')
+ tempo_duration_merchant = fields.Many2one('account.payment.term', string='Durasi Tempo')
+ kredit_limit = fields.Char(string='Kredit Limit')
+ waktu_pengiriman = fields.Char(string='Waktu Pengiriman')
+ terhitung_sejak = fields.Selection([
+ ('1', 'Terima PO'),
+ ('2', 'Barang Dikirimkan'),
+ ('3', 'Tukar Faktur'),
+ ])
+
+ # syarat dagang
+ is_kembali_barang = fields.Char(string='Syarat Pengembalian Barang')
+ tenggat_waktu = fields.Char(string='Tenggat Waktu Perubahan Harga')
+ sertifikat_produk = fields.Char(string='Dokumen/Sertifikat yang Dimiliki Oleh Brand')
+ custom_sertifikat_produk = fields.Char(string='Dokumen/Sertifikat Lainnya')
+ tempo_garansi = fields.Selection([
+ ('1', '6 Bulan Garansi'),
+ ('2', '1 Tahun Garansi'),
+ ('3', '2 Tahun Garansi'),
+ ])
+ explain_garansi = fields.Char(string='Garansi Yang Dimaksudkan')
+ is_order_quantity = fields.Char(string='Apakah Memiliki Minimum Order Quantity (MOQ)')
+
+ # dokumen
+ file_npwp = fields.Many2one('ir.attachment', string="NPWP Perusahaan", tracking=3)
+ file_sppkp = fields.Many2one('ir.attachment', string="SPPKP Perusahaan", tracking=3)
+ file_dokumenKtpDirut = fields.Many2one('ir.attachment', string="KTP Dirut/Direktur", tracking=3)
+ file_kartuNama = fields.Many2one('ir.attachment', string="Kartu Nama", tracking=3)
+ file_suratPernyataan = fields.Many2one('ir.attachment', string="Surat Pernyataan Nomor Rekening", tracking=3)
+ file_fotoKantor = fields.Many2one('ir.attachment', string="Foto Gudang / Kantor Bagian Depan", tracking=3)
+ file_dataProduk = fields.Many2one('ir.attachment', string="Data Produk (Item Name, Gambar, Deskripsi)", tracking=3)
+ file_pricelist = fields.Many2one('ir.attachment', string="Pricelist", tracking=3)
+
@api.model
def _default_payment_term(self):
return self.env.ref('__export__.account_payment_term_26_484409e2').id
@@ -329,6 +409,60 @@ class ResPartner(models.Model):
vals['dokumen_foto_kantor'] = vals.get('dokumen_foto_kantor', self.dokumen_foto_kantor)
vals['dokumen_tempat_bekerja'] = vals.get('dokumen_tempat_bekerja', self.dokumen_tempat_bekerja)
+ # MERCHANT
+ # Informasi Perusahaan
+ vals['name_merchant'] = vals.get('name_merchant', self.name_merchant)
+ vals['pejabat_name'] = vals.get('pejabat_name', self.pejabat_name)
+ vals['pic_merchant'] = vals.get('pic_merchant', self.pic_merchant)
+ vals['pic_position'] = vals.get('pic_position', self.pic_position)
+ vals['address_merchant'] = vals.get('address_merchant', self.address_merchant)
+ vals['state_merchant'] = vals.get('state_merchant', self.state_merchant)
+ vals['city_merchant'] = vals.get('city_merchant', self.city_merchant)
+ vals['district_merchant'] = vals.get('district_merchant', self.district_merchant)
+ vals['subDistrict_merchant'] = vals.get('subDistrict_merchant', self.subDistrict_merchant)
+ vals['zip_merchant'] = vals.get('zip_merchant', self.zip_merchant)
+ vals['bank_name_merchant'] = vals.get('bank_name_merchant', self.bank_name_merchant)
+ vals['rekening_name_merchant'] = vals.get('rekening_name_merchant', self.rekening_name_merchant)
+ vals['account_number_merchant'] = vals.get('account_number_merchant', self.account_number_merchant)
+ vals['email_company_merchant'] = vals.get('email_company_merchant', self.email_company_merchant)
+ vals['email_sales_merchant'] = vals.get('email_sales_merchant', self.email_sales_merchant)
+ vals['email_finance_merchant'] = vals.get('email_finance_merchant', self.email_finance_merchant)
+ vals['phone_merchant'] = vals.get('phone_merchant', self.phone_merchant)
+ vals['mobile_merchant'] = vals.get('mobile_merchant', self.mobile_merchant)
+ vals['bisnis_type'] = vals.get('bisnis_type', self.bisnis_type)
+ vals['website_merchant'] = vals.get('website_merchant', self.website_merchant)
+ vals['category_perusahaan'] = vals.get('category_perusahaan', self.category_perusahaan)
+
+ # Informasi Vendor
+ vals['harga_tayang'] = vals.get('harga_tayang', self.harga_tayang)
+ vals['category_produk_ids_merchant'] = vals.get('category_produk_ids_merchant', self.category_produk_ids_merchant)
+ vals['merk_dagang'] = vals.get('merk_dagang', self.merk_dagang)
+ vals['is_pengajuan_tempo'] = vals.get('is_pengajuan_tempo', self.is_pengajuan_tempo)
+ vals['tempo_duration_merchant'] = vals.get('tempo_duration_merchant', self.tempo_duration_merchant)
+ vals['kredit_limit'] = vals.get('kredit_limit', self.kredit_limit)
+ vals['waktu_pengiriman'] = vals.get('waktu_pengiriman', self.waktu_pengiriman)
+ vals['terhitung_sejak'] = vals.get('terhitung_sejak', self.terhitung_sejak)
+
+ # Syarat Dagang
+ vals['is_kembali_barang'] = vals.get('is_kembali_barang', self.is_kembali_barang)
+ vals['tenggat_waktu'] = vals.get('tenggat_waktu', self.tenggat_waktu)
+ vals['sertifikat_produk'] = vals.get('sertifikat_produk', self.sertifikat_produk)
+ vals['custom_sertifikat_produk'] = vals.get('custom_sertifikat_produk', self.custom_sertifikat_produk)
+ vals['tempo_garansi'] = vals.get('tempo_garansi', self.tempo_garansi)
+ vals['explain_garansi'] = vals.get('explain_garansi', self.explain_garansi)
+ vals['is_order_quantity'] = vals.get('is_order_quantity', self.is_order_quantity)
+
+ # Dokumen
+ vals['file_dokumenKtpDirut'] = vals.get('file_dokumenKtpDirut', self.file_dokumenKtpDirut)
+ vals['file_kartuNama'] = vals.get('file_kartuNama', self.file_kartuNama)
+ vals['file_npwp'] = vals.get('file_npwp', self.file_npwp)
+ vals['file_sppkp'] = vals.get('file_sppkp', self.file_sppkp)
+ vals['file_suratPernyataan'] = vals.get('file_suratPernyataan', self.file_suratPernyataan)
+ vals['file_fotoKantor'] = vals.get('file_fotoKantor', self.file_fotoKantor)
+ vals['file_dataProduk'] = vals.get('file_dataProduk', self.file_dataProduk)
+ vals['file_pricelist'] = vals.get('file_pricelist', self.file_pricelist)
+ vals['description'] = vals.get('description', self.description)
+
# Simpan hanya field yang perlu di-update pada child
vals_for_child = {
'customer_type': vals.get('customer_type'),
@@ -400,7 +534,55 @@ class ResPartner(models.Model):
'dokumen_tempat_bekerja': vals.get('dokumen_tempat_bekerja'),
# internal_notes
- 'comment': vals.get('comment')
+ 'comment': vals.get('comment'),
+
+ # Merchant
+ 'name_merchant': vals.get('name_merchant'),
+ 'pejabat_name': vals.get('pejabat_name'),
+ 'pic_merchant': vals.get('pic_merchant'),
+ 'pic_position': vals.get('pic_position'),
+ 'address_merchant': vals.get('address_merchant'),
+ 'state_merchant': vals.get('state_merchant'),
+ 'city_merchant': vals.get('city_merchant'),
+ 'district_merchant': vals.get('district_merchant'),
+ 'subDistrict_merchant': vals.get('subDistrict_merchant'),
+ 'zip_merchant': vals.get('zip_merchant'),
+ 'bank_name_merchant': vals.get('bank_name_merchant'),
+ 'rekening_name_merchant': vals.get('rekening_name_merchant'),
+ 'account_number_merchant': vals.get('account_number_merchant'),
+ 'email_company_merchant': vals.get('email_company_merchant'),
+ 'email_sales_merchant': vals.get('email_sales_merchant'),
+ 'email_finance_merchant': vals.get('email_finance_merchant'),
+ 'phone_merchant': vals.get('phone_merchant'),
+ 'mobile_merchant': vals.get('mobile_merchant'),
+ 'bisnis_type': vals.get('bisnis_type'),
+ 'website_merchant': vals.get('website_merchant'),
+ 'category_perusahaan': vals.get('category_perusahaan'),
+ 'harga_tayang': vals.get('harga_tayang'),
+ 'category_produk_ids_merchant': vals.get('category_produk_ids_merchant'),
+ 'merk_dagang': vals.get('merk_dagang'),
+ 'is_pengajuan_tempo': vals.get('is_pengajuan_tempo'),
+ 'tempo_duration_merchant': vals.get('tempo_duration_merchant'),
+ 'kredit_limit': vals.get('kredit_limit'),
+ 'waktu_pengiriman': vals.get('waktu_pengiriman'),
+ 'terhitung_sejak': vals.get('terhitung_sejak'),
+ 'is_kembali_barang': vals.get('is_kembali_barang'),
+ 'tenggat_waktu': vals.get('tenggat_waktu'),
+ 'sertifikat_produk': vals.get('sertifikat_produk'),
+ 'custom_sertifikat_produk': vals.get('custom_sertifikat_produk'),
+ 'tempo_garansi': vals.get('tempo_garansi'),
+ 'explain_garansi': vals.get('explain_garansi'),
+ 'is_order_quantity': vals.get('is_order_quantity'),
+
+ 'file_dokumenKtpDirut': vals.get('file_dokumenKtpDirut'),
+ 'file_kartuNama': vals.get('file_kartuNama'),
+ 'file_npwp': vals.get('file_npwp'),
+ 'file_sppkp': vals.get('file_sppkp'),
+ 'file_suratPernyataan': vals.get('file_suratPernyataan'),
+ 'file_fotoKantor': vals.get('file_fotoKantor'),
+ 'file_dataProduk': vals.get('file_dataProduk'),
+ 'file_pricelist': vals.get('file_pricelist'),
+ 'description': vals.get('description'),
}
# Lakukan update pada semua child secara rekursif
diff --git a/indoteknik_custom/models/sale_order.py b/indoteknik_custom/models/sale_order.py
index bdf8f1eb..6028a1d0 100755
--- a/indoteknik_custom/models/sale_order.py
+++ b/indoteknik_custom/models/sale_order.py
@@ -336,6 +336,12 @@ class SaleOrder(models.Model):
date_unhold = fields.Datetime(string='Date Unhold', tracking=True, readonly=True, help='Waktu ketika SO di Unhold'
)
+ ready_to_ship_status_detail = fields.Char(
+ string='Status Shipping Detail',
+ compute='_compute_ready_to_ship_status_detail'
+ )
+
+
def _compute_total_margin_excl_third_party(self):
for order in self:
if order.amount_untaxed == 0:
@@ -2006,5 +2012,45 @@ class SaleOrder(models.Model):
if any(fields in vals for fields in ['delivery_amt', 'carrier_id', 'shipping_cost_covered']):
self._validate_delivery_amt()
if any(field in vals for field in ["order_line", "client_order_ref"]):
+<<<<<<< HEAD
self._calculate_etrts_date()
return res
+=======
+ self._calculate_etrts_date()
+ return res
+
+ # @api.depends('commitment_date')
+ def _compute_ready_to_ship_status_detail(self):
+ for order in self:
+ eta = order.commitment_date
+
+ match_lines = self.env['purchase.order.sales.match'].search([
+ ('sale_id', '=', order.id)
+ ])
+
+ if match_lines:
+ for match in match_lines:
+ po = match.purchase_order_id
+ product = match.product_id
+
+ po_line = self.env['purchase.order.line'].search([
+ ('order_id', '=', po.id),
+ ('product_id', '=', product.id)
+ ], limit=1)
+
+ stock_move = self.env['stock.move'].search([
+ ('purchase_line_id', '=', po_line.id)
+ ], limit=1)
+ picking_in = stock_move.picking_id
+
+ result_date = picking_in.date_done if picking_in else None
+ if result_date:
+ status = "Early" if result_date < eta else "Delay"
+ result_date_str = result_date.strftime('%m/%d/%Y')
+ eta_str = eta.strftime('%m/%d/%Y')
+ order.ready_to_ship_status_detail = f"Expected: {eta_str} | Realtime: {result_date_str} | {status}"
+ else:
+ order.ready_to_ship_status_detail = "On Track"
+ else:
+ order.ready_to_ship_status_detail = 'On Track'
+>>>>>>> CR/form-merchant
diff --git a/indoteknik_custom/models/user_form_merchant.py b/indoteknik_custom/models/user_form_merchant.py
new file mode 100644
index 00000000..a804e93f
--- /dev/null
+++ b/indoteknik_custom/models/user_form_merchant.py
@@ -0,0 +1,98 @@
+from odoo import models, fields, api
+from odoo.exceptions import UserError
+from odoo.http import request
+
+
+class UserFormMerchant(models.Model):
+ _name = 'user.form.merchant'
+ _inherit = ['mail.thread', 'mail.activity.mixin']
+
+ name = fields.Char(string='Name')
+ # informasi peruhsaan
+ name_merchant = fields.Char(string='Name')
+ pejabat_name = fields.Char(string='Pejabat Name')
+ pic_merchant = fields.Char(string='PIC Merchant')
+ pic_position = fields.Char(string='Jabatan PIC')
+ partner_id = fields.Many2one('res.partner', string='Company')
+ address = fields.Char(string='Alamat')
+ state = fields.Many2one('res.country.state', string='State')
+ city = fields.Many2one('vit.kota', string='Kota')
+ district = fields.Many2one('vit.kecamatan', string='Kecamatan')
+ subDistrict = fields.Many2one('vit.kelurahan', string='Kelurahan')
+ zip = fields.Char(string='Kode Pos')
+ bank_name = fields.Char(string='Nama Bank')
+ rekening_name = fields.Char(string='Nama Rekening')
+ account_number = fields.Char(string='Nomor Rekening Bank')
+ email_company = fields.Char(string='Email Perusahaan')
+ email_sales = fields.Char(string='Email Sales')
+ email_finance = fields.Char(string='Email Finance')
+ phone = fields.Char(string='No. Telepon Perusahaan')
+ mobile = fields.Char(string='No. Handphone')
+ bisnis_type = fields.Selection([
+ ('1', 'PT'),
+ ('2', 'CV'),
+ ('3', 'Perorangan'),
+ ])
+ website = fields.Char(string='Website')
+ category_perusahaan = fields.Selection([
+ ('1', 'Principal (Pemegang merk/Produsen)'),
+ ('2', 'Sole Distributor (Distributor Tunggal)'),
+ ('3', 'Authorized Distributor (Distributor Resmi)'),
+ ('4', 'Importer (Pengimpor Barang)'),
+ ('5', 'Wholesaler (Pedagang Besar)'),
+ ])
+ description = fields.Text(string='Deskripsi')
+
+ # imformasi Vendor
+ harga_tayang = fields.Char(string='Harga Tayang (HET)')
+ category_produk_ids = fields.Many2many('product.public.category', string='Kategori Produk yang Digunakan',
+ domain=lambda self: self._get_default_category_domain())
+
+ @api.model
+ def _get_default_category_domain(self):
+ return [('parent_id', '=', False)]
+
+ merk_dagang = fields.Char(string='Merk Dagang')
+ is_pengajuan_tempo = fields.Boolean(string='Apakah anda memiliki Form Pengajuan Tempo?')
+ tempo_duration = fields.Many2one('account.payment.term', string='Durasi Tempo')
+ kredit_limit = fields.Char(string='Kredit Limit')
+ waktu_pengiriman = fields.Char(string='Waktu Pengiriman')
+ terhitung_sejak = fields.Selection([
+ ('1', 'Terima PO'),
+ ('2', 'Barang Dikirimkan'),
+ ('3', 'Tukar Faktur'),
+ ])
+
+ # syarat dagang
+ is_kembali_barang = fields.Char(string='Syarat Pengembalian Barang')
+ tenggat_waktu = fields.Char(string='Tenggat Waktu Perubahan Harga')
+ sertifikat_produk = fields.Char(string='Dokumen/Sertifikat yang Dimiliki Oleh Brand')
+ custom_sertifikat_produk = fields.Char(string='Dokumen/Sertifikat Lainnya')
+ tempo_garansi = fields.Selection([
+ ('1', '6 Bulan Garansi'),
+ ('2', '1 Tahun Garansi'),
+ ('3', '2 Tahun Garansi'),
+ ])
+ explain_garansi = fields.Char(string='Garansi Yang Dimaksudkan')
+ is_order_quantity = fields.Char(string='Apakah Memiliki Minimum Order Quantity (MOQ)')
+
+ # dokumen
+ file_npwp = fields.Many2one('ir.attachment', string="NPWP Perusahaan", tracking=3)
+ file_sppkp = fields.Many2one('ir.attachment', string="SPPKP Perusahaan", tracking=3)
+ file_dokumenKtpDirut = fields.Many2one('ir.attachment', string="KTP Dirut/Direktur", tracking=3)
+ file_kartuNama = fields.Many2one('ir.attachment', string="Kartu Nama", tracking=3)
+ file_suratPernyataan = fields.Many2one('ir.attachment', string="Surat Pernyataan Nomor Rekening", tracking=3)
+ file_fotoKantor = fields.Many2one('ir.attachment', string="Foto Gudang / Kantor Bagian Depan", tracking=3)
+ file_dataProduk = fields.Many2one('ir.attachment', string="Data Produk (Item Name, Gambar, Deskripsi)", tracking=3)
+ file_pricelist = fields.Many2one('ir.attachment', string="Pricelist", tracking=3)
+
+ @api.depends('name', 'name_merchant')
+ def name_get(self):
+ result = []
+ for record in self:
+ if record.name_merchant:
+ display_name = record.name_merchant
+ else:
+ display_name = "DETAIL FORM MERCHANT"
+ result.append((record.id, display_name))
+ return result \ No newline at end of file
diff --git a/indoteknik_custom/models/user_merchant_request.py b/indoteknik_custom/models/user_merchant_request.py
new file mode 100644
index 00000000..dd571cdc
--- /dev/null
+++ b/indoteknik_custom/models/user_merchant_request.py
@@ -0,0 +1,125 @@
+from odoo import models, fields, api, _
+from odoo.exceptions import UserError
+from odoo.http import request
+
+
+class RejectReasonWizardMerchant(models.TransientModel):
+ _name = 'reject.reason.wizard.merchant'
+ _description = 'Wizard for Reject Reason'
+
+ request_id = fields.Many2one('user.merchant.request', string='Request')
+ reason_reject = fields.Text(string='Reason for Rejection', required=True)
+
+ def confirm_reject(self):
+ merchant = self.request_id
+ if merchant:
+ merchant.write({'reason_reject': self.reason_reject})
+ merchant.state_merchant = 'reject'
+ return {'type': 'ir.actions.act_window_close'}
+
+
+class ConfirmApprovalWizardMerchant(models.TransientModel):
+ _name = 'confirm.approval.wizard.merchant'
+ _description = 'Wizard Konfirmasi Approval'
+
+ merchant_id = fields.Many2one('user.merchant.request', string='Merchant', required=True)
+
+ def confirm_approval(self):
+ merchant = self.merchant_id
+ if merchant.state_merchant == 'draft':
+ merchant.state_merchant = 'approved'
+
+
+class UserMerchantRequest(models.Model):
+ _name = 'user.merchant.request'
+ _inherit = ['mail.thread', 'mail.activity.mixin']
+ _rec_name = 'user_id'
+
+ user_id = fields.Many2one('res.partner', string='User')
+ merchant_id = fields.Many2one('user.form.merchant', string='Form Merchant')
+ user_company_id = fields.Many2one('res.partner', string='Company')
+ state_merchant = fields.Selection([
+ ('draft', 'Pengajuan Merchant'),
+ ('approved', 'Approved Merchant'),
+ ('reject', 'Rejected'),
+ ], string='Status', readonly=True, copy=False, index=True, track_visibility='onchange', default='draft')
+ reason_reject = fields.Char(string='Reaject Reason')
+
+ def button_approve(self):
+ for merchant in self:
+ return {
+ 'type': 'ir.actions.act_window',
+ 'name': 'Konfirmasi Approve',
+ 'res_model': 'confirm.approval.wizard.merchant',
+ 'view_mode': 'form',
+ 'target': 'new',
+ 'context': {
+ 'default_merchant_id': merchant.id,
+ }}
+
+ def button_reject(self):
+ return {
+ 'type': 'ir.actions.act_window',
+ 'name': _('Reject Reason'),
+ 'res_model': 'reject.reason.wizard.merchant',
+ 'view_mode': 'form',
+ 'target': 'new',
+ 'context': {'default_request_id': self.id},
+ }
+
+ def write(self, vals):
+ is_approve = True if self.state_merchant == 'approved' or vals.get('state_merchant') == 'approved' else False
+ if is_approve:
+ # Informasi Perusahaan
+ self.user_company_id.name_merchant = self.merchant_id.name_merchant
+ self.user_company_id.pejabat_name = self.merchant_id.pejabat_name
+ self.user_company_id.pic_merchant = self.merchant_id.pic_merchant
+ self.user_company_id.pic_position = self.merchant_id.pic_position
+ self.user_company_id.address_merchant = self.merchant_id.address
+ self.user_company_id.state_merchant = self.merchant_id.state
+ self.user_company_id.city_merchant = self.merchant_id.city
+ self.user_company_id.district_merchant = self.merchant_id.district
+ self.user_company_id.subDistrict_merchant = self.merchant_id.subDistrict
+ self.user_company_id.zip_merchant = self.merchant_id.zip
+ self.user_company_id.bank_name_merchant = self.merchant_id.bank_name
+ self.user_company_id.rekening_name_merchant = self.merchant_id.rekening_name
+ self.user_company_id.account_number_merchant = self.merchant_id.account_number
+ self.user_company_id.email_company_merchant = self.merchant_id.email_company
+ self.user_company_id.email_sales_merchant = self.merchant_id.email_sales
+ self.user_company_id.email_finance_merchant = self.merchant_id.email_finance
+ self.user_company_id.phone_merchant = self.merchant_id.phone
+ self.user_company_id.mobile_merchant = self.merchant_id.mobile
+ self.user_company_id.bisnis_type = self.merchant_id.bisnis_type
+ self.user_company_id.website_merchant = self.merchant_id.website
+ self.user_company_id.category_perusahaan = self.merchant_id.category_perusahaan
+
+ # Informasi Vendor
+ self.user_company_id.harga_tayang = self.merchant_id.harga_tayang
+ self.user_company_id.category_produk_ids_merchant = self.merchant_id.category_produk_ids
+ self.user_company_id.merk_dagang = self.merchant_id.merk_dagang
+ self.user_company_id.is_pengajuan_tempo = self.merchant_id.is_pengajuan_tempo
+ self.user_company_id.tempo_duration_merchant = self.merchant_id.tempo_duration
+ self.user_company_id.kredit_limit = self.merchant_id.kredit_limit
+ self.user_company_id.waktu_pengiriman = self.merchant_id.waktu_pengiriman
+ self.user_company_id.terhitung_sejak = self.merchant_id.terhitung_sejak
+
+ # Syarat Perdagangan
+ self.user_company_id.is_kembali_barang = self.merchant_id.is_kembali_barang
+ self.user_company_id.tenggat_waktu = self.merchant_id.tenggat_waktu
+ self.user_company_id.sertifikat_produk = self.merchant_id.sertifikat_produk
+ self.user_company_id.tempo_garansi = self.merchant_id.tempo_garansi
+ self.user_company_id.explain_garansi = self.merchant_id.explain_garansi
+ self.user_company_id.is_order_quantity = self.merchant_id.is_order_quantity
+
+ # Dokumen
+ self.user_company_id.file_npwp = self.merchant_id.file_npwp
+ self.user_company_id.file_sppkp = self.merchant_id.file_sppkp
+ self.user_company_id.file_dokumenKtpDirut = self.merchant_id.file_dokumenKtpDirut
+ self.user_company_id.file_kartuNama = self.merchant_id.file_kartuNama
+ self.user_company_id.file_suratPernyataan = self.merchant_id.file_suratPernyataan
+ self.user_company_id.file_fotoKantor = self.merchant_id.file_fotoKantor
+ self.user_company_id.file_dataProduk = self.merchant_id.file_dataProduk
+ self.user_company_id.file_pricelist = self.merchant_id.file_pricelist
+ self.user_company_id.description = self.merchant_id.description
+
+ return super(UserMerchantRequest, self).write(vals) \ 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 601f04c5..28fc760d 100755
--- a/indoteknik_custom/security/ir.model.access.csv
+++ b/indoteknik_custom/security/ir.model.access.csv
@@ -169,6 +169,10 @@ access_User_pengajuan_tempo_line,access.user.pengajuan.tempo.line,model_user_pen
access_user_pengajuan_tempo,access.user.pengajuan.tempo,model_user_pengajuan_tempo,,1,1,1,1
access_reject_reason_wizard,reject.reason.wizard,model_reject_reason_wizard,,1,1,1,0
access_confirm_approval_wizard,confirm.approval.wizard,model_confirm_approval_wizard,,1,1,1,0
+access_user_form_merchant,access.user.form.merchant,model_user_form_merchant,,1,1,1,1
+access_user_merchant_request,access.user.merchant.request,model_user_merchant_request,,1,1,1,1
+access_reject_reason_wizard_merchant,reject.reason.wizard.merchant,model_reject_reason_wizard_merchant,,1,1,1,0
+access_confirm_approval_wizard_merchant,confirm.approval.wizard.merchant,model_confirm_approval_wizard_merchant,,1,1,1,0
access_hr_public_holiday,confirm.hr.public.holiday,model_hr_public_holiday,,1,1,1,0
access_barcode_product,access.barcode.product,model_barcode_product,,1,1,1,1
access_barcoding_product,access.barcoding.product,model_barcoding_product,,1,1,1,1
diff --git a/indoteknik_custom/views/res_partner.xml b/indoteknik_custom/views/res_partner.xml
index cb9fa3ac..5160523f 100644
--- a/indoteknik_custom/views/res_partner.xml
+++ b/indoteknik_custom/views/res_partner.xml
@@ -190,6 +190,66 @@
</group>
</page>
</notebook>
+ <notebook>
+ <page string="Merchant">
+ <group>
+ <group string="Informasi Perusahaan">
+ <field name="name_merchant" />
+ <field name="pejabat_name" />
+ <field name="pic_merchant" />
+ <field name="pic_position" />
+ <field name="address_merchant" />
+ <field name="state_merchant" />
+ <field name="city_merchant" />
+ <field name="district_merchant" />
+ <field name="subDistrict_merchant" />
+ <field name="zip_merchant" />
+ <field name="bank_name_merchant" />
+ <field name="rekening_name_merchant" />
+ <field name="account_number_merchant" />
+ <field name="email_company_merchant" widget="email"/>
+ <field name="email_sales_merchant" widget="email"/>
+ <field name="email_finance_merchant" widget="email"/>
+ <field name="phone_merchant" widget="phone"/>
+ <field name="mobile_merchant" widget="phone"/>
+ <field name="bisnis_type" />
+ <field name="website_merchant" />
+ <field name="category_perusahaan" />
+ </group>
+ <group string="Syarat Perdagangan">
+ <field name="is_kembali_barang" />
+ <field name="tenggat_waktu" />
+ <field name="sertifikat_produk" />
+ <field name="tempo_garansi" />
+ <field name="explain_garansi" />
+ <field name="is_order_quantity" />
+ </group>
+ <group string="Informasi Vendor">
+ <field name="harga_tayang" />
+ <field name="category_produk_ids_merchant" widget="many2many_tags" />
+ <field name="merk_dagang" />
+ <field name="is_pengajuan_tempo" />
+ <field name="tempo_duration_merchant" />
+ <field name="kredit_limit" />
+ <field name="waktu_pengiriman" />
+ <field name="terhitung_sejak" />
+ </group>
+ <group string="Dokumen">
+ <field name="file_npwp" />
+ <field name="file_sppkp" />
+ <field name="file_dokumenKtpDirut" />
+ <field name="file_kartuNama" />
+ <field name="file_suratPernyataan" />
+ <field name="file_fotoKantor" />
+ <field name="file_dataProduk" />
+ <field name="file_pricelist" />
+ </group>
+ <group>
+<!-- <field name="description" />-->
+ </group>
+ </group>
+ </page>
+ </notebook>
</field>
</record>
</data>
diff --git a/indoteknik_custom/views/sale_order.xml b/indoteknik_custom/views/sale_order.xml
index a599a7b8..92d13fa7 100755
--- a/indoteknik_custom/views/sale_order.xml
+++ b/indoteknik_custom/views/sale_order.xml
@@ -103,6 +103,7 @@
<field name="compute_fullfillment" invisible="1" />
</field>
<field name="tag_ids" position="after">
+<<<<<<< HEAD
<field name="eta_date_start"/>
<t t-esc="' to '"/>
<field name="eta_date" readonly="1"/>
@@ -112,6 +113,18 @@
<field name="percent_margin_after_delivery_purchase"/>
<field name="total_weight"/>
<field name="pareto_status"/>
+=======
+ <field name="eta_date_start" />
+ <t t-esc="' to '" />
+ <field name="eta_date" readonly="1" />
+ <field name="expected_ready_to_ship" />
+ <field name="ready_to_ship_status_detail"/>
+ <field name="flash_sale" />
+ <field name="margin_after_delivery_purchase" />
+ <field name="percent_margin_after_delivery_purchase" />
+ <field name="total_weight" />
+ <field name="pareto_status" />
+>>>>>>> CR/form-merchant
</field>
<field name="analytic_account_id" position="after">
<field name="customer_type" readonly="1"/>
diff --git a/indoteknik_custom/views/user_form_merchant.xml b/indoteknik_custom/views/user_form_merchant.xml
new file mode 100644
index 00000000..ae5a0f9f
--- /dev/null
+++ b/indoteknik_custom/views/user_form_merchant.xml
@@ -0,0 +1,109 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<odoo>
+ <record id="user_form_merchant_tree" model="ir.ui.view">
+ <field name="name">user.form.merchant.tree</field>
+ <field name="model">user.form.merchant</field>
+ <field name="arch" type="xml">
+ <tree create="1" default_order="create_date desc">
+ <field name="name_merchant"/>
+ <field name="email_company"/>
+ <field name="phone"/>
+ <field name="description"/>
+ <field name="create_date"/>
+ </tree>
+ </field>
+ </record>
+
+ <record id="user_form_merchant_form" model="ir.ui.view">
+ <field name="name">user.form.merchant.form</field>
+ <field name="model">user.form.merchant</field>
+ <field name="arch" type="xml">
+ <form create="0">
+ <sheet>
+ <group>
+ <group string="Informasi Perusahaan" >
+ <field name="name_merchant" />
+ <field name="pejabat_name" />
+ <field name="pic_merchant" />
+ <field name="pic_position" />
+ <field name="address" />
+ <field name="state" />
+ <field name="city" />
+ <field name="district" />
+ <field name="subDistrict" />
+ <field name="zip" />
+ <field name="bank_name" />
+ <field name="rekening_name" />
+ <field name="account_number" />
+ <field name="email_company" widget="email"/>
+ <field name="email_sales" widget="email"/>
+ <field name="email_finance" widget="email"/>
+ <field name="phone" widget="phone"/>
+ <field name="mobile" widget="phone"/>
+ <field name="bisnis_type" />
+ <field name="website" />
+ <field name="category_perusahaan" />
+ </group>
+ </group>
+ <group string="Informasi Vendor">
+ <group>
+ <field name="harga_tayang" />
+ <field name="category_produk_ids" widget="many2many_tags"/>
+ <field name="merk_dagang" />
+ <field name="is_pengajuan_tempo" />
+ <field name="tempo_duration" />
+ <field name="kredit_limit" />
+ <field name="waktu_pengiriman" />
+ <field name="terhitung_sejak" />
+ </group>
+
+ </group>
+ <group string="Syarat Perdagangan">
+ <group>
+ <field name="is_kembali_barang" />
+ <field name="tenggat_waktu" />
+ <field name="sertifikat_produk" />
+<!-- <field name="custom_sertifikat_produk" />-->
+ <field name="tempo_garansi" />
+ <field name="explain_garansi" />
+ <field name="is_order_quantity" />
+
+ </group>
+ </group>
+ <group string="Dokumen">
+ <group>
+ <field name="file_npwp" />
+ <field name="file_sppkp" />
+ <field name="file_dokumenKtpDirut" />
+ <field name="file_kartuNama" />
+ <field name="file_suratPernyataan" />
+ <field name="file_fotoKantor" />
+ <field name="file_dataProduk" />
+ <field name="file_pricelist" />
+ </group>
+ <group>
+<!-- <field name="description" />-->
+ </group>
+ </group>
+ </sheet>
+ </form>
+ </field>
+ </record>
+
+ <record id="action_user_form_merchant" model="ir.actions.act_window">
+ <field name="name">User Form Merchant</field>
+ <field name="type">ir.actions.act_window</field>
+ <field name="res_model">user.form.merchant</field>
+ <field name="view_mode">tree,form</field>
+ </record>
+
+
+<!-- <menuitem-->
+<!-- id="menu_user_form_merchant"-->
+<!-- name="User Form Merchant"-->
+<!-- parent="res_partner_menu_user"-->
+<!-- sequence="1"-->
+<!-- action="action_user_form_merchant"-->
+<!-- />-->
+
+</odoo> \ No newline at end of file
diff --git a/indoteknik_custom/views/user_merchant_request.xml b/indoteknik_custom/views/user_merchant_request.xml
new file mode 100644
index 00000000..e4f309fd
--- /dev/null
+++ b/indoteknik_custom/views/user_merchant_request.xml
@@ -0,0 +1,112 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<odoo>
+ <record id="user_merchant_request_tree" model="ir.ui.view">
+ <field name="name">user.merchant.request.tree</field>
+ <field name="model">user.merchant.request</field>
+ <field name="arch" type="xml">
+ <tree create="1" default_order="create_date desc">
+ <field name="user_id"/>
+ <field name="merchant_id"/>
+ <field name="state_merchant" decoration-success="state_merchant == 'approved'" decoration-danger="state_merchant == 'reject'" widget="badge" optional="show"/>
+ <field name="create_date"/>
+ </tree>
+ </field>
+ </record>
+
+ <record id="user_merchant_request_form" model="ir.ui.view">
+ <field name="name">user.merchant.request.form</field>
+ <field name="model">user.merchant.request</field>
+ <field name="arch" type="xml">
+ <form create="0">
+ <header>
+ <button name="button_approve"
+ string="Approve Merchant"
+ attrs="{'invisible': [('state_merchant', 'in', ['approved','reject'])]}"
+ type="object"
+ class="oe_highlight"/>
+ <button name="button_reject"
+ string="Reject"
+ attrs="{'invisible': [('state_merchant', 'in', ['approved','reject'])]}"
+ type="object"
+ groups="purchase.group_purchase_manager"
+ class="oe_highlight"/>
+ <field name="state_merchant" widget="statusbar"
+ statusbar_visible="draft,approved"
+ statusbar_colors='{"reject":"red"}'/>
+ </header>
+ <sheet>
+ <group>
+ <group>
+ <field name="user_id" readonly="1"/>
+ <field name="merchant_id"/>
+ </group>
+ </group>
+ </sheet>
+ <div class="oe_chatter">
+ <field name="message_ids" widget="mail_thread"/>
+ </div>
+ </form>
+ </field>
+</record>
+
+
+
+
+ <!-- Wizard for Reject Reason -->
+<record id="view_reject_reason_wizard_merchant_form" model="ir.ui.view">
+ <field name="name">reject.reason.wizard.merchant.form</field>
+ <field name="model">reject.reason.wizard.merchant</field>
+ <field name="arch" type="xml">
+ <form string="Reject Reason">
+ <group>
+ <field name="reason_reject" widget="text"/>
+ </group>
+ <footer>
+ <button string="Confirm" type="object" name="confirm_reject" class="btn-primary"/>
+ <button string="Cancel" class="btn-secondary" special="cancel"/>
+ </footer>
+ </form>
+ </field>
+</record>
+
+<record id="action_reject_reason_wizard_merchant" model="ir.actions.act_window">
+ <field name="name">Reject Reason</field>
+ <field name="res_model">reject.reason.wizard.merchant</field>
+ <field name="view_mode">form</field>
+ <field name="target">new</field>
+</record>
+
+
+<record id="view_confirm_approval_wizard_merchant_form" model="ir.ui.view">
+ <field name="name">confirm.approval.wizard.merchant.form</field>
+ <field name="model">confirm.approval.wizard.merchant</field>
+ <field name="arch" type="xml">
+ <form string="Konfirmasi Approval">
+ <group>
+ <p>Apakah Anda yakin ingin mengapprove merchant ini?</p>
+ </group>
+ <footer>
+ <button string="Batal" class="btn-secondary" special="cancel"/>
+ <button string="Konfirmasi" type="object" name="confirm_approval" class="btn-primary"/>
+ </footer>
+ </form>
+ </field>
+</record>
+
+
+
+ <record id="action_user_merchant_request" model="ir.actions.act_window">
+ <field name="name">User Merchant Request</field>
+ <field name="type">ir.actions.act_window</field>
+ <field name="res_model">user.merchant.request</field>
+ <field name="view_mode">tree,form</field>
+ </record>
+
+ <menuitem
+ id="menu_user_merchant_request"
+ name="User Merchant Request"
+ parent="res_partner_menu_user"
+ sequence="2"
+ action="action_user_merchant_request"
+ />
+</odoo> \ No newline at end of file