summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFIN-IT_AndriFP <andrifebriyadiputra@gmail.com>2025-12-03 09:35:16 +0700
committerFIN-IT_AndriFP <andrifebriyadiputra@gmail.com>2025-12-03 09:35:16 +0700
commita6ce141542392888f8191e0e0dd4ccd6abf1b334 (patch)
tree342e368823dcce3f83297c9cd359244ede337709
parent0a5376fe987ca2a6656d9b63c52b939c33150a21 (diff)
parent015269c0268f2cd9a38ad708c8e26bf85a79fcf3 (diff)
Merge branch 'odoo-backup' of https://bitbucket.org/altafixco/indoteknik-addons into odoo-backup
-rw-r--r--indoteknik_custom/models/coretax_fatur.py6
-rw-r--r--indoteknik_custom/models/refund_sale_order.py4
-rw-r--r--indoteknik_custom/models/requisition.py40
-rw-r--r--indoteknik_custom/models/stock_inventory.py5
-rw-r--r--indoteknik_custom/models/stock_picking.py48
-rw-r--r--indoteknik_custom/views/dunning_run.xml6
6 files changed, 86 insertions, 23 deletions
diff --git a/indoteknik_custom/models/coretax_fatur.py b/indoteknik_custom/models/coretax_fatur.py
index 755c5cc3..c098fd01 100644
--- a/indoteknik_custom/models/coretax_fatur.py
+++ b/indoteknik_custom/models/coretax_fatur.py
@@ -117,7 +117,7 @@ class CoretaxFaktur(models.Model):
)
# Calculate totals
- total_product_amount = sum(line.get('price_subtotal', 0) if isinstance(line, dict)
+ total_product_amount = sum(line.get('price_subtotal', 0) if isinstance(line, dict)
else line.price_subtotal for line in product_lines)
if total_product_amount == 0:
total_product_amount = 1 # Avoid division by zero
@@ -153,7 +153,7 @@ class CoretaxFaktur(models.Model):
else:
uom = line.product_uom_id
- coretax_id = uom.coretax_id if uom else ''
+ coretax_id = uom.coretax_id if uom else 'UM.0018'
# coretax_id = line.product_uom_id.coretax_id
# Calculate other tax values
@@ -167,7 +167,7 @@ class CoretaxFaktur(models.Model):
ET.SubElement(good_service, 'Opt').text = 'A'
ET.SubElement(good_service, 'Code').text = '000000'
ET.SubElement(good_service, 'Name').text = line_name
- ET.SubElement(good_service, 'Unit').text = coretax_id
+ ET.SubElement(good_service, 'Unit').text = coretax_id if invoice.partner_id.id != 80007 else 'UM.0018'
# ET.SubElement(good_service, 'Price').text = str(round(line_price_unit, 2)) if line_price_unit else '0'
ET.SubElement(good_service, 'Price').text = str(price_per_unit)
ET.SubElement(good_service, 'Qty').text = str(quantity)
diff --git a/indoteknik_custom/models/refund_sale_order.py b/indoteknik_custom/models/refund_sale_order.py
index 38ab69fa..fe0002bd 100644
--- a/indoteknik_custom/models/refund_sale_order.py
+++ b/indoteknik_custom/models/refund_sale_order.py
@@ -292,6 +292,7 @@ class RefundSaleOrder(models.Model):
('sale_id', 'in', so_ids),
('journal_id', '=', 11),
('state', '=', 'posted'),
+ ('ref', 'not ilike', 'dp'),
])
piutangbca = self.env['account.move'].search([
('ref', 'in', invoices.mapped('name')),
@@ -335,6 +336,7 @@ class RefundSaleOrder(models.Model):
('state', '=', 'posted'),
('ref', 'ilike', 'uang muka penjualan'),
('ref', 'not ilike', 'reklas'),
+ ('ref', 'not ilike', 'dp'),
]
if so_names:
domain += ['|'] * (len(so_names) - 1)
@@ -647,6 +649,7 @@ class RefundSaleOrder(models.Model):
('sale_id', 'in', so_ids),
('journal_id', '=', 11),
('state', '=', 'posted'),
+ ('ref', 'not ilike', 'dp'),
])
piutangbca = self.env['account.move'].search([
('ref', 'in', all_invoices.mapped('name')),
@@ -694,6 +697,7 @@ class RefundSaleOrder(models.Model):
('state', '=', 'posted'),
('ref', 'ilike', 'uang muka penjualan'),
('ref', 'not ilike', 'reklas'),
+ ('ref', 'not ilike', 'dp'),
]
domain += ['|'] * (len(so_names) - 1)
for n in so_names:
diff --git a/indoteknik_custom/models/requisition.py b/indoteknik_custom/models/requisition.py
index bcdafb12..64ef4fc8 100644
--- a/indoteknik_custom/models/requisition.py
+++ b/indoteknik_custom/models/requisition.py
@@ -77,9 +77,20 @@ class Requisition(models.Model):
vals['number'] = self.env['ir.sequence'].next_by_code('requisition') or '0'
result = super(Requisition, self).create(vals)
return result
-
+
+ def check_product_line_to_so(self):
+ for req in self:
+ for prod_line in req.requisition_lines:
+ match = self.env['sale.order.line'].search([
+ ('product_id', '=', prod_line.product_id.id), ('order_id', '=', req.sale_order_id.id)
+ ])
+ if match:
+ raise UserError ('Product sudah di SO tidak approve/create PO')
+
+
def button_approve(self):
state = ['done', 'sale']
+ self.check_product_line_to_so()
if self.sale_order_id.state in state:
raise UserError('SO sudah Confirm, akan berakibat double Purchase melalui PJ')
if self.env.user.id not in [21, 19, 28]:
@@ -90,6 +101,7 @@ class Requisition(models.Model):
self.merchandise_approve = True
def create_po_from_requisition(self):
+ self.check_product_line_to_so()
if not self.sales_approve and not self.merchandise_approve:
raise UserError('Harus Di Approve oleh Darren atau Rafly')
if not self.requisition_lines:
@@ -98,9 +110,9 @@ class Requisition(models.Model):
raise UserError('Sudah pernah di create PO')
if not self.sale_order_id:
raise UserError('Tidak ada link dengan Sales Order, tidak bisa dihitung sebagai Plafon Qty di PO')
-
+
vendor_ids = self.env['requisition.line'].read_group([
- ('requisition_id', '=', self.id),
+ ('requisition_id', '=', self.id),
('partner_id', '!=', False)
], fields=['partner_id'], groupby=['partner_id'])
@@ -116,7 +128,7 @@ class Requisition(models.Model):
'type': 'ir.actions.act_window',
'domain': [('id', 'in', po_ids)],
}
-
+
def create_po_by_vendor(self, vendor_id):
current_time = datetime.now()
@@ -137,7 +149,7 @@ class Requisition(models.Model):
}
domain = [
- ('requisition_id', '=', self.id),
+ ('requisition_id', '=', self.id),
('partner_id', '=', vendor_id),
('qty_purchase', '>', 0)
]
@@ -151,8 +163,8 @@ class Requisition(models.Model):
new_po.name = new_po.name + "/R/" + str(i + 1)
po_ids.append(new_po.id)
lines = requisition_line.search(
- domain,
- offset=i * PRODUCT_PER_PO,
+ domain,
+ offset=i * PRODUCT_PER_PO,
limit=PRODUCT_PER_PO
)
tax = [22]
@@ -179,7 +191,7 @@ class Requisition(models.Model):
self.is_po = True
return po_ids
-
+
# def create_po_from_requisition(self):
# if not self.requisition_lines:
# raise UserError('Tidak ada Lines, belum bisa create PO')
@@ -187,7 +199,7 @@ class Requisition(models.Model):
# raise UserError('Sudah pernah di create PO')
# current_time = datetime.now()
# vendor_ids = self.env['requisition.line'].read_group([('requisition_id', '=', self.id), ('partner_id', '!=', False)], fields=['partner_id'], groupby=['partner_id'])
-
+
# counter_po_number = 0
# po_ids = []
# for vendor in vendor_ids:
@@ -203,7 +215,7 @@ class Requisition(models.Model):
# 'note_description': 'from Purchase Requisition'
# }
# param_requisition_line = [
- # ('requisition_id', '=', self.id),
+ # ('requisition_id', '=', self.id),
# ('partner_id', '=', vendor['partner_id'][0]),
# ('qty_purchase', '>', 0)
# ]
@@ -238,7 +250,7 @@ class Requisition(models.Model):
# tax = [22]
# param_line = {
-
+
# 'sequence': count,
# 'product_id': product.product_id.id,
# 'product_qty': product.qty_purchase,
@@ -251,7 +263,7 @@ class Requisition(models.Model):
# new_line = self.env['purchase.order.line'].create([param_line])
# if new_po:
# new_line.write({
- # 'order_id': new_po.id,
+ # 'order_id': new_po.id,
# })
# product.current_po_id = new_po.id
# product.current_po_line_id = new_line.id
@@ -298,7 +310,7 @@ class RequisitionLine(models.Model):
taxes = 24
human_last_update = purchase_price.human_last_update or datetime.min
system_last_update = purchase_price.system_last_update or datetime.min
-
+
#if purchase_price.taxes_product_id.type_tax_use == 'purchase':
price = purchase_price.product_price
taxes = purchase_price.taxes_product_id.id or 24
@@ -307,7 +319,7 @@ class RequisitionLine(models.Model):
#if purchase_price.taxes_system_id.type_tax_use == 'purchase':
price = purchase_price.system_price
taxes = purchase_price.taxes_system_id.id or 24
-
+
return price, taxes
@api.onchange('price_unit')
diff --git a/indoteknik_custom/models/stock_inventory.py b/indoteknik_custom/models/stock_inventory.py
index 69cca5bc..432d9225 100644
--- a/indoteknik_custom/models/stock_inventory.py
+++ b/indoteknik_custom/models/stock_inventory.py
@@ -52,6 +52,11 @@ class StockInventory(models.Model):
return "00001" # Jika format tidak valid, mulai dari 00001
return "00001" # Jika belum ada data, mulai dari 00001
+ def action_start(self):
+ if self.env.user.id not in [21, 17, 6277]:
+ raise UserError("Hanya Rafly, denise, dan faisal yang bisa start inventory")
+ return super(StockInventory, self).action_start()
+
@api.model
def create(self, vals):
"""Pastikan nomor hanya dibuat saat penyimpanan."""
diff --git a/indoteknik_custom/models/stock_picking.py b/indoteknik_custom/models/stock_picking.py
index e7686b75..900529b9 100644
--- a/indoteknik_custom/models/stock_picking.py
+++ b/indoteknik_custom/models/stock_picking.py
@@ -1406,6 +1406,47 @@ class StockPicking(models.Model):
else:
raise UserError('Hanya MD yang bisa Approve')
+ def validate_seq_vcm(self):
+ for picking in self:
+ tg_po = picking.tukar_guling_po_id
+ if not tg_po:
+ continue
+
+ return_type = tg_po.return_type
+ if return_type not in ['retur_po', 'tukar_guling']:
+ continue
+
+ picking_order = []
+ if return_type == 'retur_po':
+ picking_order = ['BU/INPUT', 'BU/PUT']
+ elif return_type == 'tukar_guling':
+ picking_order = ['BU/VRT', 'BU/PRT', 'BU/INPUT', 'BU/PUT']
+
+ related_pickings = self.env['stock.picking'].search([
+ ('tukar_guling_po_id', '=', tg_po.id)
+ ])
+
+ ordered_pickings = []
+ for prefix in picking_order:
+ match = next((p for p in related_pickings if p.name.startswith(prefix)), None)
+ if not match:
+ raise UserError(f"Picking dengan prefix {prefix} belum ada.")
+ ordered_pickings.append(match)
+
+ current_index = -1
+ for idx, p in enumerate(ordered_pickings):
+ if p.id == picking.id:
+ current_index = idx
+ break
+
+ if current_index == -1:
+ raise UserError("Picking ini tidak ditemukan dalam urutan picking yang sesuai.")
+
+ for prev_picking in ordered_pickings[:current_index]:
+ if prev_picking.state != 'done':
+ raise UserError(
+ f"Tidak bisa validasi {picking.name} sebelum {prev_picking.name} divalidasi."
+ )
def button_validate(self):
self.check_invoice_date()
_logger.info("Kode Picking: %s", self.picking_type_id.code)
@@ -1416,6 +1457,7 @@ class StockPicking(models.Model):
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')
+ self.validate_seq_vcm()
if self.is_so_fiktif == True:
raise UserError("SO Fiktif tidak bisa di validate")
if self.location_id.id == 47 and self.env.user.id not in users_in_group.mapped(
@@ -1453,10 +1495,10 @@ class StockPicking(models.Model):
if not self.linked_manual_bu_out and 'BU/PICK/' in self.name:
raise UserError(_("Isi BU Out terlebih dahulu!"))
- if len(self.check_product_lines) == 0 and 'BU/PICK/' in self.name:
+ if len(self.check_product_lines) == 0 and 'BU/PICK/' in self.name and not self.env.user.has_group('indoteknik_custom.group_role_it'):
raise UserError(_("Tidak ada Check Product! Harap periksa kembali."))
- if len(self.check_product_lines) == 0 and 'BU/INPUT/' in self.name:
+ if len(self.check_product_lines) == 0 and 'BU/INPUT/' in self.name and not self.env.user.has_group('indoteknik_custom.group_role_it'):
raise UserError(_("Tidak ada Check Product! Harap periksa kembali."))
if self.total_koli > self.total_so_koli:
@@ -2821,4 +2863,4 @@ class StockPickingSjDocument(models.Model):
picking_id = fields.Many2one('stock.picking', required=True, ondelete='cascade')
image = fields.Binary('Gambar', required=True, attachment=True)
- sequence = fields.Integer('Urutan', default=10) \ No newline at end of file
+ sequence = fields.Integer('Urutan', default=10)
diff --git a/indoteknik_custom/views/dunning_run.xml b/indoteknik_custom/views/dunning_run.xml
index 911a372d..52a0c6ae 100644
--- a/indoteknik_custom/views/dunning_run.xml
+++ b/indoteknik_custom/views/dunning_run.xml
@@ -25,8 +25,8 @@
<field name="arch" type="xml">
<tree>
<field name="partner_id"/>
- <field name="information_line"/>
- <field name="reference"/>
+ <field name="information_line" optional="hide"/>
+ <field name="reference" optional="hide"/>
<field name="invoice_id"/>
<field name="date_invoice"/>
<field name="efaktur_id" optional="hide"/>
@@ -125,4 +125,4 @@
action="dunning_run_action"
parent="account.menu_finance_reports"
sequence="200"/>
-</odoo> \ No newline at end of file
+</odoo>