@@ -14,6 +14,7 @@ use tap_msg::message::tap_message_trait::TapMessageBody;
1414use tap_msg:: message:: {
1515 Agent , Authorize , Cancel , Complete , Party , Reject , Revert , Settle , Transfer ,
1616} ;
17+ use tap_node:: storage:: models:: SchemaType ;
1718use tracing:: { debug, error} ;
1819
1920/// Tool for creating transfer transactions
@@ -123,44 +124,66 @@ impl ToolHandler for CreateTransferTool {
123124 if let Some ( _profile) = customer. profile . as_object ( ) {
124125 let mut metadata = HashMap :: new ( ) ;
125126
126- // Add name information if available
127- if let Some ( given_name) = customer. given_name {
128- metadata. insert (
129- "givenName" . to_string ( ) ,
130- serde_json:: Value :: String ( given_name) ,
131- ) ;
132- }
133- if let Some ( family_name) = customer. family_name {
134- metadata. insert (
135- "familyName" . to_string ( ) ,
136- serde_json:: Value :: String ( family_name) ,
137- ) ;
138- }
139- if let Some ( display_name) = customer. display_name {
140- metadata. insert ( "name" . to_string ( ) , serde_json:: Value :: String ( display_name) ) ;
141- }
127+ match customer. schema_type {
128+ SchemaType :: Person => {
129+ // For natural persons, use name hash instead of PII
130+ let full_name = match ( & customer. given_name , & customer. family_name ) {
131+ ( Some ( given) , Some ( family) ) => format ! ( "{} {}" , given, family) ,
132+ ( Some ( given) , None ) => given. clone ( ) ,
133+ ( None , Some ( family) ) => family. clone ( ) ,
134+ ( None , None ) => customer. display_name . clone ( ) . unwrap_or_default ( ) ,
135+ } ;
136+
137+ if !full_name. is_empty ( ) {
138+ // Add name hash according to TAIP-12
139+ originator = originator. with_name_hash ( & full_name) ;
140+ }
142141
143- // Add address information if available
144- if let Some ( country) = customer. address_country {
145- metadata. insert (
146- "addressCountry" . to_string ( ) ,
147- serde_json:: Value :: String ( country) ,
148- ) ;
149- }
150- if let Some ( locality) = customer. address_locality {
151- metadata. insert (
152- "addressLocality" . to_string ( ) ,
153- serde_json:: Value :: String ( locality) ,
154- ) ;
155- }
156- if let Some ( postal_code) = customer. postal_code {
157- metadata. insert (
158- "postalCode" . to_string ( ) ,
159- serde_json:: Value :: String ( postal_code) ,
160- ) ;
142+ // Add address information if available (still needed for compliance)
143+ if let Some ( country) = customer. address_country {
144+ metadata. insert (
145+ "addressCountry" . to_string ( ) ,
146+ serde_json:: Value :: String ( country) ,
147+ ) ;
148+ }
149+ }
150+ SchemaType :: Organization => {
151+ // For organizations, include LEI code if available
152+ if let Some ( lei_code) = customer. lei_code {
153+ originator = originator. with_lei ( & lei_code) ;
154+ }
155+
156+ // Add legal name for organizations
157+ if let Some ( legal_name) = customer. legal_name {
158+ metadata. insert (
159+ "legalName" . to_string ( ) ,
160+ serde_json:: Value :: String ( legal_name) ,
161+ ) ;
162+ }
163+
164+ // Add address information if available
165+ if let Some ( country) = customer. address_country {
166+ metadata. insert (
167+ "addressCountry" . to_string ( ) ,
168+ serde_json:: Value :: String ( country) ,
169+ ) ;
170+ }
171+ }
172+ SchemaType :: Thing => {
173+ // For other entity types, include minimal metadata
174+ if let Some ( display_name) = customer. display_name {
175+ metadata. insert (
176+ "name" . to_string ( ) ,
177+ serde_json:: Value :: String ( display_name) ,
178+ ) ;
179+ }
180+ }
161181 }
162182
163- originator = Party :: with_metadata ( & originator. id , metadata) ;
183+ // Apply any additional metadata
184+ if !metadata. is_empty ( ) {
185+ originator = Party :: with_metadata ( & originator. id , metadata) ;
186+ }
164187 }
165188 }
166189 // Also merge any provided metadata
@@ -180,44 +203,66 @@ impl ToolHandler for CreateTransferTool {
180203 if let Some ( _profile) = customer. profile . as_object ( ) {
181204 let mut metadata = HashMap :: new ( ) ;
182205
183- // Add name information if available
184- if let Some ( given_name) = customer. given_name {
185- metadata. insert (
186- "givenName" . to_string ( ) ,
187- serde_json:: Value :: String ( given_name) ,
188- ) ;
189- }
190- if let Some ( family_name) = customer. family_name {
191- metadata. insert (
192- "familyName" . to_string ( ) ,
193- serde_json:: Value :: String ( family_name) ,
194- ) ;
195- }
196- if let Some ( display_name) = customer. display_name {
197- metadata. insert ( "name" . to_string ( ) , serde_json:: Value :: String ( display_name) ) ;
198- }
206+ match customer. schema_type {
207+ SchemaType :: Person => {
208+ // For natural persons, use name hash instead of PII
209+ let full_name = match ( & customer. given_name , & customer. family_name ) {
210+ ( Some ( given) , Some ( family) ) => format ! ( "{} {}" , given, family) ,
211+ ( Some ( given) , None ) => given. clone ( ) ,
212+ ( None , Some ( family) ) => family. clone ( ) ,
213+ ( None , None ) => customer. display_name . clone ( ) . unwrap_or_default ( ) ,
214+ } ;
215+
216+ if !full_name. is_empty ( ) {
217+ // Add name hash according to TAIP-12
218+ beneficiary = beneficiary. with_name_hash ( & full_name) ;
219+ }
199220
200- // Add address information if available
201- if let Some ( country) = customer. address_country {
202- metadata. insert (
203- "addressCountry" . to_string ( ) ,
204- serde_json:: Value :: String ( country) ,
205- ) ;
206- }
207- if let Some ( locality) = customer. address_locality {
208- metadata. insert (
209- "addressLocality" . to_string ( ) ,
210- serde_json:: Value :: String ( locality) ,
211- ) ;
212- }
213- if let Some ( postal_code) = customer. postal_code {
214- metadata. insert (
215- "postalCode" . to_string ( ) ,
216- serde_json:: Value :: String ( postal_code) ,
217- ) ;
221+ // Add address information if available (still needed for compliance)
222+ if let Some ( country) = customer. address_country {
223+ metadata. insert (
224+ "addressCountry" . to_string ( ) ,
225+ serde_json:: Value :: String ( country) ,
226+ ) ;
227+ }
228+ }
229+ SchemaType :: Organization => {
230+ // For organizations, include LEI code if available
231+ if let Some ( lei_code) = customer. lei_code {
232+ beneficiary = beneficiary. with_lei ( & lei_code) ;
233+ }
234+
235+ // Add legal name for organizations
236+ if let Some ( legal_name) = customer. legal_name {
237+ metadata. insert (
238+ "legalName" . to_string ( ) ,
239+ serde_json:: Value :: String ( legal_name) ,
240+ ) ;
241+ }
242+
243+ // Add address information if available
244+ if let Some ( country) = customer. address_country {
245+ metadata. insert (
246+ "addressCountry" . to_string ( ) ,
247+ serde_json:: Value :: String ( country) ,
248+ ) ;
249+ }
250+ }
251+ SchemaType :: Thing => {
252+ // For other entity types, include minimal metadata
253+ if let Some ( display_name) = customer. display_name {
254+ metadata. insert (
255+ "name" . to_string ( ) ,
256+ serde_json:: Value :: String ( display_name) ,
257+ ) ;
258+ }
259+ }
218260 }
219261
220- beneficiary = Party :: with_metadata ( & beneficiary. id , metadata) ;
262+ // Apply any additional metadata
263+ if !metadata. is_empty ( ) {
264+ beneficiary = Party :: with_metadata ( & beneficiary. id , metadata) ;
265+ }
221266 }
222267 }
223268 // Also merge any provided metadata
0 commit comments