objets_metier_rs 1.0.2

Bibliothèque Rust moderne et sûre pour l'API COM Objets Métier Sage 100c - Production Ready
//! Démonstration de l'objet Article enrichi
//!
//! Ce fichier illustre l'utilisation complète de l'objet Article avec toutes ses
//! propriétés enrichies (Phase 6):
//! - 28 propriétés (getters)
//! - 14 setters
//! - 7 méthodes de calcul
//!
//! Pour exécuter avec une vraie connexion Sage :
//! ```bash
//! $env:SAGE_DATABASE="D:\Sage\BIJOU.MAE"
//! $env:SAGE_USERNAME="<Administrateur>"
//! $env:SAGE_PASSWORD=""
//! cargo run --example cial_article_enriched
//! ```

use objets_metier_rs::errors::SageResult;
use objets_metier_rs::wrappers::cial::CialApplication;

const BSCIAL_CLSID: &str = "ED0EC116-16B8-44CC-A68A-41BF6E15EB3F";

fn main() -> SageResult<()> {
    println!("╔════════════════════════════════════════════════════════════╗");
    println!("║  Démonstration Article Enrichi - Phase 6                  ║");
    println!("╚════════════════════════════════════════════════════════════╝\n");

    // Configuration de connexion
    let database =
        std::env::var("SAGE_DATABASE").unwrap_or_else(|_| "D:\\TMP\\BIJOU.MAE".to_string());
    let username =
        std::env::var("SAGE_USERNAME").unwrap_or_else(|_| "<Administrateur>".to_string());
    let password = std::env::var("SAGE_PASSWORD").unwrap_or_else(|_| "".to_string());

    println!("📂 Base de données : {}", database);
    println!("👤 Utilisateur     : {}\n", username);

    // Connexion
    println!("🔌 Connexion à Sage 100c Commercial...");
    let cial = CialApplication::new(BSCIAL_CLSID)?;
    cial.set_name(&database)?;

    let loggable = cial.loggable()?;
    loggable.set_user_name(&username)?;
    loggable.set_user_pwd(&password)?;

    cial.open()?;
    println!("✅ Connexion réussie !\n");

    // =========================================================================
    // 1. Lecture d'un article existant
    // =========================================================================
    println!("═══════════════════════════════════════════════════════════");
    println!("1️⃣  Lecture d'un article existant");
    println!("═══════════════════════════════════════════════════════════");

    let factory = cial.factory_article()?;

    // Essayer de lire un article (adapter la référence selon votre base)
    let test_refs = vec!["BAAR01", "ART001", "TEST"];
    let mut article_found = None;

    for ref_art in test_refs {
        match factory.read_reference(ref_art) {
            Ok(article) => {
                article_found = Some(article);
                println!("✓ Article trouvé: {}", ref_art);
                break;
            }
            Err(_) => {
                println!("ℹ️  Article '{}' non trouvé", ref_art);
            }
        }
    }

    if let Some(article) = article_found {
        println!("\n📦 PROPRIÉTÉS PRINCIPALES:");
        println!("   • Référence      : {}", article.ar_ref()?);
        println!("   • Désignation    : {}", article.ar_design()?);
        //println!("   • cbMarq (ID)    : {}", article.cbmarq()?);

        println!("\n📋 PROPRIÉTÉS ESSENTIELLES:");
        if let Ok(code_barre) = article.ar_code_barre() {
            println!("   • Code-barres    : {}", code_barre);
        }
        if let Ok(unite_ven) = article.ar_unite_ven() {
            println!("   • Unité vente    : {}", unite_ven);
        }
        if let Ok(unite_pri) = article.ar_unite_pri() {
            println!("   • Unité prix     : {}", unite_pri);
        }
        if let Ok(condition) = article.ar_condition() {
            println!("   • Conditionnement: {}", condition);
        }

        println!("\n💰 PROPRIÉTÉS DE PRIX:");
        if let Ok(prix_ven) = article.ar_prix_ven() {
            println!("   • Prix vente HT  : {:.2}", prix_ven);
        }
        if let Ok(prix_ach) = article.ar_prix_ach() {
            println!("   • Prix achat HT  : {:.2}", prix_ach);
        }
        if let Ok(coef) = article.ar_coef() {
            println!("   • Coefficient    : {:.2}", coef);
        }
        if let Ok(prix_ttc) = article.ar_prix_ttc() {
            println!("   • Prix vente TTC : {:.2}", prix_ttc);
        }

        println!("\n🎨 GAMMES:");
        match article.ar_gamme1() {
            Ok(Some(gamme)) => {
                if let Ok(intitule) = gamme.intitule() {
                    println!("   • Gamme 1        : {}", intitule);
                }
            }
            Ok(None) => println!("   • Gamme 1        : (aucune)"),
            Err(_) => println!("   • Gamme 1        : Erreur lecture"),
        }

        match article.ar_gamme2() {
            Ok(Some(gamme)) => {
                if let Ok(intitule) = gamme.intitule() {
                    println!("   • Gamme 2        : {}", intitule);
                }
            }
            Ok(None) => println!("   • Gamme 2        : (aucune)"),
            Err(_) => println!("   • Gamme 2        : Erreur lecture"),
        }

        println!("\n⚙️  GESTION:");
        if let Ok(suivi_stock) = article.ar_suivi_stock() {
            println!(
                "   • Suivi stock    : {}",
                if suivi_stock { "OUI" } else { "NON" }
            );
        }
        if let Ok(sommeil) = article.ar_sommeil() {
            println!(
                "   • En sommeil     : {}",
                if sommeil { "OUI" } else { "NON" }
            );
        }
        if let Ok(stat01) = article.ar_stat01() {
            println!("   • Statistique 1  : {}", stat01);
        }

        println!("\n📊 COMPTABILITÉ:");
        if let Ok(categorie) = article.ar_categorie() {
            println!("   • Catégorie      : {}", categorie);
        }
        match article.ar_compte_cpt_g() {
            Ok(Some(compte)) => {
                if let Ok(numero) = compte.cg_num() {
                    println!("   • Compte vente   : {}", numero);
                }
            }
            Ok(None) => println!("   • Compte vente   : (aucun)"),
            Err(_) => println!("   • Compte vente   : Erreur lecture"),
        }

        println!("\n📦 STOCK:");
        if let Ok(qte_sto) = article.ar_qte_sto() {
            println!("   • Qté en stock   : {:.2}", qte_sto);
        }
        if let Ok(qte_res) = article.ar_qte_res() {
            println!("   • Qté réservée   : {:.2}", qte_res);
        }
        if let Ok(qte_cde) = article.ar_qte_cde() {
            println!("   • Qté en commande: {:.2}", qte_cde);
        }
        if let Ok(qte_min) = article.ar_qte_min() {
            println!("   • Stock minimum  : {:.2}", qte_min);
        }
        if let Ok(qte_max) = article.ar_qte_max() {
            println!("   • Stock maximum  : {:.2}", qte_max);
        }

        println!("\n🧮 MÉTHODES DE CALCUL:");
        if let Ok(dispo) = article.get_stock_disponible() {
            println!("   • Stock disponible: {:.2}", dispo);
        }
        if let Ok(need_reappro) = article.need_reappro() {
            println!(
                "   • Besoin réappro  : {}",
                if need_reappro {
                    "⚠️  OUI"
                } else {
                    "✓ NON"
                }
            );
        }
        if let Ok(prix_ttc) = article.calculate_prix_ttc() {
            println!("   • Prix TTC calculé: {:.2}", prix_ttc);
        }
    } else {
        println!("\n⚠️  Aucun article trouvé dans la base");
        println!("ℹ️  Créez des articles ou adaptez les références dans le code");
    }

    // =========================================================================
    // 2. Résumé des capacités enrichies
    // =========================================================================
    println!("\n═══════════════════════════════════════════════════════════");
    println!("2️⃣  Résumé des capacités enrichies");
    println!("═══════════════════════════════════════════════════════════");

    println!("\n✅ OBJET ARTICLE ENRICHI - Phase 6:");
    println!("   📊 28 propriétés (getters)");
    println!("      • 3 principales (ref, design, cbmarq)");
    println!("      • 6 essentielles (code-barres, famille, unités, conditionnement)");
    println!("      • 4 prix (vente HT, achat HT, coefficient, TTC)");
    println!("      • 2 gammes (gamme1, gamme2)");
    println!("      • 3 gestion (suivi stock, sommeil, stat01)");
    println!("      • 5 comptables (catégorie, comptes vente/achat/stock, TVA)");
    println!("      • 8 stock (qté stock/réservée/commande, min/max/réappro, dépôt, dernier PA)");
    println!("\n   ✏️  14 setters");
    println!("      • Modification de toutes les propriétés modifiables");
    println!("\n   🧮 7 méthodes");
    println!("      • calculate_prix_ttc() - Calcul prix TTC");
    println!("      • calculate_prix_ht() - Calcul prix HT");
    println!("      • get_stock_disponible() - Stock disponible (stock - réservé)");
    println!("      • need_reappro() - Besoin de réapprovisionnement");
    println!("      • set_default_article() - Initialisation valeurs par défaut");
    println!("      • write() - Enregistrement");
    println!("      • write_default() - Enregistrement avec initialisation");

    println!("\n📈 PROGRESSION:");
    println!("   AVANT (Phase 1): 3 getters, 2 setters, 2 méthodes");
    println!("   APRÈS (Phase 6): 28 getters, 14 setters, 7 méthodes");
    println!("   GAIN: +25 getters (+833%), +12 setters (+600%), +5 méthodes (+250%)");

    println!("\n🎯 COMPARAISON AVEC CPTA:");
    println!("   EcritureG (CPTA): 38 getters, 15 setters, 8 méthodes");
    println!("   Article (CIAL)  : 28 getters, 14 setters, 7 méthodes");
    println!("   Ratio           : 74% (niveau de complétude similaire ✅)");

    // Fermeture
    cial.close()?;
    println!("\n👋 Déconnexion réussie");

    Ok(())
}