use objets_metier_rs::errors::SageResult;
use objets_metier_rs::wrappers::cial::CialApplication;
const BSCIAL_CLSID: &str = "ED0EC116-16B8-44CC-A68A-41BF6E15EB3F";
fn main() -> SageResult<()> {
println!("╔════════════════════════════════════════════════════════════╗");
println!("║ Démonstration Article Enrichi - Phase 6 ║");
println!("╚════════════════════════════════════════════════════════════╝\n");
let database =
std::env::var("SAGE_DATABASE").unwrap_or_else(|_| "D:\\TMP\\BIJOU.MAE".to_string());
let username =
std::env::var("SAGE_USERNAME").unwrap_or_else(|_| "<Administrateur>".to_string());
let password = std::env::var("SAGE_PASSWORD").unwrap_or_else(|_| "".to_string());
println!("📂 Base de données : {}", database);
println!("👤 Utilisateur : {}\n", username);
println!("🔌 Connexion à Sage 100c Commercial...");
let cial = CialApplication::new(BSCIAL_CLSID)?;
cial.set_name(&database)?;
let loggable = cial.loggable()?;
loggable.set_user_name(&username)?;
loggable.set_user_pwd(&password)?;
cial.open()?;
println!("✅ Connexion réussie !\n");
println!("═══════════════════════════════════════════════════════════");
println!("1️⃣ Lecture d'un article existant");
println!("═══════════════════════════════════════════════════════════");
let factory = cial.factory_article()?;
let test_refs = vec!["BAAR01", "ART001", "TEST"];
let mut article_found = None;
for ref_art in test_refs {
match factory.read_reference(ref_art) {
Ok(article) => {
article_found = Some(article);
println!("✓ Article trouvé: {}", ref_art);
break;
}
Err(_) => {
println!("ℹ️ Article '{}' non trouvé", ref_art);
}
}
}
if let Some(article) = article_found {
println!("\n📦 PROPRIÉTÉS PRINCIPALES:");
println!(" • Référence : {}", article.ar_ref()?);
println!(" • Désignation : {}", article.ar_design()?);
println!("\n📋 PROPRIÉTÉS ESSENTIELLES:");
if let Ok(code_barre) = article.ar_code_barre() {
println!(" • Code-barres : {}", code_barre);
}
if let Ok(unite_ven) = article.ar_unite_ven() {
println!(" • Unité vente : {}", unite_ven);
}
if let Ok(unite_pri) = article.ar_unite_pri() {
println!(" • Unité prix : {}", unite_pri);
}
if let Ok(condition) = article.ar_condition() {
println!(" • Conditionnement: {}", condition);
}
println!("\n💰 PROPRIÉTÉS DE PRIX:");
if let Ok(prix_ven) = article.ar_prix_ven() {
println!(" • Prix vente HT : {:.2} €", prix_ven);
}
if let Ok(prix_ach) = article.ar_prix_ach() {
println!(" • Prix achat HT : {:.2} €", prix_ach);
}
if let Ok(coef) = article.ar_coef() {
println!(" • Coefficient : {:.2}", coef);
}
if let Ok(prix_ttc) = article.ar_prix_ttc() {
println!(" • Prix vente TTC : {:.2} €", prix_ttc);
}
println!("\n🎨 GAMMES:");
match article.ar_gamme1() {
Ok(Some(gamme)) => {
if let Ok(intitule) = gamme.intitule() {
println!(" • Gamme 1 : {}", intitule);
}
}
Ok(None) => println!(" • Gamme 1 : (aucune)"),
Err(_) => println!(" • Gamme 1 : Erreur lecture"),
}
match article.ar_gamme2() {
Ok(Some(gamme)) => {
if let Ok(intitule) = gamme.intitule() {
println!(" • Gamme 2 : {}", intitule);
}
}
Ok(None) => println!(" • Gamme 2 : (aucune)"),
Err(_) => println!(" • Gamme 2 : Erreur lecture"),
}
println!("\n⚙️ GESTION:");
if let Ok(suivi_stock) = article.ar_suivi_stock() {
println!(
" • Suivi stock : {}",
if suivi_stock { "OUI" } else { "NON" }
);
}
if let Ok(sommeil) = article.ar_sommeil() {
println!(
" • En sommeil : {}",
if sommeil { "OUI" } else { "NON" }
);
}
if let Ok(stat01) = article.ar_stat01() {
println!(" • Statistique 1 : {}", stat01);
}
println!("\n📊 COMPTABILITÉ:");
if let Ok(categorie) = article.ar_categorie() {
println!(" • Catégorie : {}", categorie);
}
match article.ar_compte_cpt_g() {
Ok(Some(compte)) => {
if let Ok(numero) = compte.cg_num() {
println!(" • Compte vente : {}", numero);
}
}
Ok(None) => println!(" • Compte vente : (aucun)"),
Err(_) => println!(" • Compte vente : Erreur lecture"),
}
println!("\n📦 STOCK:");
if let Ok(qte_sto) = article.ar_qte_sto() {
println!(" • Qté en stock : {:.2}", qte_sto);
}
if let Ok(qte_res) = article.ar_qte_res() {
println!(" • Qté réservée : {:.2}", qte_res);
}
if let Ok(qte_cde) = article.ar_qte_cde() {
println!(" • Qté en commande: {:.2}", qte_cde);
}
if let Ok(qte_min) = article.ar_qte_min() {
println!(" • Stock minimum : {:.2}", qte_min);
}
if let Ok(qte_max) = article.ar_qte_max() {
println!(" • Stock maximum : {:.2}", qte_max);
}
println!("\n🧮 MÉTHODES DE CALCUL:");
if let Ok(dispo) = article.get_stock_disponible() {
println!(" • Stock disponible: {:.2}", dispo);
}
if let Ok(need_reappro) = article.need_reappro() {
println!(
" • Besoin réappro : {}",
if need_reappro {
"⚠️ OUI"
} else {
"✓ NON"
}
);
}
if let Ok(prix_ttc) = article.calculate_prix_ttc() {
println!(" • Prix TTC calculé: {:.2} €", prix_ttc);
}
} else {
println!("\n⚠️ Aucun article trouvé dans la base");
println!("ℹ️ Créez des articles ou adaptez les références dans le code");
}
println!("\n═══════════════════════════════════════════════════════════");
println!("2️⃣ Résumé des capacités enrichies");
println!("═══════════════════════════════════════════════════════════");
println!("\n✅ OBJET ARTICLE ENRICHI - Phase 6:");
println!(" 📊 28 propriétés (getters)");
println!(" • 3 principales (ref, design, cbmarq)");
println!(" • 6 essentielles (code-barres, famille, unités, conditionnement)");
println!(" • 4 prix (vente HT, achat HT, coefficient, TTC)");
println!(" • 2 gammes (gamme1, gamme2)");
println!(" • 3 gestion (suivi stock, sommeil, stat01)");
println!(" • 5 comptables (catégorie, comptes vente/achat/stock, TVA)");
println!(" • 8 stock (qté stock/réservée/commande, min/max/réappro, dépôt, dernier PA)");
println!("\n ✏️ 14 setters");
println!(" • Modification de toutes les propriétés modifiables");
println!("\n 🧮 7 méthodes");
println!(" • calculate_prix_ttc() - Calcul prix TTC");
println!(" • calculate_prix_ht() - Calcul prix HT");
println!(" • get_stock_disponible() - Stock disponible (stock - réservé)");
println!(" • need_reappro() - Besoin de réapprovisionnement");
println!(" • set_default_article() - Initialisation valeurs par défaut");
println!(" • write() - Enregistrement");
println!(" • write_default() - Enregistrement avec initialisation");
println!("\n📈 PROGRESSION:");
println!(" AVANT (Phase 1): 3 getters, 2 setters, 2 méthodes");
println!(" APRÈS (Phase 6): 28 getters, 14 setters, 7 méthodes");
println!(" GAIN: +25 getters (+833%), +12 setters (+600%), +5 méthodes (+250%)");
println!("\n🎯 COMPARAISON AVEC CPTA:");
println!(" EcritureG (CPTA): 38 getters, 15 setters, 8 méthodes");
println!(" Article (CIAL) : 28 getters, 14 setters, 7 méthodes");
println!(" Ratio : 74% (niveau de complétude similaire ✅)");
cial.close()?;
println!("\n👋 Déconnexion réussie");
Ok(())
}