Patch level : 2.0 nopatch
Files correlati : Ricompilazione Demo : [ ] Commento : Aggiunto supporto per IBAN e BBAN git-svn-id: svn://10.65.10.50/trunk@11568 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
		
							parent
							
								
									2dc2bfdd1e
								
							
						
					
					
						commit
						25c64e75e0
					
				| @ -95,6 +95,8 @@ | ||||
| #define ORA_FUNC 22 0 | ||||
| #define SCONTO_FUNC 23 0 | ||||
| #define CHECK_FIRM_FUNC 24 0 | ||||
| #define CHECK_IBAN_FUNC 25 | ||||
| #define CHECK_BBAN_FUNC 26 | ||||
| 
 | ||||
| #define VALEXPR VALIDATE EXPR_FUNC  | ||||
| #define NUM_EXPR VALEXPR 0 | ||||
|  | ||||
| @ -1,6 +1,6 @@ | ||||
| #include <stdlib.h> | ||||
| #include <ctype.h> | ||||
| 
 | ||||
| #include <diction.h> | ||||
| #include <expr.h> | ||||
| #include <isam.h> | ||||
| #include <mask.h> | ||||
| @ -444,20 +444,17 @@ HIDDEN bool _xt_cf_val(TMask_field& f, KEY key) | ||||
| 
 | ||||
| 
 | ||||
| HIDDEN bool _xtz_cf_val(TMask_field& f, KEY key) | ||||
| 
 | ||||
| { | ||||
|   if (f.mask().query_mode()) return TRUE; | ||||
|   const char* cf = f.get(); | ||||
|   return (*cf == '\0') ? TRUE : _xt_cf_val(f, key); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| HIDDEN bool _notempty_val(TMask_field& f, KEY) | ||||
| { | ||||
|   return f.mask().query_mode() || f.get().not_empty(); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| HIDDEN bool _date_cmp(TMask_field& f, KEY) | ||||
| { | ||||
|   TFixed_string s(f.get()); | ||||
| @ -480,7 +477,6 @@ HIDDEN bool _date_cmp(TMask_field& f, KEY) | ||||
|   return FALSE; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| HIDDEN bool     _fixlen_val(TMask_field& f, KEY) | ||||
| { | ||||
|   const TFixed_string  s(f.get()); | ||||
| @ -534,19 +530,6 @@ HIDDEN bool _autoexit_val(TMask_field& f, KEY key) | ||||
|   if (!m.query_mode() || key == K_ENTER)  | ||||
|     return TRUE; | ||||
| 
 | ||||
| /*
 | ||||
|   const int next = m.next_fld(); | ||||
| 
 | ||||
|   if (next != DLG_NULL && next != f.dlg() && m.field(next).in_key(0)) | ||||
|   {                | ||||
|     const byte last = m.num_keys(); | ||||
|      | ||||
|     for (byte k = 1; k <= last; k++) | ||||
|       if (f.in_key(k) && m.field(next).in_key(k)) | ||||
|         return TRUE; | ||||
|   }       | ||||
| */ | ||||
| 
 | ||||
|   const int nparms = get_val_param_num(); | ||||
|   bool one_not_empty = FALSE; | ||||
|   for (int i = nparms; i-- > 0;) | ||||
| @ -783,7 +766,7 @@ HIDDEN bool _ora_val(TMask_field& f, KEY key) | ||||
| { | ||||
|   if ( f.to_check( key ) ) | ||||
|   { | ||||
|     TFixed_string ora( f.get( ), 6 ); | ||||
|     TString8 ora = f.get(); | ||||
|     if ( ora.not_empty( ) || f.required( ) ) | ||||
|     { | ||||
|       if ( isdigit( ora[ 0 ] ) ) | ||||
| @ -814,9 +797,176 @@ HIDDEN bool _ora_val(TMask_field& f, KEY key) | ||||
|   return TRUE; | ||||
| } | ||||
| 
 | ||||
| bool iban_check(const TString& b, TString& msg) | ||||
| { | ||||
|   if (b.len() < 5) | ||||
|   { | ||||
|     msg = TR("Lunghezza inferiore a 5 caratteri"); | ||||
|     return false; | ||||
|   } | ||||
|   if (!isalpha(b[0]) || !isalpha(b[1])) | ||||
|   { | ||||
|     msg.format(FR("I primi due caratteri (%s) devono essere alfabetici"), (const char*)b.left(2)); | ||||
|     return false; | ||||
|   } | ||||
|   if (!isdigit(b[2]) || !isdigit(b[1])) | ||||
|   { | ||||
|     msg.format(FR("I caratteri 3 e 4 (%s) devono essere numerici"), (const char*)b.mid(2,2)); | ||||
|     return false; | ||||
|   } | ||||
| 
 | ||||
|   TString80 s; | ||||
|   s << b.mid(4) << b.left(4); | ||||
| 
 | ||||
| #define MAX_FUNC 24 | ||||
|   int r = 0; | ||||
|   for (int i = 0; s[i]; i++) | ||||
|   { | ||||
|     const char c = s[i]; | ||||
|     if (c >= '0' && c <= '9') | ||||
|     { | ||||
|       const int k = c - '0'; | ||||
|       r = (10 * r + k) % 97; | ||||
|     } else | ||||
|     if (c >= 'A' && c <= 'Z') | ||||
|     { | ||||
|       const int k = c - 'A' + 10; | ||||
|       r = (100 * r + k) % 97; | ||||
|     } | ||||
|     else | ||||
|     { | ||||
|       msg.format(FR("Carattere non ammesso: '%c'"), c); | ||||
|       return false; | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   if (r != 1) | ||||
|   { | ||||
|     msg = TR("Codice di controllo errato"); | ||||
|     return false; | ||||
|   } | ||||
| 
 | ||||
|   return true; | ||||
| } | ||||
| 
 | ||||
| bool bban_check(const TString& b, TString& msg) | ||||
| { | ||||
|   const unsigned char dispari[26] = { 1,  0, 5, 7, 9, 13, 15, 17, 19, 21,  2,  4, 18, | ||||
|                                      20, 11, 3, 6, 8, 12, 14, 16, 10, 22, 25, 24, 23 }; | ||||
|   if (b.len() != 23) | ||||
|   { | ||||
|     msg = TR("Lunghezza diversa da 23 caratteri"); | ||||
|     return false; | ||||
|   } | ||||
|   if (b[0] < 'A' || b[0] > 'Z') | ||||
|   { | ||||
|     msg.format(FR("Il CIN deve essere una lettera maiuscola: '%c'"), b[0]); | ||||
|     return false; | ||||
|   } | ||||
|   for (int a = 1; a <= 10; a++) | ||||
|   { | ||||
|     if (!isdigit(b[a])) | ||||
|     { | ||||
|       msg = TR("ABI e CAB devono essere numerici"); | ||||
|       return false; | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   int s = 0, kcin = 0; | ||||
|   for (int i = 0; b[i]; i++) | ||||
|   { | ||||
|     const char c = b[i]; | ||||
|     int k = 0; | ||||
|     if (isdigit(c)) | ||||
|     { | ||||
|       k = c - '0'; | ||||
|     } else | ||||
|     if (c >= 'A' && c <= 'Z') | ||||
|     { | ||||
|       k = c - 'A'; | ||||
|     } | ||||
|     else | ||||
|     { | ||||
|       msg.format(FR("Carattere non ammesso: '%c'"), c); | ||||
|       return false; | ||||
|     } | ||||
|     if (i == 0) | ||||
|       kcin = k; | ||||
|     else | ||||
|     { | ||||
|       if (i & 1) // dispari
 | ||||
|         s += dispari[k]; | ||||
|       else | ||||
|         s += k; | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   if (s % 26 != kcin) | ||||
|   { | ||||
|     msg = TR("Codice di controllo (CIN) errato"); | ||||
|     return false;  | ||||
|   } | ||||
| 
 | ||||
|   return true; | ||||
| } | ||||
| 
 | ||||
| HIDDEN bool _iban_val(TMask_field& f, KEY key) | ||||
| { | ||||
|   bool ok = true; | ||||
|   if (f.to_check(key)) | ||||
|   { | ||||
|     const TMask& m = f.mask(); | ||||
|     TString80 iban; | ||||
|     const int nparms = get_val_param_num(); | ||||
|     for (int i = 0; i < nparms; i++) | ||||
|     { | ||||
|       const int id = atoi(get_val_param(i)); | ||||
|       iban << m.get(id); | ||||
|     } | ||||
|     TString msg; | ||||
|     ok = iban_check(iban, msg); | ||||
|     if (!ok) | ||||
|     { | ||||
|       msg.insert(TR("Codice IBAN errato:\n")); | ||||
|       error_box(msg); | ||||
|     } | ||||
|     else | ||||
|     { | ||||
|       ok = bban_check(iban.mid(5), msg); | ||||
|       if (!ok) | ||||
|       { | ||||
|         msg.insert(TR("Codice BBAN errato:\n")); | ||||
|         error_box(msg); | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|   return ok; | ||||
| } | ||||
| 
 | ||||
| HIDDEN bool _bban_val(TMask_field& f, KEY key) | ||||
| { | ||||
|   bool ok = true; | ||||
|   if (f.to_check(key)) | ||||
|   { | ||||
|     const TMask& m = f.mask(); | ||||
|     TString80 bban; | ||||
|     const int nparms = get_val_param_num(); | ||||
|     for (int i = 0; i < nparms; i++) | ||||
|     { | ||||
|       const int id = atoi(get_val_param(i)); | ||||
|       bban << m.get(id); | ||||
|     } | ||||
|     TString msg; | ||||
|     ok = bban_check(bban, msg); | ||||
|     if (!ok) | ||||
|     { | ||||
|       msg.insert(TR("Codice BBAN errato:\n")); | ||||
|       error_box(msg); | ||||
|     } | ||||
|   } | ||||
|   return ok; | ||||
| } | ||||
| 
 | ||||
| #define MAX_FUNC 26 | ||||
| 
 | ||||
| HIDDEN VAL_FUNC _global_val_func[MAX_FUNC] =  | ||||
| { | ||||
| @ -844,7 +994,8 @@ HIDDEN VAL_FUNC _global_val_func[MAX_FUNC] = | ||||
|   _not_empty_chkfld_val, | ||||
|   _ora_val, | ||||
|   _sconto_val, | ||||
| 
 | ||||
|   _iban_val, | ||||
|   _bban_val, | ||||
| }; | ||||
| 
 | ||||
| // @doc INTERNAL
 | ||||
|  | ||||
| @ -6,7 +6,10 @@ | ||||
| #endif | ||||
| 
 | ||||
| bool validate(int fn, TMask_field& f, KEY k, const TArray& parms); | ||||
| bool pi_check (const char * stato, const char * cf); | ||||
| bool cf_check (const char * stato, const char * cf); | ||||
| 
 | ||||
| bool pi_check (const char* stato, const char* pi); | ||||
| bool cf_check (const char* stato, const char* cf); | ||||
| bool iban_check(const TString& b, TString& msg); | ||||
| bool bban_check(const TString& b, TString& msg); | ||||
| 
 | ||||
| #endif // __VALIDATE_H
 | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user