objets_metier_rs 1.0.2

Bibliothèque Rust moderne et sûre pour l'API COM Objets Métier Sage 100c - Production Ready
/// Exemple de création d'une pièce comptable complète avec IPMEncoder
///
/// Cet exemple montre la méthode RECOMMANDÉE par Sage pour créer des écritures :
/// utilisation du processus IPMEncoder qui garantit :
/// - L'équilibre de la pièce comptable (Débit = Crédit)
/// - La cohérence des données
/// - La validation avec CanProcess() avant l'enregistrement
/// - La gestion des erreurs via IFailInfoCol
///
/// Scénario : Règlement d'un fournisseur (débit fournisseur, crédit banque)
use objets_metier_rs::SageResult;

const BSCPTA_CLSID: &str = "309DE0FB-9FB8-4F4E-8295-CC60C60DAA33";

fn main() -> SageResult<()> {
    println!("=============================================================");
    println!("  Exemple : Création de pièce comptable (IPMEncoder)");
    println!("=============================================================\n");

    // Initialiser COM
    unsafe {
        let _ = windows::Win32::System::Com::CoInitializeEx(
            None,
            windows::Win32::System::Com::COINIT_MULTITHREADED,
        );
    }

    // Connexion à la base BIJOU
    let app = objets_metier_rs::CptaApplication::new(BSCPTA_CLSID)?;
    app.set_name(r"D:\TMP\BIJOU.MAE")?;
    app.loggable()?.set_user_name("<Administrateur>")?;
    app.loggable()?.set_user_pwd("")?;
    app.open()?;

    println!("✅ Connexion à BIJOU réussie\n");
    println!("📝 Création d'une pièce comptable complète avec IPMEncoder...\n");

    // 1. Créer le processus encoder
    println!("🔧 Étape 1 : Création du processus encoder");
    let process = app.create_process_encoder()?;
    println!("   ✓ Processus créé\n");

    // 2. Définir les propriétés globales
    println!("📋 Étape 2 : Configuration des propriétés globales");
    let journal = app.factory_journal()?.read_by_code("BEU")?;
    process.set_journal(&journal)?;
    println!("   ✓ Journal : BEU (Banque - Euros)");

    process.set_date("2025-01-15")?;
    println!("   ✓ Date : 2025-01-15");

    let piece = "REGLT001";
    process.set_ec_piece(piece)?;
    println!("   ✓ Numéro de pièce : {}", piece);

    process.set_ec_intitule("Règlement facture fournisseur")?;
    println!("   ✓ Intitulé : Règlement facture fournisseur\n");

    // 3. Créer l'écriture tiers (débit)
    println!("💳 Étape 3 : Création de l'écriture fournisseur (débit)");
    let ec_tiers = process.factory_ecriture_in()?.create()?;
    ec_tiers.set_default()?;

    let compte_tiers = app.factory_compte_g()?.read_numero("4010000")?;
    ec_tiers.set_compte_g(&compte_tiers)?;
    println!("   ✓ Compte : 4010000 (Fournisseurs)");

    let tiers = app.factory_tiers()?.read_numero("HOLDI")?;
    ec_tiers.set_tiers(&tiers)?;
    println!("   ✓ Tiers : HOLDI");

    ec_tiers.set_ec_sens(0)?; // Débit
    println!("   ✓ Sens : Débit");

    ec_tiers.set_ec_montant(10000.0)?;
    println!("   ✓ Montant : 10 000.00 €");

    ec_tiers.write_default()?;
    println!("   ✓ Écriture tiers enregistrée dans le processus\n");

    // 4. Créer l'écriture banque (crédit)
    println!("🏦 Étape 4 : Création de l'écriture banque (crédit)");
    let ec_banque = process.factory_ecriture_in()?.create()?;
    ec_banque.set_default()?;

    let compte_banque = app.factory_compte_g()?.read_numero("5120")?;
    ec_banque.set_compte_g(&compte_banque)?;
    println!("   ✓ Compte : 5120 (Banque)");

    ec_banque.set_ec_sens(1)?; // Crédit
    println!("   ✓ Sens : Crédit");

    ec_banque.set_ec_montant(10000.0)?;
    println!("   ✓ Montant : 10 000.00 €");

    ec_banque.write_default()?;
    println!("   ✓ Écriture banque enregistrée dans le processus\n");

    // 5. Validation et enregistrement
    println!("🔍 Étape 5 : Validation de la pièce comptable");
    if process.can_process()? {
        println!("   ✅ Pièce valide et équilibrée\n");

        println!("💾 Étape 6 : Enregistrement en base");
        process.process()?;
        println!("   ✅ Pièce enregistrée avec succès !\n");

        println!("=============================================================");
        println!("✅ SUCCÈS : Pièce comptable créée");
        println!("   - Journal : BEU");
        println!("   - Pièce : {}", piece);
        println!("   - Date : 2025-01-15");
        println!("   - Débit : 4010000 (HOLDI) = 10 000.00 €");
        println!("   - Crédit : 5120 (Banque) = 10 000.00 €");
        println!("=============================================================\n");
    } else {
        println!("   ❌ Erreurs détectées lors de la validation :\n");
        let errors = process.errors()?;
        let count = errors.count()?;

        for i in 1..=count {
            let error = errors.item(i)?;
            println!(
                "      [Ligne {}] Code {} : {}",
                error.indice()?,
                error.error_code()?,
                error.text()?
            );
        }
        println!("\n❌ ÉCHEC : La pièce n'a pas pu être enregistrée\n");
    }

    app.close()?;
    println!("✅ Fermeture de la base\n");

    Ok(())
}