From 101a83cd9e02f617feaf7287d8e4d618a1d80cf1 Mon Sep 17 00:00:00 2001 From: Adnan Zahir Date: Fri, 24 Apr 2026 00:25:38 +0700 Subject: [PATCH] cmd: skip consolidation for incomplete locations (locations without farm-level warehouse) --- .../main.go | 27 +++++++++++++------ 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/cmd/consolidate-kandang-to-farm-stocks/main.go b/cmd/consolidate-kandang-to-farm-stocks/main.go index 1c656604..b146a32b 100644 --- a/cmd/consolidate-kandang-to-farm-stocks/main.go +++ b/cmd/consolidate-kandang-to-farm-stocks/main.go @@ -26,13 +26,14 @@ const ( ) type options struct { - Apply bool - Output string - AreaName string - KandangLocationName string - DBSSLMode string - DeleteKandangWarehouses bool - SkipBlockedRefsCheck bool + Apply bool + Output string + AreaName string + KandangLocationName string + DBSSLMode string + DeleteKandangWarehouses bool + SkipBlockedRefsCheck bool + SkipIncompleteLocations bool } type consolidateRow struct { @@ -159,6 +160,7 @@ func parseFlags() (*options, error) { flag.StringVar(&opts.DBSSLMode, "db-sslmode", "", "Optional database sslmode override, for example: require") flag.BoolVar(&opts.DeleteKandangWarehouses, "delete-kandang-warehouses", true, "Soft delete kandang warehouse rows after all stocks have been moved") flag.BoolVar(&opts.SkipBlockedRefsCheck, "skip-blocked-refs-check", false, "Skip blocked references check (use with caution - only if you understand the stock_transfers references)") + flag.BoolVar(&opts.SkipIncompleteLocations, "skip-incomplete-locations", false, "Skip locations that don't have farm-level warehouses and process the rest") flag.Parse() opts.Output = strings.ToLower(strings.TrimSpace(opts.Output)) @@ -188,6 +190,12 @@ func loadConsolidateRows(ctx context.Context, db *gorm.DB, opts *options) ([]con args = append(args, opts.KandangLocationName) } + // If skipping incomplete locations, filter out NULL farm warehouses + whereClause := "" + if opts.SkipIncompleteLocations { + whereClause = "AND fw.id IS NOT NULL" + } + query := fmt.Sprintf(` SELECT a.name AS area_name, @@ -251,8 +259,11 @@ WHERE w.deleted_at IS NULL AND sa.deleted_at IS NULL ) %s + %s ORDER BY a.name ASC, kl.name ASC, k.name ASC, wp.id ASC -`, andClause(filters)) +`, + andClause(filters), + whereClause) rows := make([]consolidateRow, 0) if err := db.WithContext(ctx).Raw(query, args...).Scan(&rows).Error; err != nil {