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

/// ✅ IMPLÉMENTATION ENRICHIE - Version Phase 6
///
/// Wrapper pour conditionnements d'articles (IBSCIALConditionnement3)
///
/// Un conditionnement définit un mode de vente ou d'achat groupé :
/// - Unité (pièce individuelle)
/// - Carton de 12
/// - Palette de 100
/// - Lot de 50
/// - etc.
///
/// Chaque conditionnement est lié à une unité de base et possède
/// un coefficient de conversion.
///
/// # Exemple
/// ```no_run
/// use objets_metier_rs::wrappers::cial::CialApplication;
///
/// let cial_app = CialApplication::new("Objets100c.CIAL")?;
/// let factory = cial_app.factory_conditionnement()?;
///
/// let cond = factory.create()?;
/// cond.set_intitule("Carton de 12")?;
/// cond.set_coefficient(12.0)?;
/// cond.write()?;
/// # Ok::<(), Box<dyn std::error::Error>>(())
/// ```
pub struct Conditionnement {
    pub(crate) dispatch: IDispatch,
}

impl Conditionnement {
    fn dispatch(&self) -> SafeDispatch<'_> {
        SafeDispatch::new(&self.dispatch)
    }

    // ═══════════════════════════════════════════════════════════════════════
    // PROPRIÉTÉS DE BASE (2 propriétés)
    // ═══════════════════════════════════════════════════════════════════════

    /// Identifiant unique (cbMarq)
    pub fn cbmarq(&self) -> SageResult<i32> {
        self.dispatch().call_method_by_name("cbMarq", &[])?.to_i32()
    }

    /// Intitulé du conditionnement
    pub fn intitule(&self) -> SageResult<String> {
        self.dispatch()
            .call_method_by_name("Intitule", &[])?
            .to_string()
    }

    // ═══════════════════════════════════════════════════════════════════════
    // PROPRIÉTÉS DE CONFIGURATION (4 propriétés)
    // ═══════════════════════════════════════════════════════════════════════

    /// Coefficient de conversion (ex: 12 pour carton de 12)
    pub fn coefficient(&self) -> SageResult<f64> {
        self.dispatch()
            .call_method_by_name("Coefficient", &[])?
            .to_f64()
    }

    /// Code barre du conditionnement
    pub fn code_barre(&self) -> SageResult<String> {
        self.dispatch()
            .call_method_by_name("CodeBarre", &[])?
            .to_string()
    }

    /// Poids du conditionnement
    pub fn poids(&self) -> SageResult<f64> {
        self.dispatch().call_method_by_name("Poids", &[])?.to_f64()
    }

    /// Volume du conditionnement
    pub fn volume(&self) -> SageResult<f64> {
        self.dispatch().call_method_by_name("Volume", &[])?.to_f64()
    }

    // ═══════════════════════════════════════════════════════════════════════
    // SETTERS (5 setters)
    // ═══════════════════════════════════════════════════════════════════════

    /// Modifie l'intitulé du conditionnement
    pub fn set_intitule(&self, value: &str) -> SageResult<()> {
        let param = SafeVariant::from_string(value);
        self.dispatch().call_property_put("Intitule", &[param])?;
        Ok(())
    }

    /// Modifie le coefficient de conversion
    pub fn set_coefficient(&self, coef: f64) -> SageResult<()> {
        let param = SafeVariant::from_f64(coef);
        self.dispatch().call_property_put("Coefficient", &[param])?;
        Ok(())
    }

    /// Modifie le code barre
    pub fn set_code_barre(&self, code: &str) -> SageResult<()> {
        let param = SafeVariant::from_string(code);
        self.dispatch().call_property_put("CodeBarre", &[param])?;
        Ok(())
    }

    /// Modifie le poids
    pub fn set_poids(&self, poids: f64) -> SageResult<()> {
        let param = SafeVariant::from_f64(poids);
        self.dispatch().call_property_put("Poids", &[param])?;
        Ok(())
    }

    /// Modifie le volume
    pub fn set_volume(&self, volume: f64) -> SageResult<()> {
        let param = SafeVariant::from_f64(volume);
        self.dispatch().call_property_put("Volume", &[param])?;
        Ok(())
    }

    // ═══════════════════════════════════════════════════════════════════════
    // MÉTHODES STANDARD (3 méthodes)
    // ═══════════════════════════════════════════════════════════════════════

    /// Enregistre les modifications
    pub fn write(&self) -> SageResult<()> {
        self.dispatch().call_method_by_name("Write", &[])?;
        Ok(())
    }

    /// Enregistre avec valeurs par défaut
    pub fn write_default(&self) -> SageResult<()> {
        self.dispatch().call_method_by_name("WriteDefault", &[])?;
        Ok(())
    }

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