backbone-inventory 0.17.2

Inventory: stock ledger of record (SLE) + moving-average valuation; emits COGS/asset AccountingPost (Delivery/Receipt -> GL)
Documentation
//! Database seeder binary for module: inventory
//!
//! Generated by metaphor-schema. Do not edit manually.
//!
//! Run with: cargo run --bin inventory-seeder
//! Or via CLI: backbone seed run --module inventory
//!
//! This binary runs all registered seeders in order.

use anyhow::Result;
use sqlx::postgres::PgPoolOptions;
use std::env;

// Import seeders
use backbone_inventory::seeders::SeedPickingBatchSeeder;
use backbone_inventory::seeders::SeedDeliveryNoteSeeder;
use backbone_inventory::seeders::SeedDeliveryNoteItemSeeder;
use backbone_inventory::seeders::SeedInventoryCompanySettingSeeder;
use backbone_inventory::seeders::SeedLandedCostSeeder;
use backbone_inventory::seeders::SeedLandedCostLineSeeder;
use backbone_inventory::seeders::SeedLandedCostAdjustmentLineSeeder;
use backbone_inventory::seeders::SeedLocationSeeder;
use backbone_inventory::seeders::SeedStockMoveSeeder;
use backbone_inventory::seeders::SeedStockMoveLineSeeder;
use backbone_inventory::seeders::SeedOperationTypeSeeder;
use backbone_inventory::seeders::SeedTransferSeeder;
use backbone_inventory::seeders::SeedRouteSeeder;
use backbone_inventory::seeders::SeedRouteRuleSeeder;
use backbone_inventory::seeders::SeedReorderingRuleSeeder;
use backbone_inventory::seeders::SeedPurchaseReceiptSeeder;
use backbone_inventory::seeders::SeedPurchaseReceiptItemSeeder;
use backbone_inventory::seeders::SeedQuantSeeder;
use backbone_inventory::seeders::SeedScrapSeeder;
use backbone_inventory::seeders::SeedScrapReasonTagSeeder;
use backbone_inventory::seeders::SeedStockEntrySeeder;
use backbone_inventory::seeders::SeedStockEntryItemSeeder;
use backbone_inventory::seeders::SeedStockLedgerEntrySeeder;
use backbone_inventory::seeders::SeedBinSeeder;
use backbone_inventory::seeders::SeedStockReconciliationSeeder;
use backbone_inventory::seeders::SeedStockReconciliationItemSeeder;
use backbone_inventory::seeders::SeedPackageTypeSeeder;
use backbone_inventory::seeders::SeedStorageCategorySeeder;
use backbone_inventory::seeders::SeedStorageCategoryCapacitySeeder;
use backbone_inventory::seeders::SeedPutawayRuleSeeder;
use backbone_inventory::seeders::SeedLotSeeder;
use backbone_inventory::seeders::SeedPackageSeeder;
use backbone_inventory::seeders::SeedWarehouseSeeder;
use backbone_inventory::seeders::SeedStockItemSeeder;
use backbone_inventory::seeders::Seeder;

#[tokio::main]
async fn main() -> Result<()> {
    let args: Vec<String> = env::args().collect();
    let force = args.iter().any(|a| a == "--force");
    let filter: Option<&str> = args.iter()
        .skip(1)
        .find(|a| !a.starts_with("-"))
        .map(|s| s.as_str());

    let database_url = env::var("DATABASE_URL")
        .map_err(|e| anyhow::anyhow!("DATABASE_URL must be set: {e}"))?;

    println!("Connecting to database...");

    let pool = PgPoolOptions::new()
        .max_connections(5)
        .connect(&database_url)
        .await?;

    println!("Connected to database");
    println!();
    println!("Running seeders for module: inventory");
    println!();

    // Register seeders in order
    let mut seeders: Vec<Box<dyn Seeder + Send + Sync>> = Vec::new();
    seeders.push(Box::new(SeedPickingBatchSeeder::new()));
    seeders.push(Box::new(SeedDeliveryNoteSeeder::new()));
    seeders.push(Box::new(SeedDeliveryNoteItemSeeder::new()));
    seeders.push(Box::new(SeedInventoryCompanySettingSeeder::new()));
    seeders.push(Box::new(SeedLandedCostSeeder::new()));
    seeders.push(Box::new(SeedLandedCostLineSeeder::new()));
    seeders.push(Box::new(SeedLandedCostAdjustmentLineSeeder::new()));
    seeders.push(Box::new(SeedLocationSeeder::new()));
    seeders.push(Box::new(SeedStockMoveSeeder::new()));
    seeders.push(Box::new(SeedStockMoveLineSeeder::new()));
    seeders.push(Box::new(SeedOperationTypeSeeder::new()));
    seeders.push(Box::new(SeedTransferSeeder::new()));
    seeders.push(Box::new(SeedRouteSeeder::new()));
    seeders.push(Box::new(SeedRouteRuleSeeder::new()));
    seeders.push(Box::new(SeedReorderingRuleSeeder::new()));
    seeders.push(Box::new(SeedPurchaseReceiptSeeder::new()));
    seeders.push(Box::new(SeedPurchaseReceiptItemSeeder::new()));
    seeders.push(Box::new(SeedQuantSeeder::new()));
    seeders.push(Box::new(SeedScrapSeeder::new()));
    seeders.push(Box::new(SeedScrapReasonTagSeeder::new()));
    seeders.push(Box::new(SeedStockEntrySeeder::new()));
    seeders.push(Box::new(SeedStockEntryItemSeeder::new()));
    seeders.push(Box::new(SeedStockLedgerEntrySeeder::new()));
    seeders.push(Box::new(SeedBinSeeder::new()));
    seeders.push(Box::new(SeedStockReconciliationSeeder::new()));
    seeders.push(Box::new(SeedStockReconciliationItemSeeder::new()));
    seeders.push(Box::new(SeedPackageTypeSeeder::new()));
    seeders.push(Box::new(SeedStorageCategorySeeder::new()));
    seeders.push(Box::new(SeedStorageCategoryCapacitySeeder::new()));
    seeders.push(Box::new(SeedPutawayRuleSeeder::new()));
    seeders.push(Box::new(SeedLotSeeder::new()));
    seeders.push(Box::new(SeedPackageSeeder::new()));
    seeders.push(Box::new(SeedWarehouseSeeder::new()));
    seeders.push(Box::new(SeedStockItemSeeder::new()));

    // Sort by order
    seeders.sort_by_key(|s| s.order());

    // Run seeders
    for seeder in &seeders {
        let name = seeder.name();

        // Apply filter if specified
        if let Some(f) = filter {
            if !name.contains(f) {
                continue;
            }
        }

        if force {
            println!("   Running {}...", name);
            seeder.run(&pool).await?;
            println!("   {} completed", name);
        } else {
            println!("   Checking {}...", name);
            if seeder.should_run(&pool).await? {
                println!("   Running {}...", name);
                seeder.run(&pool).await?;
                println!("   {} completed", name);
            } else {
                println!("   {} already applied, skipping", name);
            }
        }
    }

    println!();
    println!("All seeders completed successfully!");

    Ok(())
}