use crate::com::{SafeDispatch, SafeVariant};
use crate::errors::{SageError, SageResult};
use crate::wrappers::cial::objects::{Depot, Famille, Gamme};
use crate::wrappers::cpta::objects::{CompteG, Taxe};
use windows::Win32::System::Com::IDispatch;
pub struct Article {
pub(crate) dispatch: IDispatch,
}
impl Article {
fn dispatch(&self) -> SafeDispatch<'_> {
SafeDispatch::new(&self.dispatch)
}
pub fn ar_ref(&self) -> SageResult<String> {
self.dispatch()
.call_method_by_name("AR_Ref", &[])?
.to_string()
}
pub fn set_ar_ref(&self, value: &str) -> SageResult<()> {
let param = SafeVariant::from_string(value);
self.dispatch().call_property_put("AR_Ref", &[param])?;
Ok(())
}
pub fn ar_design(&self) -> SageResult<String> {
self.dispatch()
.call_method_by_name("AR_Design", &[])?
.to_string()
}
pub fn set_ar_design(&self, value: &str) -> SageResult<()> {
let param = SafeVariant::from_string(value);
self.dispatch().call_property_put("AR_Design", &[param])?;
Ok(())
}
pub fn cbmarq(&self) -> SageResult<i32> {
self.dispatch().call_method_by_name("cbMarq", &[])?.to_i32()
}
pub fn ar_code_barre(&self) -> SageResult<String> {
self.dispatch()
.call_method_by_name("AR_CodeBarre", &[])?
.to_string()
}
pub fn set_ar_code_barre(&self, value: &str) -> SageResult<()> {
let param = SafeVariant::from_string(value);
self.dispatch()
.call_property_put("AR_CodeBarre", &[param])?;
Ok(())
}
pub fn ar_famille(&self) -> SageResult<Option<Famille>> {
let variant = self.dispatch().call_method_by_name("AR_Famille", &[])?;
if variant.is_empty_or_null() {
return Ok(None);
}
if variant.is_object() {
Ok(Some(Famille {
dispatch: variant.to_dispatch()?,
}))
} else {
Err(SageError::ConversionError {
from_type: "VARIANT".to_string(),
to_type: "Famille".to_string(),
value: "AR_Famille n'est pas un objet".to_string(),
})
}
}
pub fn set_ar_famille(&self, famille: &Famille) -> SageResult<()> {
let param = SafeVariant::from_dispatch(famille.dispatch.clone());
self.dispatch().call_property_put("AR_Famille", &[param])?;
Ok(())
}
pub fn ar_unite_ven(&self) -> SageResult<String> {
self.dispatch()
.call_method_by_name("AR_UniteVen", &[])?
.to_string()
}
pub fn set_ar_unite_ven(&self, value: &str) -> SageResult<()> {
let param = SafeVariant::from_string(value);
self.dispatch().call_property_put("AR_UniteVen", &[param])?;
Ok(())
}
pub fn ar_unite_pri(&self) -> SageResult<String> {
self.dispatch()
.call_method_by_name("AR_UnitePri", &[])?
.to_string()
}
pub fn set_ar_unite_pri(&self, value: &str) -> SageResult<()> {
let param = SafeVariant::from_string(value);
self.dispatch().call_property_put("AR_UnitePri", &[param])?;
Ok(())
}
pub fn ar_condition(&self) -> SageResult<String> {
self.dispatch()
.call_method_by_name("AR_Condition", &[])?
.to_string()
}
pub fn set_ar_condition(&self, value: &str) -> SageResult<()> {
let param = SafeVariant::from_string(value);
self.dispatch()
.call_property_put("AR_Condition", &[param])?;
Ok(())
}
pub fn ar_prix_ven(&self) -> SageResult<f64> {
self.dispatch()
.call_method_by_name("AR_PrixVen", &[])?
.to_f64()
}
pub fn set_ar_prix_ven(&self, value: f64) -> SageResult<()> {
let param = SafeVariant::R8(value);
self.dispatch().call_property_put("AR_PrixVen", &[param])?;
Ok(())
}
pub fn ar_prix_ach(&self) -> SageResult<f64> {
self.dispatch()
.call_method_by_name("AR_PrixAch", &[])?
.to_f64()
}
pub fn set_ar_prix_ach(&self, value: f64) -> SageResult<()> {
let param = SafeVariant::R8(value);
self.dispatch().call_property_put("AR_PrixAch", &[param])?;
Ok(())
}
pub fn ar_coef(&self) -> SageResult<f64> {
self.dispatch()
.call_method_by_name("AR_Coef", &[])?
.to_f64()
}
pub fn set_ar_coef(&self, value: f64) -> SageResult<()> {
let param = SafeVariant::R8(value);
self.dispatch().call_property_put("AR_Coef", &[param])?;
Ok(())
}
pub fn ar_prix_ttc(&self) -> SageResult<f64> {
self.dispatch()
.call_method_by_name("AR_PrixTTC", &[])?
.to_f64()
}
pub fn ar_gamme1(&self) -> SageResult<Option<Gamme>> {
let variant = self.dispatch().call_method_by_name("AR_Gamme1", &[])?;
if variant.is_empty_or_null() {
return Ok(None);
}
if variant.is_object() {
Ok(Some(Gamme {
dispatch: variant.to_dispatch()?,
}))
} else {
Err(SageError::ConversionError {
from_type: "VARIANT".to_string(),
to_type: "Gamme".to_string(),
value: "AR_Gamme1 n'est pas un objet".to_string(),
})
}
}
pub fn set_ar_gamme1(&self, gamme: &Gamme) -> SageResult<()> {
let param = SafeVariant::from_dispatch(gamme.dispatch.clone());
self.dispatch().call_property_put("AR_Gamme1", &[param])?;
Ok(())
}
pub fn ar_gamme2(&self) -> SageResult<Option<Gamme>> {
let variant = self.dispatch().call_method_by_name("AR_Gamme2", &[])?;
if variant.is_empty_or_null() {
return Ok(None);
}
if variant.is_object() {
Ok(Some(Gamme {
dispatch: variant.to_dispatch()?,
}))
} else {
Err(SageError::ConversionError {
from_type: "VARIANT".to_string(),
to_type: "Gamme".to_string(),
value: "AR_Gamme2 n'est pas un objet".to_string(),
})
}
}
pub fn set_ar_gamme2(&self, gamme: &Gamme) -> SageResult<()> {
let param = SafeVariant::from_dispatch(gamme.dispatch.clone());
self.dispatch().call_property_put("AR_Gamme2", &[param])?;
Ok(())
}
pub fn ar_suivi_stock(&self) -> SageResult<bool> {
self.dispatch()
.call_method_by_name("AR_SuiviStock", &[])?
.to_bool()
}
pub fn set_ar_suivi_stock(&self, value: bool) -> SageResult<()> {
let param = SafeVariant::Bool(value);
self.dispatch()
.call_property_put("AR_SuiviStock", &[param])?;
Ok(())
}
pub fn ar_sommeil(&self) -> SageResult<bool> {
self.dispatch()
.call_method_by_name("AR_Sommeil", &[])?
.to_bool()
}
pub fn set_ar_sommeil(&self, value: bool) -> SageResult<()> {
let param = SafeVariant::Bool(value);
self.dispatch().call_property_put("AR_Sommeil", &[param])?;
Ok(())
}
pub fn ar_stat01(&self) -> SageResult<String> {
self.dispatch()
.call_method_by_name("AR_Stat01", &[])?
.to_string()
}
pub fn set_ar_stat01(&self, value: &str) -> SageResult<()> {
let param = SafeVariant::from_string(value);
self.dispatch().call_property_put("AR_Stat01", &[param])?;
Ok(())
}
pub fn ar_categorie(&self) -> SageResult<String> {
self.dispatch()
.call_method_by_name("AR_Categorie", &[])?
.to_string()
}
pub fn set_ar_categorie(&self, value: &str) -> SageResult<()> {
let param = SafeVariant::from_string(value);
self.dispatch()
.call_property_put("AR_Categorie", &[param])?;
Ok(())
}
pub fn ar_compte_cpt_g(&self) -> SageResult<Option<CompteG>> {
let variant = self.dispatch().call_method_by_name("AR_CompteCPT_G", &[])?;
if variant.is_empty_or_null() {
return Ok(None);
}
if variant.is_object() {
Ok(Some(CompteG {
dispatch: variant.to_dispatch()?,
}))
} else {
Err(SageError::ConversionError {
from_type: "VARIANT".to_string(),
to_type: "CompteG".to_string(),
value: "AR_CompteCPT_G n'est pas un objet".to_string(),
})
}
}
pub fn set_ar_compte_cpt_g(&self, compte: &CompteG) -> SageResult<()> {
let param = SafeVariant::from_dispatch(compte.dispatch.clone());
self.dispatch()
.call_property_put("AR_CompteCPT_G", &[param])?;
Ok(())
}
pub fn ar_compte_cpt_a(&self) -> SageResult<Option<CompteG>> {
let variant = self.dispatch().call_method_by_name("AR_CompteCPT_A", &[])?;
if variant.is_empty_or_null() {
return Ok(None);
}
if variant.is_object() {
Ok(Some(CompteG {
dispatch: variant.to_dispatch()?,
}))
} else {
Err(SageError::ConversionError {
from_type: "VARIANT".to_string(),
to_type: "CompteG".to_string(),
value: "AR_CompteCPT_A n'est pas un objet".to_string(),
})
}
}
pub fn set_ar_compte_cpt_a(&self, compte: &CompteG) -> SageResult<()> {
let param = SafeVariant::from_dispatch(compte.dispatch.clone());
self.dispatch()
.call_property_put("AR_CompteCPT_A", &[param])?;
Ok(())
}
pub fn ar_compte_cpt_s(&self) -> SageResult<Option<CompteG>> {
let variant = self.dispatch().call_method_by_name("AR_CompteCPT_S", &[])?;
if variant.is_empty_or_null() {
return Ok(None);
}
if variant.is_object() {
Ok(Some(CompteG {
dispatch: variant.to_dispatch()?,
}))
} else {
Err(SageError::ConversionError {
from_type: "VARIANT".to_string(),
to_type: "CompteG".to_string(),
value: "AR_CompteCPT_S n'est pas un objet".to_string(),
})
}
}
pub fn set_ar_compte_cpt_s(&self, compte: &CompteG) -> SageResult<()> {
let param = SafeVariant::from_dispatch(compte.dispatch.clone());
self.dispatch()
.call_property_put("AR_CompteCPT_S", &[param])?;
Ok(())
}
pub fn ar_compte_tva(&self) -> SageResult<Option<Taxe>> {
let variant = self.dispatch().call_method_by_name("AR_CompteTVA", &[])?;
if variant.is_empty_or_null() {
return Ok(None);
}
if variant.is_object() {
Ok(Some(Taxe {
dispatch: variant.to_dispatch()?,
}))
} else {
Err(SageError::ConversionError {
from_type: "VARIANT".to_string(),
to_type: "Taxe".to_string(),
value: "AR_CompteTVA n'est pas un objet".to_string(),
})
}
}
pub fn set_ar_compte_tva(&self, taxe: &Taxe) -> SageResult<()> {
let param = SafeVariant::from_dispatch(taxe.dispatch.clone());
self.dispatch()
.call_property_put("AR_CompteTVA", &[param])?;
Ok(())
}
pub fn ar_qte_sto(&self) -> SageResult<f64> {
self.dispatch()
.call_method_by_name("AR_QteSto", &[])?
.to_f64()
}
pub fn ar_qte_res(&self) -> SageResult<f64> {
self.dispatch()
.call_method_by_name("AR_QteRes", &[])?
.to_f64()
}
pub fn ar_qte_cde(&self) -> SageResult<f64> {
self.dispatch()
.call_method_by_name("AR_QteCde", &[])?
.to_f64()
}
pub fn ar_qte_min(&self) -> SageResult<f64> {
self.dispatch()
.call_method_by_name("AR_QteMin", &[])?
.to_f64()
}
pub fn set_ar_qte_min(&self, value: f64) -> SageResult<()> {
let param = SafeVariant::R8(value);
self.dispatch().call_property_put("AR_QteMin", &[param])?;
Ok(())
}
pub fn ar_qte_max(&self) -> SageResult<f64> {
self.dispatch()
.call_method_by_name("AR_QteMax", &[])?
.to_f64()
}
pub fn set_ar_qte_max(&self, value: f64) -> SageResult<()> {
let param = SafeVariant::R8(value);
self.dispatch().call_property_put("AR_QteMax", &[param])?;
Ok(())
}
pub fn ar_qte_reap(&self) -> SageResult<f64> {
self.dispatch()
.call_method_by_name("AR_QteReap", &[])?
.to_f64()
}
pub fn set_ar_qte_reap(&self, value: f64) -> SageResult<()> {
let param = SafeVariant::R8(value);
self.dispatch().call_property_put("AR_QteReap", &[param])?;
Ok(())
}
pub fn ar_depot(&self) -> SageResult<Option<Depot>> {
let variant = self.dispatch().call_method_by_name("AR_Depot", &[])?;
if variant.is_empty_or_null() {
return Ok(None);
}
if variant.is_object() {
Ok(Some(Depot {
dispatch: variant.to_dispatch()?,
}))
} else {
Err(SageError::ConversionError {
from_type: "VARIANT".to_string(),
to_type: "Depot".to_string(),
value: "AR_Depot n'est pas un objet".to_string(),
})
}
}
pub fn set_ar_depot(&self, depot: &Depot) -> SageResult<()> {
let param = SafeVariant::from_dispatch(depot.dispatch.clone());
self.dispatch().call_property_put("AR_Depot", &[param])?;
Ok(())
}
pub fn ar_dernier_pa(&self) -> SageResult<f64> {
self.dispatch()
.call_method_by_name("AR_DernierPA", &[])?
.to_f64()
}
pub fn calculate_prix_ttc(&self) -> SageResult<f64> {
self.ar_prix_ttc()
}
pub fn calculate_prix_ht(&self) -> SageResult<f64> {
self.ar_prix_ven()
}
pub fn get_stock_disponible(&self) -> SageResult<f64> {
let qte_sto = self.ar_qte_sto()?;
let qte_res = self.ar_qte_res()?;
Ok(qte_sto - qte_res)
}
pub fn need_reappro(&self) -> SageResult<bool> {
let dispo = self.get_stock_disponible()?;
let min = self.ar_qte_min()?;
Ok(dispo < min)
}
pub fn set_default_article(&self) -> SageResult<()> {
self.dispatch().call_method_by_name("SetDefault", &[])?;
Ok(())
}
pub fn write(&self) -> SageResult<()> {
self.dispatch().call_method_by_name("Write", &[])?;
Ok(())
}
pub fn write_default(&self) -> SageResult<()> {
self.dispatch().call_method_by_name("WriteDefault", &[])?;
Ok(())
}
pub fn remove(&self) -> SageResult<()> {
self.dispatch().call_method_by_name("Remove", &[])?;
Ok(())
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_article_creation_needs_factory() {
}
#[test]
fn test_article_has_enriched_properties() {
}
}