summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIT Fixcomart <it@fixcomart.co.id>2025-07-03 02:52:00 +0000
committerIT Fixcomart <it@fixcomart.co.id>2025-07-03 02:52:00 +0000
commitb34bace56a95da3c71c96fe189ebc2a6bb46522a (patch)
tree33169d81b02b05d79ec79103fb4c2f54787587b9
parent5a3c3d327dd04b3ec4f3c272e4bc50ab9c594058 (diff)
parenteac293a01a1cdf5e7d2be15575f96e17ebe33a4d (diff)
Merged in bu-button-po (pull request #347)
(Andri) fix related BU pada PO
-rwxr-xr-xindoteknik_custom/models/purchase_order.py60
1 files changed, 41 insertions, 19 deletions
diff --git a/indoteknik_custom/models/purchase_order.py b/indoteknik_custom/models/purchase_order.py
index a3941b3b..4dc26d74 100755
--- a/indoteknik_custom/models/purchase_order.py
+++ b/indoteknik_custom/models/purchase_order.py
@@ -101,43 +101,65 @@ class PurchaseOrder(models.Model):
@api.depends('name')
def _compute_bu_related_count(self):
+ StockPicking = self.env['stock.picking']
for order in self:
if not order.name:
order.bu_related_count = 0
continue
- # BU langsung dari PO
- base_bu = self.env['stock.picking'].search([
+ # Ambil semua BU awal dari PO
+ base_bu = StockPicking.search([
('name', 'ilike', 'BU/'),
('origin', 'ilike', order.name)
])
- base_names = base_bu.mapped('name')
- # Return dari BU di atas
- return_bu = self.env['stock.picking'].search([
- ('origin', 'in', [f"Return of {name}" for name in base_names])
- ])
+ all_bu = base_bu
+ seen_names = set(base_bu.mapped('name'))
+
+ # Loop rekursif untuk mencari seluruh return BU
+ while True:
+ next_bu = StockPicking.search([
+ ('name', 'ilike', 'BU/'),
+ ('origin', 'in', ['Return of %s' % name for name in seen_names])
+ ])
+ next_names = set(next_bu.mapped('name'))
+
+ if not next_names - seen_names:
+ break
+
+ all_bu |= next_bu
+ seen_names |= next_names
+
+ order.bu_related_count = len(all_bu)
- order.bu_related_count = len(base_bu) + len(return_bu)
def action_view_related_bu(self):
self.ensure_one()
+ StockPicking = self.env['stock.picking']
+
# Step 1: cari semua BU pertama (PUT, INT) yang berasal dari PO ini
- base_bu = self.env['stock.picking'].search([
+ base_bu = StockPicking.search([
('name', 'ilike', 'BU/'),
('origin', 'ilike', self.name)
])
- base_bu_names = base_bu.mapped('name')
- # Step 2: cari BU turunan (seperti BU/VRT) yang origin-nya mengandung nama BU tersebut
- domain = [
- '|',
- '&',
- ('name', 'ilike', 'BU/'),
- ('origin', 'ilike', self.name),
- ('origin', 'in', [f"Return of {name}" for name in base_bu_names])
- ]
+ all_bu = base_bu
+ seen_names = set(base_bu.mapped('name'))
+
+ # Step 2: Loop rekursif cari BU dengan origin 'Return of {name}'
+ while True:
+ next_bu = StockPicking.search([
+ ('name', 'ilike', 'BU/'),
+ ('origin', 'in', ['Return of %s' % name for name in seen_names])
+ ])
+ next_names = set(next_bu.mapped('name'))
+
+ if not next_names - seen_names:
+ break
+
+ all_bu |= next_bu
+ seen_names |= next_names
return {
'name': 'Related BU (INT/PRT/PUT/VRT)',
@@ -145,7 +167,7 @@ class PurchaseOrder(models.Model):
'res_model': 'stock.picking',
'view_mode': 'tree,form',
'target': 'current',
- 'domain': domain,
+ 'domain': [('id', 'in', list(all_bu.ids))],
}