summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorit-fixcomart <it@fixcomart.co.id>2025-03-19 10:06:52 +0700
committerit-fixcomart <it@fixcomart.co.id>2025-03-19 10:06:52 +0700
commit34d02a015c9789b91838d39c08e9b380e3b1470a (patch)
treec407ef40e7f8362aaf2ba1b86c2b71c36e79a052
parentc351c87e00120508b49a47178f7c27cdad187eaa (diff)
parent9e293f201e3c43662c3866fa06eaa36805d69cc5 (diff)
Merge branch 'odoo-backup' into CR/renca-banner
-rw-r--r--indoteknik_api/controllers/api_v1/user.py20
-rw-r--r--indoteknik_custom/models/invoice_reklas.py6
-rwxr-xr-xindoteknik_custom/models/sale_order.py25
-rw-r--r--indoteknik_custom/models/stock_picking.py45
-rw-r--r--indoteknik_custom/views/stock_picking.xml16
5 files changed, 99 insertions, 13 deletions
diff --git a/indoteknik_api/controllers/api_v1/user.py b/indoteknik_api/controllers/api_v1/user.py
index c0974367..b5b7e055 100644
--- a/indoteknik_api/controllers/api_v1/user.py
+++ b/indoteknik_api/controllers/api_v1/user.py
@@ -131,6 +131,7 @@ class User(controller.Controller):
nama_wajib_pajak = kw.get('nama_wajib_pajak', False)
is_pkp = kw.get('is_pkp')
is_terdaftar = kw.get('is_terdaftar', False)
+ is_terdaftar = False if is_terdaftar == 'false' else is_terdaftar
type_acc = kw.get('type_acc', 'individu') or 'individu'
if not name or not email or not password:
@@ -162,9 +163,7 @@ class User(controller.Controller):
'sel_groups_1_9_10': 9
}
- user = request.env['res.users'].create(user_data)
- user.partner_id.email = email
- user.partner_id.mobile = phone
+
if type_acc == 'business' and business_name:
# Eksekusi query SQL menggunakan Levenshtein distance
@@ -182,7 +181,9 @@ class User(controller.Controller):
if result and is_terdaftar:
match_company_name = result[2]
match_company_id = result[0]
-
+ user = request.env['res.users'].create(user_data)
+ user.partner_id.email = email
+ user.partner_id.mobile = phone
# Create a user company request
request.env['user.company.request'].create({
'user_id': user.partner_id.id,
@@ -190,6 +191,9 @@ class User(controller.Controller):
'user_input': business_name
})
else:
+ if not result and is_terdaftar:
+ response['reason'] = 'BISNIS_NOT_FOUND'
+ return self.response(response)
if not nama_wajib_pajak and is_pkp == 'false':
nama_wajib_pajak = business_name
@@ -213,6 +217,10 @@ class User(controller.Controller):
'property_account_payable_id': 438,
'active': False,
}
+
+ user = request.env['res.users'].create(user_data)
+ user.partner_id.email = email
+ user.partner_id.mobile = phone
new_company = request.env['res.partner'].create(new_company_data)
request.env['user.company.request'].create({
'user_id': user.partner_id.id,
@@ -247,8 +255,10 @@ class User(controller.Controller):
'mimetype': sppkp_mimetype
})
new_company.message_post(body="SPPKP Uploaded", attachment_ids=[sppkp_attachment.id])
-
if type_acc == 'individu':
+ user = request.env['res.users'].create(user_data)
+ user.partner_id.email = email
+ user.partner_id.mobile = phone
user.partner_id.customer_type = 'nonpkp'
user.partner_id.npwp = '00.000.000.0-000.000'
user.partner_id.sppkp = '-'
diff --git a/indoteknik_custom/models/invoice_reklas.py b/indoteknik_custom/models/invoice_reklas.py
index f5bb5a25..d10d4c31 100644
--- a/indoteknik_custom/models/invoice_reklas.py
+++ b/indoteknik_custom/models/invoice_reklas.py
@@ -18,6 +18,12 @@ class InvoiceReklas(models.TransientModel):
('pembelian', 'Pembelian'),
], string='Reklas Tipe')
+ @api.onchange('reklas_type')
+ def _onchange_reklas_type(self):
+ if self.reklas_type == 'penjualan':
+ invoices = self.env['account.move'].browse(self._context.get('active_ids', []))
+ self.pay_amt = invoices.amount_total
+
def create_reklas(self):
if not self.reklas_type:
raise UserError('Reklas Tipe harus diisi')
diff --git a/indoteknik_custom/models/sale_order.py b/indoteknik_custom/models/sale_order.py
index 14a8e688..67434105 100755
--- a/indoteknik_custom/models/sale_order.py
+++ b/indoteknik_custom/models/sale_order.py
@@ -1,3 +1,5 @@
+from re import search
+
from odoo import fields, models, api, _
from odoo.exceptions import UserError, ValidationError
from datetime import datetime, timedelta
@@ -206,8 +208,7 @@ class SaleOrder(models.Model):
)
expected_ready_to_ship = fields.Datetime(
string='ET Ready to Ship',
- copy=False,
- store=True
+ copy=False
)
shipping_method_picking = fields.Char(string='Shipping Method Picking', compute='_compute_shipping_method_picking')
@@ -555,7 +556,7 @@ class SaleOrder(models.Model):
return {'slatime': max_slatime, 'include_instant': include_instant}
- @api.depends("order_line.product_id")
+ # @api.depends("order_line.product_id")
def _compute_etrts_date(self): #Function to calculate Estimated Ready To Ship Date
for rec in self:
max_slatime = 1 # Default SLA jika tidak ada
@@ -978,8 +979,20 @@ class SaleOrder(models.Model):
raise UserError("Customer Reference kosong, di isi dengan NO PO jika PO tidak ada mohon ditulis Tanpa PO")
if not order.user_id.active:
raise UserError("Salesperson sudah tidak aktif, mohon diisi yang benar pada data SO dan Contact")
-
+
+ def check_product_bom(self):
+ for order in self:
+ for line in order.order_line:
+ if 'bom-it' in line.name.lower() or 'bom' in line.product_id.default_code.lower() if line.product_id.default_code else False:
+ search_bom = self.env['mrp.production'].search([('product_id', '=', line.product_id.id)],order='name desc')
+ if search_bom:
+ confirmed_bom = search_bom.filtered(lambda x: x.state == 'confirmed')
+ if not confirmed_bom:
+ raise UserError("Product BOM belum dikonfirmasi di Manufacturing Orders. Silakan hubungi MD.")
+ else:
+ raise UserError("Product BOM tidak di temukan di manufacturing orders, silahkan hubungi MD")
def sale_order_approve(self):
+ self.check_product_bom()
self.check_credit_limit()
self.check_limit_so_to_invoice()
if self.validate_different_vendor() and not self.vendor_approval:
@@ -1039,6 +1052,7 @@ class SaleOrder(models.Model):
order.approval_status = 'pengajuan2'
return self._create_approval_notification('Pimpinan')
elif order._requires_approval_margin_manager():
+ self.check_product_bom()
self.check_credit_limit()
self.check_limit_so_to_invoice()
order.approval_status = 'pengajuan1'
@@ -1218,6 +1232,7 @@ class SaleOrder(models.Model):
def action_confirm(self):
for order in self:
+ order.check_product_bom()
order.check_credit_limit()
order.check_limit_so_to_invoice()
if self.validate_different_vendor() and not self.vendor_approval:
@@ -1258,7 +1273,7 @@ class SaleOrder(models.Model):
order._set_sppkp_npwp_contact()
order.calculate_line_no()
order.send_notif_to_salesperson()
- order._compute_etrts_date()
+ # order._compute_etrts_date()
# order.order_line.get_reserved_from()
res = super(SaleOrder, self).action_confirm()
diff --git a/indoteknik_custom/models/stock_picking.py b/indoteknik_custom/models/stock_picking.py
index ab8109c7..41f2e138 100644
--- a/indoteknik_custom/models/stock_picking.py
+++ b/indoteknik_custom/models/stock_picking.py
@@ -131,6 +131,16 @@ class StockPicking(models.Model):
('cancel', 'Cancelled'),
], string='Status Reserve', tracking=True, copy=False, help="The current state of the stock picking.")
notee = fields.Text(string="Note")
+ state_approve_md = fields.Selection([
+ ('waiting', 'Waiting For Approve by MD'),
+ ('pending', 'Pending (perlu koordinasi dengan MD)'),
+ ('done', 'Approve by MD'),
+ ], string='Approval MD Gudang Selisih', tracking=True, copy=False, help="The current state of the MD Approval transfer barang from gudang selisih.")
+ show_state_approve_md = fields.Boolean(compute="_compute_show_state_approve_md")
+
+ def _compute_show_state_approve_md(self):
+ for record in self:
+ record.show_state_approve_md = record.location_id.id == 47 or record.location_id.complete_name == "Virtual Locations/Gudang Selisih"
@api.model
def _compute_dokumen_tanda_terima(self):
@@ -881,8 +891,36 @@ class StockPicking(models.Model):
qty_onhand = check_qty_per_inventory(self, line.product_id, line.location_id)
if line.qty_done > qty_onhand:
raise UserError('Quantity Done melebihi Quantity Onhand')
+ def button_state_approve_md(self):
+ group_id = self.env.ref('indoteknik_custom.group_role_merchandiser').id
+ users_in_group = self.env['res.users'].search([('groups_id', 'in', [group_id])])
+ active_model = self.env.context.get('active_model')
+ if self.env.user.id in users_in_group.mapped('id'):
+ self.state_approve_md = 'done'
+ else:
+ raise UserError('Hanya MD yang bisa Approve')
+
+ def button_state_pending_md(self):
+ group_id = self.env.ref('indoteknik_custom.group_role_merchandiser').id
+ users_in_group = self.env['res.users'].search([('groups_id', 'in', [group_id])])
+ active_model = self.env.context.get('active_model')
+ if self.env.user.id in users_in_group.mapped('id'):
+ self.state_approve_md = 'pending'
+ else:
+ raise UserError('Hanya MD yang bisa Approve')
def button_validate(self):
+ group_id = self.env.ref('indoteknik_custom.group_role_merchandiser').id
+ users_in_group = self.env['res.users'].search([('groups_id', 'in', [group_id])])
+ active_model = self.env.context.get('active_model')
+ if self.location_id.id == 47 and self.env.user.id not in users_in_group.mapped('id') and self.state_approve_md != 'done':
+ self.state_approve_md = 'waiting' if self.state_approve_md != 'pending' else 'pending'
+ self.env.cr.commit()
+ raise UserError("Transfer dari gudang selisih harus di approve MD, Hubungi MD agar bisa di Validate")
+ else:
+ if self.location_id.id == 47 and self.env.user.id in users_in_group.mapped('id'):
+ self.state_approve_md = 'done'
+
if not self.env.user.is_logistic_approver and self.env.context.get('active_model') == 'stock.picking':
if self.origin and 'Return of' in self.origin:
raise UserError("Button ini hanya untuk Logistik")
@@ -907,7 +945,7 @@ class StockPicking(models.Model):
if self.picking_type_id.id == 28 and not self.env.user.is_logistic_approver:
raise UserError("Harus di Approve oleh Logistik")
-
+
if self.location_dest_id.id == 47 and not self.env.user.is_purchasing_manager:
raise UserError("Transfer ke gudang selisih harus di approve Rafly Hanggara")
@@ -1008,9 +1046,12 @@ class StockPicking(models.Model):
return True
def action_cancel(self):
- if not self.env.user.is_logistic_approver and self.env.context.get('active_model') == 'stock.picking':
+ if not self.env.user.is_logistic_approver:
if self.origin and 'Return of' in self.origin:
raise UserError("Button ini hanya untuk Logistik")
+
+ if not self.env.user.has_group('indoteknik_custom.group_role_it') and not self.env.user.has_group('indoteknik_custom.group_role_logistic'):
+ raise UserError("Button ini hanya untuk Logistik")
res = super(StockPicking, self).action_cancel()
return res
diff --git a/indoteknik_custom/views/stock_picking.xml b/indoteknik_custom/views/stock_picking.xml
index dadd5021..ce07888a 100644
--- a/indoteknik_custom/views/stock_picking.xml
+++ b/indoteknik_custom/views/stock_picking.xml
@@ -19,7 +19,8 @@
<field name="note" optional="hide"/>
<field name="date_reserved" optional="hide"/>
<field name="state_reserve" optional="hide"/>
- <field name="final_seq"/>
+ <field name="final_seq"/>
+<!-- <field name="state_approve_md" widget="badge" decoration-success="state_approve_md == 'done'" decoration-warning="state_approve_md == 'pending'" />-->
<!-- <field name="countdown_hours" optional="hide"/>
<field name="countdown_ready_to_ship" /> -->
</field>
@@ -70,6 +71,17 @@
type="object"
attrs="{'invisible': [('carrier_id', '!=', 9)]}"
/>
+<!-- <button name="button_state_approve_md"-->
+<!-- string="Approve MD Gudang Selisih"-->
+<!-- type="object"-->
+<!-- attrs="{'invisible': [('state_approve_md', 'not in', ['waiting', 'pending'])]}"-->
+<!-- />-->
+
+<!-- <button name="button_state_pending_md"-->
+<!-- string="Pending MD Gudang Selisih"-->
+<!-- type="object"-->
+<!-- attrs="{'invisible': [('state_approve_md', 'not in', ['waiting'])]}"-->
+<!-- />-->
</button>
<field name="backorder_id" position="after">
<field name="summary_qty_detail"/>
@@ -97,6 +109,8 @@
<field name="arrival_time"/>
</field>
<field name="origin" position="after">
+<!-- <field name="show_state_approve_md" invisible="1" optional="hide"/>-->
+<!-- <field name="state_approve_md" widget="badge" attrs="{'invisible': [('show_state_approve_md', '=', False)]}"/>-->
<field name="purchase_id"/>
<field name="sale_order"/>
<field name="invoice_status"/>