br.js 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286
  1. define("dojox/validate/br", ["dojo/_base/lang", "./_base"], function(lang, validate){
  2. var br = lang.getObject("br", true, validate);
  3. br.isValidCnpj = function(/*String*/value){
  4. // summary:
  5. // Validates a CNPJ/CGC number
  6. //
  7. // value: String
  8. // The CNPJ/CGC number in ##.###.###/####-##, ########/####-##,
  9. // ############-## or ############## format
  10. if(!lang.isString(value)){
  11. if(!value){
  12. return false;
  13. }
  14. value = value + "";
  15. while(value.length < 14){
  16. value = "0" + value;
  17. }
  18. }
  19. var flags = {
  20. format: [
  21. "##.###.###/####-##",
  22. "########/####-##",
  23. "############-##",
  24. "##############"
  25. ]
  26. };
  27. if(validate.isNumberFormat(value, flags)){
  28. // Matched the initial test, so break this down into the
  29. // parts to be validated.
  30. value = value.replace("/", "").replace(/\./g, "").replace("-", "");
  31. var cgc = [];
  32. var dv = [];
  33. var i, j, tmp;
  34. // Check for obvious bad combos
  35. // all 0s to all 9's.
  36. for(i = 0; i < 10; i++){
  37. tmp = "";
  38. for(j = 0; j < value.length; j++){
  39. tmp += "" + i;
  40. }
  41. if(value === tmp){
  42. return false;
  43. }
  44. }
  45. //Split out the DV from the main number.
  46. for(i = 0; i < 12; i++){
  47. cgc.push(parseInt(value.charAt(i), 10));
  48. }
  49. for(i = 12; i < 14; i++){
  50. dv.push(parseInt(value.charAt(i), 10));
  51. }
  52. var base = [9,8,7,6,5,4,3,2,9,8,7,6].reverse();
  53. var sum = 0;
  54. for(i = 0; i < cgc.length; i++){
  55. sum += cgc[i] * base[i];
  56. }
  57. var dv0 = calcDv(sum);
  58. if(dv0 == dv[0]){
  59. // Still seems valid, keep going.
  60. sum = 0;
  61. base = [9,8,7,6,5,4,3,2,9,8,7,6,5].reverse();
  62. cgc.push(dv0);
  63. for(i = 0; i < cgc.length; i++){
  64. sum += cgc[i] * base[i];
  65. }
  66. var dv1 = calcDv(sum);
  67. if(dv1 === dv[1]){
  68. // Whew, looks valid.
  69. return true;
  70. }
  71. }
  72. }
  73. return false;
  74. };
  75. br.computeCnpjDv = function(/*String*/value){
  76. // summary: Generate the DV code (checksum part) for a Cnpj number
  77. //
  78. // value: The CGC number in ##.###.###/#### or ############ format
  79. if(!lang.isString(value)){
  80. if(!value){
  81. return "";
  82. }
  83. value = value + "";
  84. while(value.length < 12){
  85. value = "0" + value;
  86. }
  87. }
  88. var flags = {
  89. format: [
  90. "##.###.###/####",
  91. "########/####",
  92. "############"
  93. ]
  94. };
  95. if(validate.isNumberFormat(value, flags)){
  96. // Matched the initial test, so break this down into the
  97. // parts to compute the DV.
  98. value = value.replace("/", "").replace(/\./g, "");
  99. var cgc = [];
  100. var i, j, tmp;
  101. // Check for obvious bad combos
  102. // all 0s to all 9's.
  103. for(i = 0; i < 10; i++){
  104. tmp = "";
  105. for(j = 0; j < value.length; j++){
  106. tmp += "" + i;
  107. }
  108. if(value === tmp){
  109. return "";
  110. }
  111. }
  112. for(i = 0; i < value.length; i++){
  113. cgc.push(parseInt(value.charAt(i), 10));
  114. }
  115. var base = [9,8,7,6,5,4,3,2,9,8,7,6].reverse();
  116. var sum = 0;
  117. for(i = 0; i < cgc.length; i++){
  118. sum += cgc[i] * base[i];
  119. }
  120. var dv0 = calcDv(sum);
  121. sum = 0;
  122. base = [9,8,7,6,5,4,3,2,9,8,7,6,5].reverse();
  123. cgc.push(dv0);
  124. for(i = 0; i < cgc.length; i++){
  125. sum += cgc[i] * base[i];
  126. }
  127. var dv1 = calcDv(sum);
  128. return ("" + dv0) + dv1;
  129. }
  130. return "";
  131. };
  132. br.isValidCpf = function(/*String*/value){
  133. // summary:
  134. // Validates a CPF number
  135. //
  136. // value: String
  137. // The CPF number in #########-## or ###########,
  138. // format
  139. if(!lang.isString(value)){
  140. if(!value){
  141. return false;
  142. }
  143. value = value + "";
  144. while(value.length < 11){
  145. value = "0" + value;
  146. }
  147. }
  148. var flags = {
  149. format: [
  150. "###.###.###-##",
  151. "#########-##",
  152. "###########"
  153. ]
  154. };
  155. if(validate.isNumberFormat(value, flags)){
  156. // Matched the initial test, so break this down into the
  157. // parts to be validated.
  158. value = value.replace("-", "").replace(/\./g, "");
  159. var cpf = [];
  160. var dv = [];
  161. var i, j, tmp;
  162. // Check for obvious bad combos
  163. // all 0s to all 9's.
  164. for(i = 0; i < 10; i++){
  165. tmp = "";
  166. for(j = 0; j < value.length; j++){
  167. tmp += "" + i;
  168. }
  169. if(value === tmp){
  170. return false;
  171. }
  172. }
  173. //Split out the DV from the main number.
  174. for(i = 0; i < 9; i++){
  175. cpf.push(parseInt(value.charAt(i), 10));
  176. }
  177. for(i = 9; i < 12; i++){
  178. dv.push(parseInt(value.charAt(i), 10));
  179. }
  180. var base = [9,8,7,6,5,4,3,2,1].reverse();
  181. var sum = 0;
  182. for(i = 0; i < cpf.length; i++){
  183. sum += cpf[i] * base[i];
  184. }
  185. var dv0 = calcDv(sum);
  186. if(dv0 == dv[0]){
  187. // Still seems valid, keep going.
  188. sum = 0;
  189. base = [9,8,7,6,5,4,3,2,1,0].reverse();
  190. cpf.push(dv0);
  191. for(i = 0; i < cpf.length; i++){
  192. sum += cpf[i] * base[i];
  193. }
  194. var dv1 = calcDv(sum);
  195. if(dv1 === dv[1]){
  196. // Whew, looks valid.
  197. return true;
  198. }
  199. }
  200. }
  201. return false;
  202. };
  203. br.computeCpfDv = function(/*String*/value){
  204. // summary:
  205. // Generate the DV code (checksum part) for a CPF number
  206. //
  207. // value: String
  208. // The CPF number in ######### format
  209. if(!lang.isString(value)){
  210. if(!value){
  211. return "";
  212. }
  213. value = value + "";
  214. while(value.length < 9){
  215. value = "0" + value;
  216. }
  217. }
  218. var flags = {
  219. format: [
  220. "###.###.###",
  221. "#########"
  222. ]
  223. };
  224. if(validate.isNumberFormat(value, flags)){
  225. // Matched the initial test, so break this down into the
  226. // parts to compute the DV.
  227. value = value.replace(/\./g, "");
  228. var cpf = [];
  229. // Check for obvious bad combos
  230. // all 0s to all 9's.
  231. for(i = 0; i < 10; i++){
  232. tmp = "";
  233. for(j = 0; j < value.length; j++){
  234. tmp += "" + i;
  235. }
  236. if(value === tmp){
  237. return "";
  238. }
  239. }
  240. for(i = 0; i < value.length; i++){
  241. cpf.push(parseInt(value.charAt(i), 10));
  242. }
  243. var base = [9,8,7,6,5,4,3,2,1].reverse();
  244. var sum = 0;
  245. for(i = 0; i < cpf.length; i++){
  246. sum += cpf[i] * base[i];
  247. }
  248. var dv0 = calcDv(sum);
  249. sum = 0;
  250. base = [9,8,7,6,5,4,3,2,1,0].reverse();
  251. cpf.push(dv0);
  252. for(i = 0; i < cpf.length; i++){
  253. sum += cpf[i] * base[i];
  254. }
  255. var dv1 = calcDv(sum);
  256. return ("" + dv0) + dv1;
  257. }
  258. return "";
  259. };
  260. var calcDv = function(/*Number*/sum) {
  261. var dv = sum % 11;
  262. //If dv is 10, it is represented as 0:
  263. if (dv === 10) {
  264. dv = 0;
  265. }
  266. return dv;
  267. };
  268. return br;
  269. });