1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
use crate::com::FromDispatchNew;
use crate::errors::SageResult;
use crate::wrappers::cpta::objects::Tiers;
use std::ops::Deref;
use windows::Win32::System::Com::IDispatch;
/// Client - Spécialisation de Tiers avec CT_Type = 0
///
/// Un client est un tiers de type 0 dans Sage 100c.
/// Cette structure encapsule un objet Tiers et expose toutes ses méthodes
/// via le trait Deref, tout en permettant d'ajouter des méthodes spécifiques aux clients.
#[derive(Debug)]
pub struct Client {
tiers: Tiers,
}
impl Client {
/// Crée un Client à partir d'un Tiers existant
///
/// # Arguments
/// * `tiers` - L'objet Tiers sous-jacent
///
/// # Note
/// Cette fonction ne vérifie pas que le tiers est bien de type Client (CT_Type = 0).
/// Il est de la responsabilité de l'appelant de s'assurer de la cohérence.
pub fn from_tiers(tiers: Tiers) -> Self {
Self { tiers }
}
/// Accède au Tiers sous-jacent (consomme le Client)
pub fn into_tiers(self) -> Tiers {
self.tiers
}
/// Référence immutable au Tiers sous-jacent
pub fn as_tiers(&self) -> &Tiers {
&self.tiers
}
/// Référence mutable au Tiers sous-jacent
pub fn as_tiers_mut(&mut self) -> &mut Tiers {
&mut self.tiers
}
/// Méthode utilitaire spécifique aux clients
/// Retourne une description formatée du client
pub fn description(&self) -> SageResult<String> {
let numero = self.tiers.ct_num()?;
let intitule = self.tiers.ct_intitule()?;
Ok(format!("Client {} - {}", numero, intitule))
}
/// Vérifie que le tiers est bien de type Client (CT_Type = 0)
pub fn verify_type(&self) -> SageResult<bool> {
let type_tiers = self.tiers.ct_type()?;
Ok(type_tiers == 0)
}
}
// Implémentation de Deref pour accéder directement aux méthodes de Tiers
// Cela permet d'écrire : client.ct_num() au lieu de client.tiers.ct_num()
impl Deref for Client {
type Target = Tiers;
fn deref(&self) -> &Self::Target {
&self.tiers
}
}
// Implémentation de Clone
impl Clone for Client {
fn clone(&self) -> Self {
Self {
tiers: self.tiers.clone(),
}
}
}
// Implémentation de PartialEq basée sur le numéro de tiers
impl PartialEq for Client {
fn eq(&self, other: &Self) -> bool {
self.tiers == other.tiers
}
}
impl FromDispatchNew for Client {
fn from_dispatch_new(dispatch: IDispatch) -> SageResult<Self> {
Ok(Self::from_tiers(Tiers { dispatch }))
}
}
#[cfg(test)]
mod tests {
#[test]
fn test_client_documentation() {
// Test de documentation - nécessite un environnement Sage pour s'exécuter
// Utilisation typique :
// let factory = app.factory_client()?;
// let client = factory.read_by_code("BAGUES")?;
//
// // Accès direct aux méthodes Tiers via Deref
// let numero = client.ct_num()?;
// let intitule = client.ct_intitule()?;
// let solde = client.ct_solde()?;
//
// // Méthode spécifique Client
// let description = client.description()?;
// assert_eq!(description, format!("Client {} - {}", numero, intitule));
}
}