iso_20022_tsrv/
tsrv_011_001_01.rs

1// Copyright 2023 Emergent Financial, LLC - All Rights Reserved
2//
3//
4// This software is licensed under the Emergent Financial Limited Public License Version 1.0
5// (EF-LPLv1). You may use, copy, modify, and distribute this software under the terms and
6// conditions of the EF-LPL. For more information, please refer to the full text of the license
7// at https://github.com/emergentfinancial/ef-lpl.
8//
9//
10// THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS
11// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
12// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
13// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
14// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
15// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
16//
17// See ISO-20022 Intellectual Property Rights Policy at
18// <https://www.iso20022.org/intellectual-property-rights>
19// for more information.
20
21use validator::Validate;
22
23::lazy_static::lazy_static! {
24    static ref COUNTRY_CODE_REGEX: ::regex::Regex = ::regex::Regex::new(r#"[A-Z]{2,2}"#).unwrap();
25}
26
27::lazy_static::lazy_static! {
28    static ref ANY_BIC_IDENTIFIER_REGEX: ::regex::Regex = ::regex::Regex::new(r#"[A-Z]{6,6}[A-Z2-9][A-NP-Z0-9]([A-Z0-9]{3,3}){0,1}"#).unwrap();
29}
30
31::lazy_static::lazy_static! {
32    static ref PHONE_NUMBER_REGEX: ::regex::Regex = ::regex::Regex::new(r#"\+[0-9]{1,3}-[0-9()+\-]{1,30}"#).unwrap();
33}
34
35/// Returns the namespace of the schema
36pub fn namespace() -> String {
37    "urn:iso:std:iso:20022:tech:xsd:tsrv.011.001.01".to_string()
38}
39
40#[derive(
41    Debug,
42    Default,
43    Clone,
44    PartialEq,
45    ::serde::Serialize,
46    ::serde::Deserialize,
47    ::derive_builder::Builder,
48    ::validator::Validate,
49)]
50pub struct ProprietaryData3<
51    A: std::fmt::Debug + Default + Clone + PartialEq + ::serde::Serialize + ::validator::Validate,
52> {
53    #[validate]
54    #[serde(flatten)]
55    pub value: A,
56}
57#[derive(
58    Debug,
59    Default,
60    Clone,
61    PartialEq,
62    ::serde::Serialize,
63    ::serde::Deserialize,
64    ::derive_builder::Builder,
65    ::validator::Validate,
66)]
67pub struct PartyIdentification43 {
68    #[serde(rename = "Nm", skip_serializing_if = "Option::is_none")]
69    pub nm: Option<Max140Text>,
70    #[serde(rename = "PstlAdr", skip_serializing_if = "Option::is_none")]
71    pub pstl_adr: Option<PostalAddress6>,
72    #[serde(rename = "Id", skip_serializing_if = "Option::is_none")]
73    pub id: Option<Party11Choice>,
74    #[serde(rename = "CtryOfRes", skip_serializing_if = "Option::is_none")]
75    pub ctry_of_res: Option<CountryCode>,
76    #[serde(rename = "CtctDtls", skip_serializing_if = "Option::is_none")]
77    pub ctct_dtls: Option<ContactDetails2>,
78}
79#[derive(
80    Debug,
81    Default,
82    Clone,
83    PartialEq,
84    ::serde::Serialize,
85    ::serde::Deserialize,
86    ::derive_builder::Builder,
87    ::validator::Validate,
88)]
89pub struct OrganisationIdentificationSchemeName1ChoiceEnum {
90    #[serde(rename = "Prtry", skip_serializing_if = "Option::is_none")]
91    pub prtry: Option<Max35Text>,
92    #[serde(rename = "Cd", skip_serializing_if = "Option::is_none")]
93    pub cd: Option<ExternalOrganisationIdentification1Code>,
94}
95#[derive(
96    Debug,
97    Default,
98    Clone,
99    PartialEq,
100    ::serde::Serialize,
101    ::serde::Deserialize,
102    ::derive_builder::Builder,
103    ::validator::Validate,
104)]
105pub struct OrganisationIdentificationSchemeName1Choice {
106    #[serde(flatten)]
107    pub value: OrganisationIdentificationSchemeName1ChoiceEnum,
108}
109#[derive(
110    Debug,
111    Default,
112    Clone,
113    PartialEq,
114    ::serde::Serialize,
115    ::serde::Deserialize,
116    ::derive_builder::Builder,
117    ::validator::Validate,
118)]
119pub struct UndertakingNonExtensionStatusAdvice1 {
120    #[validate]
121    #[serde(rename = "NtifngPty")]
122    pub ntifng_pty: PartyIdentification43,
123    #[validate]
124    #[serde(rename = "UdrtkgId")]
125    pub udrtkg_id: Undertaking7,
126}
127#[derive(
128    Debug,
129    Default,
130    Clone,
131    PartialEq,
132    ::serde::Serialize,
133    ::serde::Deserialize,
134    ::derive_builder::Builder,
135    ::validator::Validate,
136)]
137pub struct PersonIdentificationSchemeName1ChoiceEnum {
138    #[serde(rename = "Cd", skip_serializing_if = "Option::is_none")]
139    pub cd: Option<ExternalPersonIdentification1Code>,
140    #[serde(rename = "Prtry", skip_serializing_if = "Option::is_none")]
141    pub prtry: Option<Max35Text>,
142}
143#[derive(
144    Debug,
145    Default,
146    Clone,
147    PartialEq,
148    ::serde::Serialize,
149    ::serde::Deserialize,
150    ::derive_builder::Builder,
151    ::validator::Validate,
152)]
153pub struct PersonIdentificationSchemeName1Choice {
154    #[serde(flatten)]
155    pub value: PersonIdentificationSchemeName1ChoiceEnum,
156}
157#[derive(
158    Debug,
159    Default,
160    Clone,
161    PartialEq,
162    ::serde::Serialize,
163    ::serde::Deserialize,
164    ::derive_builder::Builder,
165    ::validator::Validate,
166)]
167pub struct CountryCode {
168    #[validate(regex = "COUNTRY_CODE_REGEX")]
169    #[serde(rename = "$text")]
170    pub value: String,
171}
172#[derive(
173    Debug,
174    Default,
175    Clone,
176    PartialEq,
177    ::serde::Serialize,
178    ::serde::Deserialize,
179    ::derive_builder::Builder,
180    ::validator::Validate,
181)]
182pub struct AnyBicIdentifier {
183    #[validate(regex = "ANY_BIC_IDENTIFIER_REGEX")]
184    #[serde(rename = "$text")]
185    pub value: String,
186}
187#[derive(
188    Debug,
189    Default,
190    Clone,
191    PartialEq,
192    ::serde::Serialize,
193    ::serde::Deserialize,
194    ::derive_builder::Builder,
195    ::validator::Validate,
196)]
197pub struct Max35Text {
198    #[validate(length(min = 1, max = 35,))]
199    #[serde(rename = "$text")]
200    pub value: String,
201}
202#[derive(
203    Debug,
204    Default,
205    Clone,
206    PartialEq,
207    ::serde::Serialize,
208    ::serde::Deserialize,
209    ::derive_builder::Builder,
210    ::validator::Validate,
211)]
212pub struct PartyAndSignature2<
213    A: std::fmt::Debug + Default + Clone + PartialEq + ::serde::Serialize + ::validator::Validate,
214> {
215    #[validate]
216    #[serde(rename = "Pty")]
217    pub pty: PartyIdentification43,
218    #[validate]
219    #[serde(rename = "Sgntr")]
220    pub sgntr: ProprietaryData3<A>,
221}
222#[derive(
223    Debug,
224    Default,
225    Clone,
226    PartialEq,
227    ::serde::Serialize,
228    ::serde::Deserialize,
229    ::derive_builder::Builder,
230    ::validator::Validate,
231)]
232pub struct PersonIdentification5 {
233    #[serde(rename = "DtAndPlcOfBirth", skip_serializing_if = "Option::is_none")]
234    pub dt_and_plc_of_birth: Option<DateAndPlaceOfBirth>,
235    #[validate(length(min = 0,))]
236    #[serde(rename = "Othr", default)]
237    pub othr: Vec<GenericPersonIdentification1>,
238}
239#[derive(
240    Debug,
241    Default,
242    Clone,
243    PartialEq,
244    ::serde::Serialize,
245    ::serde::Deserialize,
246    ::derive_builder::Builder,
247    ::validator::Validate,
248)]
249pub struct ExternalOrganisationIdentification1Code {
250    #[validate(length(min = 1, max = 4,))]
251    #[serde(rename = "$text")]
252    pub value: String,
253}
254#[derive(
255    Debug,
256    Default,
257    Clone,
258    PartialEq,
259    ::serde::Serialize,
260    ::serde::Deserialize,
261    ::derive_builder::Builder,
262    ::validator::Validate,
263)]
264pub struct Max70Text {
265    #[validate(length(min = 1, max = 70,))]
266    #[serde(rename = "$text")]
267    pub value: String,
268}
269#[derive(
270    Debug,
271    Default,
272    Clone,
273    PartialEq,
274    ::serde::Serialize,
275    ::serde::Deserialize,
276    ::derive_builder::Builder,
277    ::validator::Validate,
278)]
279pub struct Max2048Text {
280    #[validate(length(min = 1, max = 2048,))]
281    #[serde(rename = "$text")]
282    pub value: String,
283}
284#[derive(
285    Debug,
286    Default,
287    Clone,
288    PartialEq,
289    ::serde::Serialize,
290    ::serde::Deserialize,
291    ::derive_builder::Builder,
292    ::validator::Validate,
293)]
294#[serde(rename = "Document")]
295pub struct Document<
296    A: std::fmt::Debug + Default + Clone + PartialEq + ::serde::Serialize + ::validator::Validate,
297> {
298    #[validate]
299    #[serde(rename = "UdrtkgNonXtnsnNtfctn")]
300    pub udrtkg_non_xtnsn_ntfctn: UndertakingNonExtensionNotificationV01<A>,
301    #[serde(rename = "@xmlns", default = "namespace")]
302    pub xmlns: String,
303}
304#[derive(
305    Debug,
306    Default,
307    Clone,
308    PartialEq,
309    ::serde::Serialize,
310    ::serde::Deserialize,
311    ::derive_builder::Builder,
312    ::validator::Validate,
313)]
314pub struct IsoDate {
315    #[serde(rename = "$text")]
316    pub value: ::chrono::NaiveDate,
317}
318#[derive(
319    Debug,
320    Default,
321    Clone,
322    PartialEq,
323    ::serde::Serialize,
324    ::serde::Deserialize,
325    ::derive_builder::Builder,
326    ::validator::Validate,
327)]
328pub struct OrganisationIdentification8 {
329    #[serde(rename = "AnyBIC", skip_serializing_if = "Option::is_none")]
330    pub any_bic: Option<AnyBicIdentifier>,
331    #[validate(length(min = 0,))]
332    #[serde(rename = "Othr", default)]
333    pub othr: Vec<GenericOrganisationIdentification1>,
334}
335#[derive(
336    Debug,
337    Default,
338    Clone,
339    PartialEq,
340    ::serde::Serialize,
341    ::serde::Deserialize,
342    ::derive_builder::Builder,
343    ::validator::Validate,
344)]
345pub struct UndertakingNonExtensionNotificationV01<
346    A: std::fmt::Debug + Default + Clone + PartialEq + ::serde::Serialize + ::validator::Validate,
347> {
348    #[serde(rename = "UdrtkgNonXtnsnNtfctnDtls")]
349    pub udrtkg_non_xtnsn_ntfctn_dtls: UndertakingNonExtensionStatusAdvice1,
350    #[serde(rename = "DgtlSgntr", skip_serializing_if = "Option::is_none")]
351    pub dgtl_sgntr: Option<PartyAndSignature2<A>>,
352}
353#[derive(Debug, Default, Clone, PartialEq, ::serde::Serialize, ::serde::Deserialize)]
354pub enum AddressType2Code {
355    #[serde(rename = "ADDR")]
356    Addr,
357    #[serde(rename = "PBOX")]
358    Pbox,
359    #[serde(rename = "HOME")]
360    Home,
361    #[serde(rename = "BIZZ")]
362    Bizz,
363    #[serde(rename = "MLTO")]
364    Mlto,
365    #[serde(rename = "DLVY")]
366    Dlvy,
367    #[default]
368    Unknown,
369}
370#[derive(
371    Debug,
372    Default,
373    Clone,
374    PartialEq,
375    ::serde::Serialize,
376    ::serde::Deserialize,
377    ::derive_builder::Builder,
378    ::validator::Validate,
379)]
380pub struct Party11ChoiceEnum {
381    #[serde(rename = "OrgId", skip_serializing_if = "Option::is_none")]
382    pub org_id: Option<OrganisationIdentification8>,
383    #[serde(rename = "PrvtId", skip_serializing_if = "Option::is_none")]
384    pub prvt_id: Option<PersonIdentification5>,
385}
386#[derive(
387    Debug,
388    Default,
389    Clone,
390    PartialEq,
391    ::serde::Serialize,
392    ::serde::Deserialize,
393    ::derive_builder::Builder,
394    ::validator::Validate,
395)]
396pub struct Party11Choice {
397    #[serde(flatten)]
398    pub value: Party11ChoiceEnum,
399}
400#[derive(
401    Debug,
402    Default,
403    Clone,
404    PartialEq,
405    ::serde::Serialize,
406    ::serde::Deserialize,
407    ::derive_builder::Builder,
408    ::validator::Validate,
409)]
410pub struct ContactDetails2 {
411    #[serde(rename = "NmPrfx", skip_serializing_if = "Option::is_none")]
412    pub nm_prfx: Option<NamePrefix1Code>,
413    #[serde(rename = "Nm", skip_serializing_if = "Option::is_none")]
414    pub nm: Option<Max140Text>,
415    #[serde(rename = "PhneNb", skip_serializing_if = "Option::is_none")]
416    pub phne_nb: Option<PhoneNumber>,
417    #[serde(rename = "MobNb", skip_serializing_if = "Option::is_none")]
418    pub mob_nb: Option<PhoneNumber>,
419    #[serde(rename = "FaxNb", skip_serializing_if = "Option::is_none")]
420    pub fax_nb: Option<PhoneNumber>,
421    #[serde(rename = "EmailAdr", skip_serializing_if = "Option::is_none")]
422    pub email_adr: Option<Max2048Text>,
423    #[serde(rename = "Othr", skip_serializing_if = "Option::is_none")]
424    pub othr: Option<Max35Text>,
425}
426#[derive(
427    Debug,
428    Default,
429    Clone,
430    PartialEq,
431    ::serde::Serialize,
432    ::serde::Deserialize,
433    ::derive_builder::Builder,
434    ::validator::Validate,
435)]
436pub struct GenericPersonIdentification1 {
437    #[validate]
438    #[serde(rename = "Id")]
439    pub id: Max35Text,
440    #[serde(rename = "SchmeNm", skip_serializing_if = "Option::is_none")]
441    pub schme_nm: Option<PersonIdentificationSchemeName1Choice>,
442    #[serde(rename = "Issr", skip_serializing_if = "Option::is_none")]
443    pub issr: Option<Max35Text>,
444}
445#[derive(
446    Debug,
447    Default,
448    Clone,
449    PartialEq,
450    ::serde::Serialize,
451    ::serde::Deserialize,
452    ::derive_builder::Builder,
453    ::validator::Validate,
454)]
455pub struct PhoneNumber {
456    #[validate(regex = "PHONE_NUMBER_REGEX")]
457    #[serde(rename = "$text")]
458    pub value: String,
459}
460#[derive(
461    Debug,
462    Default,
463    Clone,
464    PartialEq,
465    ::serde::Serialize,
466    ::serde::Deserialize,
467    ::derive_builder::Builder,
468    ::validator::Validate,
469)]
470pub struct DateAndPlaceOfBirth {
471    #[validate]
472    #[serde(rename = "BirthDt")]
473    pub birth_dt: IsoDate,
474    #[serde(rename = "PrvcOfBirth", skip_serializing_if = "Option::is_none")]
475    pub prvc_of_birth: Option<Max35Text>,
476    #[validate]
477    #[serde(rename = "CityOfBirth")]
478    pub city_of_birth: Max35Text,
479    #[serde(rename = "CtryOfBirth")]
480    pub ctry_of_birth: CountryCode,
481}
482#[derive(
483    Debug,
484    Default,
485    Clone,
486    PartialEq,
487    ::serde::Serialize,
488    ::serde::Deserialize,
489    ::derive_builder::Builder,
490    ::validator::Validate,
491)]
492pub struct Max140Text {
493    #[validate(length(min = 1, max = 140,))]
494    #[serde(rename = "$text")]
495    pub value: String,
496}
497#[derive(
498    Debug,
499    Default,
500    Clone,
501    PartialEq,
502    ::serde::Serialize,
503    ::serde::Deserialize,
504    ::derive_builder::Builder,
505    ::validator::Validate,
506)]
507pub struct PostalAddress6 {
508    #[serde(rename = "AdrTp", skip_serializing_if = "Option::is_none")]
509    pub adr_tp: Option<AddressType2Code>,
510    #[serde(rename = "Dept", skip_serializing_if = "Option::is_none")]
511    pub dept: Option<Max70Text>,
512    #[serde(rename = "SubDept", skip_serializing_if = "Option::is_none")]
513    pub sub_dept: Option<Max70Text>,
514    #[serde(rename = "StrtNm", skip_serializing_if = "Option::is_none")]
515    pub strt_nm: Option<Max70Text>,
516    #[serde(rename = "BldgNb", skip_serializing_if = "Option::is_none")]
517    pub bldg_nb: Option<Max16Text>,
518    #[serde(rename = "PstCd", skip_serializing_if = "Option::is_none")]
519    pub pst_cd: Option<Max16Text>,
520    #[serde(rename = "TwnNm", skip_serializing_if = "Option::is_none")]
521    pub twn_nm: Option<Max35Text>,
522    #[serde(rename = "CtrySubDvsn", skip_serializing_if = "Option::is_none")]
523    pub ctry_sub_dvsn: Option<Max35Text>,
524    #[serde(rename = "Ctry", skip_serializing_if = "Option::is_none")]
525    pub ctry: Option<CountryCode>,
526    #[validate(length(min = 0, max = 7,))]
527    #[serde(rename = "AdrLine", default)]
528    pub adr_line: Vec<Max70Text>,
529}
530#[derive(
531    Debug,
532    Default,
533    Clone,
534    PartialEq,
535    ::serde::Serialize,
536    ::serde::Deserialize,
537    ::derive_builder::Builder,
538    ::validator::Validate,
539)]
540pub struct ExternalPersonIdentification1Code {
541    #[validate(length(min = 1, max = 4,))]
542    #[serde(rename = "$text")]
543    pub value: String,
544}
545#[derive(
546    Debug,
547    Default,
548    Clone,
549    PartialEq,
550    ::serde::Serialize,
551    ::serde::Deserialize,
552    ::derive_builder::Builder,
553    ::validator::Validate,
554)]
555pub struct GenericOrganisationIdentification1 {
556    #[validate]
557    #[serde(rename = "Id")]
558    pub id: Max35Text,
559    #[serde(rename = "SchmeNm", skip_serializing_if = "Option::is_none")]
560    pub schme_nm: Option<OrganisationIdentificationSchemeName1Choice>,
561    #[serde(rename = "Issr", skip_serializing_if = "Option::is_none")]
562    pub issr: Option<Max35Text>,
563}
564#[derive(
565    Debug,
566    Default,
567    Clone,
568    PartialEq,
569    ::serde::Serialize,
570    ::serde::Deserialize,
571    ::derive_builder::Builder,
572    ::validator::Validate,
573)]
574pub struct Undertaking7 {
575    #[validate]
576    #[serde(rename = "Id")]
577    pub id: Max35Text,
578    #[validate]
579    #[serde(rename = "Issr")]
580    pub issr: PartyIdentification43,
581}
582#[derive(
583    Debug,
584    Default,
585    Clone,
586    PartialEq,
587    ::serde::Serialize,
588    ::serde::Deserialize,
589    ::derive_builder::Builder,
590    ::validator::Validate,
591)]
592pub struct Max16Text {
593    #[validate(length(min = 1, max = 16,))]
594    #[serde(rename = "$text")]
595    pub value: String,
596}
597#[derive(Debug, Default, Clone, PartialEq, ::serde::Serialize, ::serde::Deserialize)]
598pub enum NamePrefix1Code {
599    #[serde(rename = "DOCT")]
600    Doct,
601    #[serde(rename = "MIST")]
602    Mist,
603    #[serde(rename = "MISS")]
604    Miss,
605    #[serde(rename = "MADM")]
606    Madm,
607    #[default]
608    Unknown,
609}