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 crate::com::{FromDispatch, FromDispatchNew, SafeDispatch, SafeVariant};
use crate::errors::SageResult;
use windows::Win32::System::Com::IDispatch;

/// Wrapper pour l'objet Banque de Sage 100c (IBOBanque3)
///
/// Représente un compte bancaire de l'entreprise avec toutes ses informations
/// (RIB, IBAN, compte général associé, etc.)
pub struct Banque {
    pub dispatch: IDispatch,
}

impl Banque {
    /// Crée un SafeDispatch temporaire pour les appels
    fn dispatch(&self) -> SafeDispatch<'_> {
        SafeDispatch::new(&self.dispatch)
    }

    // ==================== IDENTIFICATION ====================

    /// Obtient l'intitulé du compte bancaire
    pub fn ba_intitule(&self) -> SageResult<String> {
        self.dispatch()
            .call_method_by_name("BA_Intitule", &[])?
            .to_string()
    }

    /// Définit l'intitulé du compte bancaire
    pub fn set_ba_intitule(&self, value: &str) -> SageResult<()> {
        let param = SafeVariant::from_string(value);
        self.dispatch().call_property_put("BA_Intitule", &[param])?;
        Ok(())
    }

    /// Obtient l'abrégé du compte bancaire
    pub fn ba_abrege(&self) -> SageResult<String> {
        self.dispatch()
            .call_method_by_name("BA_Abrege", &[])?
            .to_string()
    }

    /// Définit l'abrégé du compte bancaire
    pub fn set_ba_abrege(&self, value: &str) -> SageResult<()> {
        let param = SafeVariant::from_string(value);
        self.dispatch().call_property_put("BA_Abrege", &[param])?;
        Ok(())
    }

    // ==================== COORDONNÉES BANCAIRES ====================

    /// Obtient le code banque
    pub fn ba_code_banque(&self) -> SageResult<String> {
        self.dispatch()
            .call_method_by_name("BA_CodeBanque", &[])?
            .to_string()
    }

    /// Définit le code banque
    pub fn set_ba_code_banque(&self, value: &str) -> SageResult<()> {
        let param = SafeVariant::from_string(value);
        self.dispatch()
            .call_property_put("BA_CodeBanque", &[param])?;
        Ok(())
    }

    /// Obtient le code guichet
    pub fn ba_code_guichet(&self) -> SageResult<String> {
        self.dispatch()
            .call_method_by_name("BA_CodeGuichet", &[])?
            .to_string()
    }

    /// Définit le code guichet
    pub fn set_ba_code_guichet(&self, value: &str) -> SageResult<()> {
        let param = SafeVariant::from_string(value);
        self.dispatch()
            .call_property_put("BA_CodeGuichet", &[param])?;
        Ok(())
    }

    /// Obtient le numéro de compte
    pub fn ba_numero_compte(&self) -> SageResult<String> {
        self.dispatch()
            .call_method_by_name("BA_NumeroCompte", &[])?
            .to_string()
    }

    /// Définit le numéro de compte
    pub fn set_ba_numero_compte(&self, value: &str) -> SageResult<()> {
        let param = SafeVariant::from_string(value);
        self.dispatch()
            .call_property_put("BA_NumeroCompte", &[param])?;
        Ok(())
    }

    /// Obtient la clé RIB
    pub fn ba_cle_rib(&self) -> SageResult<String> {
        self.dispatch()
            .call_method_by_name("BA_CleRib", &[])?
            .to_string()
    }

    /// Définit la clé RIB
    pub fn set_ba_cle_rib(&self, value: &str) -> SageResult<()> {
        let param = SafeVariant::from_string(value);
        self.dispatch().call_property_put("BA_CleRib", &[param])?;
        Ok(())
    }

    /// Obtient l'IBAN
    pub fn ba_iban(&self) -> SageResult<String> {
        self.dispatch()
            .call_method_by_name("BA_IBAN", &[])?
            .to_string()
    }

    /// Définit l'IBAN
    pub fn set_ba_iban(&self, value: &str) -> SageResult<()> {
        let param = SafeVariant::from_string(value);
        self.dispatch().call_property_put("BA_IBAN", &[param])?;
        Ok(())
    }

    /// Obtient le code SWIFT/BIC
    pub fn ba_swift(&self) -> SageResult<String> {
        self.dispatch()
            .call_method_by_name("BA_CodeSWIFT", &[])?
            .to_string()
    }

    /// Définit le code SWIFT/BIC
    pub fn set_ba_swift(&self, value: &str) -> SageResult<()> {
        let param = SafeVariant::from_string(value);
        self.dispatch()
            .call_property_put("BA_CodeSWIFT", &[param])?;
        Ok(())
    }

    // ==================== COMPTABILITÉ ====================

    /// Obtient le compte général associé
    pub fn ba_compte_g(&self) -> SageResult<String> {
        self.dispatch()
            .call_method_by_name("BA_CompteG", &[])?
            .to_string()
    }

    /// Définit le compte général associé
    pub fn set_ba_compte_g(&self, value: &str) -> SageResult<()> {
        let param = SafeVariant::from_string(value);
        self.dispatch().call_property_put("BA_CompteG", &[param])?;
        Ok(())
    }

    /// Obtient le code journal associé
    pub fn ba_journal(&self) -> SageResult<String> {
        self.dispatch()
            .call_method_by_name("BA_Journal", &[])?
            .to_string()
    }

    /// Définit le code journal associé
    pub fn set_ba_journal(&self, value: &str) -> SageResult<()> {
        let param = SafeVariant::from_string(value);
        self.dispatch().call_property_put("BA_Journal", &[param])?;
        Ok(())
    }

    // ==================== INFORMATIONS COMPLÉMENTAIRES ====================

    /// Obtient le code devise
    pub fn ba_devise(&self) -> SageResult<String> {
        self.dispatch()
            .call_method_by_name("BA_Devise", &[])?
            .to_string()
    }

    /// Définit le code devise
    pub fn set_ba_devise(&self, value: &str) -> SageResult<()> {
        let param = SafeVariant::from_string(value);
        self.dispatch().call_property_put("BA_Devise", &[param])?;
        Ok(())
    }

    /// Obtient le mode de paiement par défaut
    pub fn ba_mode_paiement(&self) -> SageResult<i32> {
        self.dispatch()
            .call_method_by_name("BA_ModePaiement", &[])?
            .to_i32()
    }

    /// Définit le mode de paiement par défaut
    pub fn set_ba_mode_paiement(&self, value: i32) -> SageResult<()> {
        let param = SafeVariant::from_i32(value);
        self.dispatch()
            .call_property_put("BA_ModePaiement", &[param])?;
        Ok(())
    }

    /// Obtient le solde du compte bancaire
    pub fn ba_solde(&self) -> SageResult<f64> {
        self.dispatch()
            .call_method_by_name("BA_Solde", &[])?
            .to_f64()
    }

    // Note: BA_Solde est généralement en lecture seule (calculé)

    // ==================== MÉTHODES IBIPersistObject ====================

    /// Enregistre l'objet dans la base de données
    pub fn write(&self) -> SageResult<()> {
        self.dispatch().call_method_by_name("Write", &[])?;
        Ok(())
    }

    /// Lit l'objet depuis la base de données
    pub fn read(&self) -> SageResult<SafeVariant> {
        self.dispatch().call_method_by_name("Read", &[])
    }

    /// Supprime l'objet de la base de données
    pub fn remove(&self) -> SageResult<()> {
        self.dispatch().call_method_by_name("Remove", &[])?;
        Ok(())
    }

    // ==================== MÉTHODES UTILITAIRES ====================

    /// Retourne une description formatée du compte bancaire
    /// Format: "Banque [Intitulé] - IBAN: [IBAN]"
    pub fn description(&self) -> SageResult<String> {
        let intitule = self.ba_intitule()?;
        let iban = self.ba_iban().unwrap_or_else(|_| "N/A".to_string());
        Ok(format!("Banque {} - IBAN: {}", intitule, iban))
    }
}

impl FromDispatch for Banque {
    fn from_dispatch(dispatch: IDispatch) -> SageResult<Self> {
        Ok(Banque { dispatch })
    }
}

impl FromDispatchNew for Banque {
    fn from_dispatch_new(dispatch: IDispatch) -> SageResult<Self> {
        Ok(Self { dispatch })
    }
}

#[cfg(test)]
mod tests {
    #[test]
    fn test_banque_documentation() {
        // Test de documentation - nécessite un environnement Sage pour s'exécuter

        // Utilisation typique :
        // let factory = app.factory_banque()?;
        // let banque = factory.read_intitule("BNP Paribas")?;
        //
        // println!("Banque: {}", banque.ba_intitule()?);
        // println!("IBAN: {}", banque.ba_iban()?);
        // println!("SWIFT: {}", banque.ba_swift()?);
        // println!("Compte: {}", banque.ba_compte_g()?);
        // println!("Journal: {}", banque.ba_journal()?);
        // println!("Solde: {:.2} €", banque.ba_solde()?);
        //
        // // Modification
        // banque.set_ba_intitule("BNP Paribas Pro")?;
        // banque.write()?;
    }
}