summaryrefslogtreecommitdiff
path: root/indoteknik_custom/models/tukar_guling_po.py
diff options
context:
space:
mode:
authorAzka Nathan <darizkyfaz@gmail.com>2025-08-14 16:28:15 +0700
committerAzka Nathan <darizkyfaz@gmail.com>2025-08-14 16:28:15 +0700
commitbfdaf12dc3e7abace11502fcf1cb6c87522f1a51 (patch)
tree1b7d44f2b6a5ad2539f181effb66e9e3a59c9e9a /indoteknik_custom/models/tukar_guling_po.py
parentad6ccce331dc8c83f2cacb82b0e3c94467ff9d85 (diff)
parentdb75081a2afcd369e8a0169f3fe2f080dbad0c4a (diff)
Merge branch 'odoo-backup' of bitbucket.org:altafixco/indoteknik-addons into odoo-backup
Diffstat (limited to 'indoteknik_custom/models/tukar_guling_po.py')
-rw-r--r--indoteknik_custom/models/tukar_guling_po.py60
1 files changed, 49 insertions, 11 deletions
diff --git a/indoteknik_custom/models/tukar_guling_po.py b/indoteknik_custom/models/tukar_guling_po.py
index 0badc117..cc1c79c0 100644
--- a/indoteknik_custom/models/tukar_guling_po.py
+++ b/indoteknik_custom/models/tukar_guling_po.py
@@ -62,20 +62,57 @@ class TukarGulingPO(models.Model):
is_has_bill = fields.Boolean('Has Bill?', compute='_compute_is_has_bill', readonly=True, default=False)
bill_id = fields.Many2many('account.move', string='Bill Ref', readonly=True)
+ origin_po = fields.Many2one('purchase.order', string='Origin PO', compute='_compute_origin_po')
- @api.depends('origin')
+ @api.depends('origin', 'operations')
+ def _compute_origin_po(self):
+ for rec in self:
+ rec.origin_po = False
+ origin_str = rec.origin or rec.operations.origin
+ if origin_str:
+ so = self.env['purchase.order'].search([('name', '=', origin_str)], limit=1)
+ rec.origin_po = so.id if so else False
+
+ @api.depends('origin', 'origin_po', 'vendor_id', 'line_ids.product_id')
def _compute_is_has_bill(self):
+ Move = self.env['account.move']
for rec in self:
- bills = self.env['account.move'].search([
- ('invoice_origin', 'ilike', rec.origin),
- ('move_type', '=', 'in_invoice'), # hanya vendor bill
- ('state', 'not in', ['draft', 'cancel'])
- ])
- if bills:
- rec.is_has_bill = True
- rec.bill_id = bills
- else:
- rec.is_has_bill = False
+ # reset
+ rec.is_has_bill = False
+ rec.bill_id = [(5, 0, 0)]
+
+ product_ids = rec.line_ids.mapped('product_id').ids
+ if not product_ids:
+ continue
+
+ # dasar: bill atau vendor credit note yang linennya mengandung produk TG
+ domain = [
+ ('move_type', 'in', ['in_invoice', 'in_refund']),
+ ('state', 'not in', ['draft', 'cancel']),
+ ('invoice_line_ids.product_id', 'in', product_ids),
+ ]
+
+ # batasi ke vendor sama (kalau ada)
+ if rec.vendor_id:
+ domain.append(('partner_id', '=', rec.vendor_id.id))
+
+ # bantu pembatasan ke asal dokumen
+ extra = []
+ if rec.origin:
+ extra.append(('invoice_origin', 'ilike', rec.origin))
+ if rec.origin_po:
+ # di Odoo 14, invoice line biasanya link ke purchase.line lewat purchase_line_id
+ extra.append(('invoice_line_ids.purchase_line_id.order_id', '=', rec.origin_po.id))
+
+ # OR-kan semua extra filter jika ada
+ if extra:
+ domain = domain + ['|'] * (len(extra) - 1) + extra
+
+ bills = Move.search(domain).with_context(active_test=False)
+
+ # --- Opsi 1: minimal salah satu produk TG muncul di bill (default) ---
+ rec.bill_id = [(6, 0, bills.ids)]
+ rec.is_has_bill = bool(bills)
def set_opt(self):
if not self.val_bil_opt and self.is_has_bill == True:
@@ -133,6 +170,7 @@ class TukarGulingPO(models.Model):
# Hanya update origin, jangan ubah lines
if self.operations.origin:
self.origin = self.operations.origin
+ self.origin_po = self.operations.group_id.id
return
if from_return_picking: