summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIndoteknik . <it@fixcomart.co.id>2025-08-18 09:02:59 +0700
committerIndoteknik . <it@fixcomart.co.id>2025-08-18 09:02:59 +0700
commit90fb71ebdd4f7324a5491780f24dc18b8bd7ccc4 (patch)
treef6887dddf1484bf1428b3ebf1de331603430f145
parentb133092eb4d27174f774d96f0a090670ad694d19 (diff)
parent28c2d4175eae1b363d1a306737705aaae067515b (diff)
Merge branch 'odoo-backup' of https://bitbucket.org/altafixco/indoteknik-addons into pum-v2
-rw-r--r--indoteknik_api/controllers/api_v1/partner.py69
-rw-r--r--indoteknik_api/controllers/api_v1/user.py31
-rw-r--r--indoteknik_custom/models/res_partner.py151
-rw-r--r--indoteknik_custom/models/user_company_request.py10
4 files changed, 193 insertions, 68 deletions
diff --git a/indoteknik_api/controllers/api_v1/partner.py b/indoteknik_api/controllers/api_v1/partner.py
index acec19f7..b1d8d5f3 100644
--- a/indoteknik_api/controllers/api_v1/partner.py
+++ b/indoteknik_api/controllers/api_v1/partner.py
@@ -65,44 +65,61 @@ class Partner(controller.Controller):
@controller.Controller.must_authorized()
def write_partner_address_by_id(self, id, **kw):
headers = {
- 'Access-Control-Allow-Origin': '*',
- 'Access-Control-Allow-Methods': 'GET, POST, PUT, DELETE, OPTIONS',
- 'Access-Control-Allow-Headers': '*'
- }
+ 'Access-Control-Allow-Origin': '*',
+ 'Access-Control-Allow-Methods': 'GET, POST, PUT, DELETE, OPTIONS',
+ 'Access-Control-Allow-Headers': '*'
+ }
if request.httprequest.method == 'OPTIONS':
return Response(status=200, headers=headers)
+
try:
params = self.get_request_params(request.jsonrequest, {
- 'id': ['required', 'number'],
- 'type': ['default:other'],
- 'name': ['required'],
- 'email': ['required'],
- 'mobile': ['required'],
- 'phone': [''],
- 'street': ['required'],
- 'state_id': ['required', 'alias:state_id'],
- 'city_id': ['required', 'alias:kota_id'],
- 'district_id': ['alias:kecamatan_id'],
- 'sub_district_id': ['alias:kelurahan_id', 'exclude_if_null'],
- 'zip': ['required'],
- 'longtitude': '',
- 'latitude': '',
- 'address_map': [],
- 'alamat_lengkap_text': []
- })
+ 'id': ['required', 'number'],
+ 'type': ['default:other'],
+ 'name': ['required'],
+ 'email': ['required'],
+ 'mobile': ['required'],
+ 'phone': [''],
+ 'street': ['required'],
+ 'state_id': ['required', 'alias:state_id'],
+ 'city_id': ['required', 'alias:kota_id'],
+ 'district_id': ['alias:kecamatan_id'],
+ 'sub_district_id': ['alias:kelurahan_id', 'exclude_if_null'],
+ 'zip': ['required'],
+ 'longtitude': '',
+ 'latitude': '',
+ 'address_map': [],
+
+ 'alamat_lengkap_text': []
+ })
if not params['valid']:
- return {'headers' : headers,'code': 400, 'description': params}
+ return {'headers': headers, 'code': 400, 'description': params}
partner = request.env['res.partner'].sudo().search([('id', '=', id)], limit=1)
if not partner:
- return {'headers' : headers,'code': 404, 'description': 'User not found'}
+ return {'headers': headers, 'code': 404, 'description': 'User not found'}
+ vals = dict(params['value'])
+ vals.pop('id', None)
+ use_pin = bool(request.jsonrequest.get('use_pin'))
+
+ if not use_pin:
+ vals.pop('address_map', None)
+ vals.pop('latitude', None)
+ vals.pop('longtitude', None)
+ else:
+ lat = vals.get('latitude')
+ lng = vals.get('longtitude')
+ if not lat or not lng or float(lat) == 0.0 or float(lng) == 0.0:
+ vals.pop('latitude', None)
+ vals.pop('longtitude', None)
+
+ partner.write(vals)
- partner.write(params['value'])
- return {'id': partner.id, 'headers' : headers}
+ return {'id': partner.id, 'headers': headers}
except Exception as e:
- return {'headers' : headers,'code': 500, 'description': f'Internal Error: {str(e)}'}
+ return {'headers': headers, 'code': 500, 'description': f'Internal Error: {str(e)}'}
@http.route(prefix + 'partner/address', auth='public', methods=['POST', 'OPTIONS'], csrf=False)
@controller.Controller.must_authorized()
diff --git a/indoteknik_api/controllers/api_v1/user.py b/indoteknik_api/controllers/api_v1/user.py
index b5b7e055..dde30fec 100644
--- a/indoteknik_api/controllers/api_v1/user.py
+++ b/indoteknik_api/controllers/api_v1/user.py
@@ -396,7 +396,7 @@ class User(controller.Controller):
'user': request.env['res.users'].api_single_response(user)
})
- @http.route(prefix + 'user/<id>', auth='public', methods=['PUT', 'OPTIONS'], csrf=False)
+ @http.route(prefix + 'user/<id>', auth='public', methods=['POST', 'OPTIONS'], csrf=False)
@controller.Controller.must_authorized()
def update_user(self, **kw):
id = kw.get('id')
@@ -446,7 +446,7 @@ class User(controller.Controller):
return self.response(address)
- @http.route(prefix + 'user/<id>/switch', auth='public', methods=['PUT', 'OPTIONS'], csrf=False)
+ @http.route(prefix + 'user/<id>/switch', auth='public', methods=['POST', 'OPTIONS'], csrf=False)
@controller.Controller.must_authorized()
def switch_account(self, **kw):
id = int(kw.get('id'))
@@ -489,7 +489,7 @@ class User(controller.Controller):
if type_acc == 'business':
parameter = [
- ('company_type', '=', 'company'),
+ ('is_company', '=', True),
('name', 'ilike', business_name)
]
if parent_id:
@@ -674,11 +674,11 @@ class User(controller.Controller):
# request_company.send_company_request_mail_switch()
request_company.send_company_request_mail_switch()
- response['switch'] = 'Pending'
+ response['switch'] = 'pending'
return self.response(response)
- @http.route(prefix + 'user/<id>/switch_progres', auth='public', methods=['GET', 'OPTIONS'], csrf=False)
- # @controller.Controller.must_authorized()
+ @http.route(prefix + 'user/<id>/switch_progres', auth='public', methods=['GET', 'OPTIONS'])
+ @controller.Controller.must_authorized()
def switch_account_progres(self, **kw):
id = int(kw.get('id'))
# user = request.env['res.partner'].search([('id', '=', id)], limit=1)
@@ -691,15 +691,28 @@ class User(controller.Controller):
new_company_request = request.env['user.company.request'].search(parameter, limit=1)
is_approve = ''
if new_company_request:
- # Mengambil nilai is_approve
- if new_company_request.is_approve == False:
+ if not new_company_request.is_approve: # None atau ''
response['status'] = 'pending'
else:
- response['status'] = new_company_request.is_approve
+ response['status'] = new_company_request.is_approve # 'approved' atau 'rejected'
else:
response['status'] = False
return self.response(response)
+ # @http.route(prefix + 'user/<id>/parent_status', auth='public', methods=['GET', 'OPTIONS'], csrf=False)
+ # # @controller.Controller.must_authorized()
+ # def parent_status(self, **kw):
+ # id = int(kw.get('id'))
+ # response = {
+ # 'parentId': None,
+ # 'parentName': None
+ # }
+ # partner = request.env['res.partner'].sudo().search([('id', '=', id)], limit=1)
+ # if partner and partner.parent_id:
+ # response['parentId'] = partner.parent_id.id
+ # response['parentName'] = partner.parent_id.name
+ # return self.response(response)
+
def get_user_by_email(self, email):
return request.env['res.users'].search([
('login', '=', email),
diff --git a/indoteknik_custom/models/res_partner.py b/indoteknik_custom/models/res_partner.py
index cf9fbea4..e5e382a1 100644
--- a/indoteknik_custom/models/res_partner.py
+++ b/indoteknik_custom/models/res_partner.py
@@ -199,16 +199,20 @@ class ResPartner(models.Model):
alamat_lengkap_text = fields.Text(string="Alamat Lengkap", required=False, tracking=3)
- def write(self, vals):
- res = super(ResPartner, self).write(vals)
+ # def write(self, vals):
+ # res = super(ResPartner, self).write(vals)
- for rec in self:
- if 'latitude' in vals or 'longtitude' in vals:
- rec._update_address_from_coords()
+ # use_pin = bool(self.env.context.get('use_pin'))
- # Sinkronisasi payment_difficulty ke semua anak jika partner ini adalah parent
- if not rec.parent_id and 'payment_difficulty' in vals:
- rec.child_ids.write({'payment_difficulty': vals['payment_difficulty']})
+ # for rec in self:
+ # if use_pin and 'latitude' in vals or 'longtitude' in vals:
+ # # rec._update_address_from_coords()
+ # rec.with_context(overwrite_street_from_pin=False)._update_address_from_coords()
+
+
+ # # Sinkronisasi payment_difficulty ke semua anak jika partner ini adalah parent
+ # if not rec.parent_id and 'payment_difficulty' in vals:
+ # rec.child_ids.write({'payment_difficulty': vals['payment_difficulty']})
#
# # if 'property_payment_term_id' in vals:
# # if not self.env.user.is_accounting and vals['property_payment_term_id'] != 26:
@@ -219,17 +223,47 @@ class ResPartner(models.Model):
# # if self.env.user.id not in users_in_group.mapped('id'):
# # raise UserError('You name it')
#
+ def write(self, vals):
+ res = super(ResPartner, self).write(vals)
+
+ use_pin = bool(self.env.context.get('use_pin'))
+ for rec in self:
+ # Hanya jalan kalau explicit use_pin DAN ada lat/lng di payload
+ if use_pin and (('latitude' in vals) or ('longtitude' in vals)):
+ # optional guard: pastikan bukan kosong/0
+ lat = rec.latitude
+ lng = rec.longtitude
+ if lat and lng and str(lat) not in ('0', '0.0') and str(lng) not in ('0', '0.0'):
+ rec.with_context(overwrite_street_from_pin=False)._update_address_from_coords()
+
+ # Sinkronisasi payment_difficulty ke anak
+ if not rec.parent_id and 'payment_difficulty' in vals:
+ rec.child_ids.write({'payment_difficulty': vals['payment_difficulty']})
return res
+
+ # @api.model
+ # def create(self, vals):
+ # records = super().create(vals)
+ # use_pin = bool(self.env.context.get('use_pin'))
+ # for rec in records:
+ # if use_pin and vals.get('latitude') and vals.get('longtitude'):
+ # rec._update_address_from_coords()
+ # if rec.parent_id and not vals.get('payment_difficulty'):
+ # rec.payment_difficulty = rec.parent_id.payment_difficulty
+ # return records
+
@api.model
def create(self, vals):
records = super().create(vals)
+ use_pin = bool(self.env.context.get('use_pin'))
for rec in records:
- if vals.get('latitude') and vals.get('longtitude'):
- rec._update_address_from_coords()
+ if use_pin and vals.get('latitude') and vals.get('longtitude'):
+ rec.with_context(overwrite_street_from_pin=False)._update_address_from_coords()
if rec.parent_id and not vals.get('payment_difficulty'):
- rec.payment_difficulty = rec.parent_id.payment_difficulty
+ rec.payment_difficulty = rec.parent_id.payment_difficulty
return records
+
@api.constrains('email')
def _check_duplicate_name(self):
@@ -621,6 +655,44 @@ class ResPartner(models.Model):
else:
raise UserError("Permintaan ke Google Maps gagal. Periksa koneksi internet atau API Key.")
+ # def _update_address_from_coords(self):
+ # for rec in self:
+ # if rec.latitude and rec.longtitude:
+ # try:
+ # components, formatted, parsed = rec._reverse_geocode(rec.latitude, rec.longtitude)
+ # if not parsed:
+ # continue
+
+ # updates = {
+ # 'street': parsed.get('road') or '',
+ # 'zip': parsed.get('postcode') or '',
+ # 'address_map': formatted or '',
+ # }
+
+ # if self.env.context.get('overwrite_street_from_pin', False):
+ # updates['street'] = parsed.get('road') or rec.street
+
+ # state = self.env['res.country.state'].search([('name', 'ilike', parsed.get('state'))], limit=1)
+ # if state:
+ # updates['state_id'] = state.id
+
+ # kota = self.env['vit.kota'].search([('name', 'ilike', parsed.get('city'))], limit=1)
+ # if kota:
+ # updates['kota_id'] = kota.id
+
+ # kec = self.env['vit.kecamatan'].search([('name', 'ilike', parsed.get('district'))], limit=1)
+ # if kec:
+ # updates['kecamatan_id'] = kec.id
+
+ # kel = self.env['vit.kelurahan'].search([('name', 'ilike', parsed.get('suburb'))], limit=1)
+ # if kel:
+ # updates['kelurahan_id'] = kel.id
+
+ # rec.update(updates)
+
+ # except Exception as e:
+ # raise UserError(f"Gagal update alamat dari koordinat: {str(e)}")
+
def _update_address_from_coords(self):
for rec in self:
if rec.latitude and rec.longtitude:
@@ -630,28 +702,45 @@ class ResPartner(models.Model):
continue
updates = {
- 'street': parsed.get('road') or '',
- 'zip': parsed.get('postcode') or '',
- 'address_map': formatted or '',
+ 'address_map': formatted or rec.address_map or '',
}
- state = self.env['res.country.state'].search([('name', 'ilike', parsed.get('state'))], limit=1)
- if state:
- updates['state_id'] = state.id
-
- kota = self.env['vit.kota'].search([('name', 'ilike', parsed.get('city'))], limit=1)
- if kota:
- updates['kota_id'] = kota.id
-
- kec = self.env['vit.kecamatan'].search([('name', 'ilike', parsed.get('district'))], limit=1)
- if kec:
- updates['kecamatan_id'] = kec.id
-
- kel = self.env['vit.kelurahan'].search([('name', 'ilike', parsed.get('suburb'))], limit=1)
- if kel:
- updates['kelurahan_id'] = kel.id
-
- rec.update(updates)
+ # ❌ Jangan isi street kecuali diminta eksplisit via context
+ if self.env.context.get('overwrite_street_from_pin', False):
+ road = parsed.get('road')
+ if road:
+ updates['street'] = road
+
+ # (Opsional) admin area & zip hanya jika kosong agar tidak menimpa input user
+ if (not rec.zip) and parsed.get('postcode'):
+ updates['zip'] = parsed.get('postcode')
+
+ state_name = parsed.get('state')
+ if state_name and not rec.state_id:
+ state = self.env['res.country.state'].search([('name', 'ilike', state_name)], limit=1)
+ if state:
+ updates['state_id'] = state.id
+
+ city_name = parsed.get('city')
+ if city_name and not rec.kota_id:
+ kota = self.env['vit.kota'].search([('name', 'ilike', city_name)], limit=1)
+ if kota:
+ updates['kota_id'] = kota.id
+
+ dist_name = parsed.get('district')
+ if dist_name and not rec.kecamatan_id:
+ kec = self.env['vit.kecamatan'].search([('name', 'ilike', dist_name)], limit=1)
+ if kec:
+ updates['kecamatan_id'] = kec.id
+
+ sub_name = parsed.get('suburb')
+ if sub_name and not rec.kelurahan_id:
+ kel = self.env['vit.kelurahan'].search([('name', 'ilike', sub_name)], limit=1)
+ if kel:
+ updates['kelurahan_id'] = kel.id
+
+ if updates:
+ rec.update(updates)
except Exception as e:
raise UserError(f"Gagal update alamat dari koordinat: {str(e)}")
diff --git a/indoteknik_custom/models/user_company_request.py b/indoteknik_custom/models/user_company_request.py
index 9216e8eb..284575aa 100644
--- a/indoteknik_custom/models/user_company_request.py
+++ b/indoteknik_custom/models/user_company_request.py
@@ -1,6 +1,9 @@
from odoo import models, fields, api
from odoo.exceptions import UserError
from odoo.http import request
+import logging
+
+_logger = logging.getLogger(__name__)
class UserCompanyRequest(models.Model):
_name = 'user.company.request'
@@ -65,8 +68,8 @@ class UserCompanyRequest(models.Model):
is_approve = vals.get('is_approve')
is_internal_input = vals.get('internal_input')
is_company_id = vals.get('user_company_id')
- if self.is_approve and is_approve:
- raise UserError('Tidak dapat mengubah approval yang sudah diisi')
+ # if self.is_approve and is_approve:
+ # raise UserError('Tidak dapat mengubah approval yang sudah diisi')
if is_internal_input:
if self.user_company_id.nama_wajib_pajak == self.user_company_id.name:
@@ -75,6 +78,7 @@ class UserCompanyRequest(models.Model):
user_company_id = []
if is_company_id:
user_company_id = request.env['res.partner'].search([('id', '=', is_company_id)], limit=1)
+ _logger.info('User Company ID: %s', user_company_id)
# self.user_company_id.customer_type = self.similar_company_ids.customer_type
# self.user_company_id.npwp = self.similar_company_ids.npwp
# self.user_company_id.sppkp = self.similar_company_ids.sppkp
@@ -101,6 +105,8 @@ class UserCompanyRequest(models.Model):
self.user_id.property_account_payable_id = user_company_id.property_account_payable_id if user_company_id else self.user_company_id.property_account_payable_id
self.user_id.property_payment_term_id = user_company_id.property_payment_term_id if user_company_id else self.user_company_id.property_payment_term_id
self.user_id.property_supplier_payment_term_id = user_company_id.property_supplier_payment_term_id if user_company_id else self.user_company_id.property_supplier_payment_term_id
+ # self.user_id.is_company = True
+ # self.user_id.active = True
self.user_company_id.active = True
user.send_company_switch_approve_mail() if vals.get('is_switch_account') == True else user.send_company_request_approve_mail()
else: