objets_metier_rs 1.0.2

Bibliothèque Rust moderne et sûre pour l'API COM Objets Métier Sage 100c - Production Ready
use objets_metier_rs::CptaApplication;
use objets_metier_rs::SageResult;

fn main() -> SageResult<()> {
    println!("🚀 Démonstration de la bibliothèque objets_metier_rs avec la base de démo BIJOU");

    // Détection automatique de la version Sage installée
    let app = CptaApplication::new_auto()?;

    app.set_name(r"D:\TMP\BIJOU.MAE")?;
    app.loggable()?.set_user_name("<Administrateur>")?;
    app.loggable()?.set_user_pwd("")?;

    match app.open() {
        Ok(()) => {
            if app.is_open()? {
                // Syntaxe fluide directe - plus besoin de conversions manuelles !
                println!("✅ Utilisation de la syntaxe fluide améliorée !");

                println!("📋 Test Obtention compte général avec code 'BEU'...");
                match app.factory_journal()?.read_numero("BEU")?.compte_general() {
                    Ok(Some(compte)) => {
                        println!("   ✅ CompteG obtenu : {:?}", compte);
                        println!("       - Numéro : {:?}", compte.cg_num());
                        println!("       - Intitulé : {:?}", compte.cg_intitule());
                    }
                    Ok(None) => {
                        println!("   🔍 DEBUG CompteG - Aucun compte général associé à ce journal");
                    }
                    Err(e) => {
                        println!("   ⚠️  Erreur obtention CompteG : {}", e);
                    }
                }

                // Test ExistNumero avec code journal string
                println!("📋 Test ExistNumero avec code 'VTE'...");
                match app.factory_journal()?.exists_by_code("VTE") {
                    Ok(exists) => {
                        println!(
                            "   ✅ ExistNumero('VTE') réussi: Journal existe = {}",
                            exists
                        );
                        if exists {
                            // Test ReadNumero avec code journal string
                            println!("📋 Test ReadNumero avec code 'VTE'...");
                            match app.factory_journal()?.read_by_code("VTE") {
                                Ok(journal) => {
                                    println!("   ✅ ReadNumero('VTE') réussi: {:?}", journal);
                                    // Test des méthodes typées du journal
                                    println!("   🔸 Numéro : {:?}", journal.jo_num());
                                    println!("   🔸 Intitulé : {:?}", journal.jo_intitule());
                                    println!("   🔸 Type : {:?}", journal.jo_type());
                                    println!(
                                        "   🔸 Contrepartie : {:?}",
                                        journal.jo_contrepartie()
                                    );
                                    println!(
                                        "   🔸 Saisie analytique : {:?}",
                                        journal.jo_saisi_anal()
                                    );
                                    println!("   🔸 En sommeil : {:?}", journal.jo_sommeil());

                                    match journal.compte_general() {
                                        Ok(Some(compte)) => {
                                            println!("   🔸 CompteG obtenu : {:?}", compte);
                                            println!("       - Numéro : {:?}", compte.cg_num());
                                            println!(
                                                "       - Intitulé : {:?}",
                                                compte.cg_intitule()
                                            );
                                        }
                                        Ok(None) => {
                                            println!(
                                                "   🔸 CompteG : Aucun compte général associé à ce journal"
                                            );
                                        }
                                        Err(e) => {
                                            println!("   🔸 Erreur obtention CompteG : {}", e)
                                        }
                                    }
                                }
                                Err(e) => println!(
                                    "   ⚠️  ReadNumero('VTE'): {} (Dossier fermé = normal)",
                                    e
                                ),
                            }
                        }
                    }
                    Err(e) => println!("   ⚠️  ExistNumero('VTE'): {} (Dossier fermé = normal)", e),
                }

                // Test FactoryEcriture
                println!("📋 Test ExistNumero avec numéro 3...");
                match app.factory_ecriture()?.exist_numero(3) {
                    Ok(exists) => {
                        println!("   ✅ ExistNumero(3) réussi: Écriture existe = {}", exists);
                        if exists {
                            // Test ReadNumero avec numéro
                            println!("📋 Test ReadNumero avec numéro 3...");
                            match app.factory_ecriture()?.read_numero(3) {
                                Ok(ecriture) => {
                                    println!("   ✅ ReadNumero(3) réussi: {:?}", ecriture);
                                    // Test des méthodes typées de l'écriture
                                    println!("   🔸 Numéro : {:?}", ecriture.ec_no());
                                    println!("   🔸 Pièce : {:?}", ecriture.ec_piece());
                                    println!("   🔸 Intitulé : {:?}", ecriture.ec_intitule());
                                    println!("   🔸 Montant : {:?}", ecriture.ec_montant());
                                    println!("   🔸 Sens : {:?}", ecriture.ec_sens());
                                    println!("   🔸 Lettrage : {:?}", ecriture.ec_lettrage());
                                    println!("   🔸 Devise : {:?}", ecriture.ec_devise());
                                    println!("   🔸 Date : {:?}", ecriture.date());
                                    println!("   🔸 Date de saisie : {:?}", ecriture.date_saisie());

                                    match ecriture.compte_general() {
                                        Ok(Some(compte)) => {
                                            println!("   🔸 CompteG obtenu : {:?}", compte);
                                            println!("       - Numéro : {:?}", compte.cg_num());
                                            println!(
                                                "       - Intitulé : {:?}",
                                                compte.cg_intitule()
                                            );
                                        }
                                        Ok(None) => {
                                            println!(
                                                "   🔸 CompteG : Aucun compte général associé à cette écriture"
                                            );
                                        }
                                        Err(e) => {
                                            println!("   🔸 Erreur obtention CompteG : {}", e)
                                        }
                                    }

                                    match ecriture.journal() {
                                        Ok(Some(journal)) => {
                                            println!("   🔸 Journal obtenu : {:?}", journal);
                                            println!("       - Numéro : {:?}", journal.jo_num());
                                            println!(
                                                "       - Intitulé : {:?}",
                                                journal.jo_intitule()
                                            );
                                        }
                                        Ok(None) => {
                                            println!(
                                                "   🔸 Journal : Aucun journal associé à cette écriture"
                                            );
                                        }
                                        Err(e) => {
                                            println!("   🔸 Erreur obtention Journal : {}", e)
                                        }
                                    }

                                    match ecriture.tiers() {
                                        Ok(Some(tiers)) => {
                                            println!("   🔸 Tiers obtenu : {:?}", tiers);
                                            println!("       - Numéro : {:?}", tiers.ct_num());
                                            println!(
                                                "       - Raison sociale : {:?}",
                                                tiers.ct_intitule()
                                            );
                                            println!("       - Type : {:?}", tiers.ct_type());
                                            println!("       - Qualité : {:?}", tiers.ct_qualite());
                                            println!(
                                                "       - Classement : {:?}",
                                                tiers.ct_classement()
                                            );
                                            println!(
                                                "       - Commentaire : {:?}",
                                                tiers.ct_commentaire()
                                            );
                                            println!(
                                                "       - Identifiant : {:?}",
                                                tiers.ct_identifiant()
                                            );
                                            println!("       - SIRET : {:?}", tiers.ct_siret());
                                            println!("       - APE : {:?}", tiers.ct_ape());
                                            println!(
                                                "       - Date de création : {:?}",
                                                tiers.ct_date_create()
                                            );
                                            println!("       - Sommeil : {:?}", tiers.ct_sommeil());
                                        }
                                        Ok(None) => {
                                            println!(
                                                "   🔸 Tiers : Aucun tiers associé à cette écriture"
                                            );
                                        }
                                        Err(e) => println!("   🔸 Erreur obtention Tiers : {}", e),
                                    }
                                }
                                Err(e) => {
                                    println!("   ⚠️  ReadNumero(1): {} (Dossier fermé = normal)", e)
                                }
                            }
                        }
                    }
                    Err(e) => println!("   ⚠️  ExistNumero(1): {} (Dossier fermé = normal)", e),
                }

                println!("\n🎉 Syntaxe fluide améliorée fonctionnelle !");

                // Fermer proprement
                app.close()?;
                println!("\n✅ Base fermée proprement !");
            }
        }
        Err(e) => {
            println!("❌ ÉCHEC DE CONNEXION: {}", e);
            println!("💡 Causes possibles:");
            println!("   - Fichier BIJOU.MAE inexistant");
            println!("   - Credentials incorrects");
            println!("   - Base corrompue");
            println!("   - Sage OM 100c non installé");
        }
    }

    Ok(())
}