Skip to content

Instantly share code, notes, and snippets.

@mildsunrise
Last active January 25, 2024 01:31
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mildsunrise/5c64f4be8637e9e3f7532cc2ec176c74 to your computer and use it in GitHub Desktop.
Save mildsunrise/5c64f4be8637e9e3f7532cc2ec176c74 to your computer and use it in GitHub Desktop.
JS code in the PDF for Spanish tax form 145

The Spanish government loves (or loved) using JavaScript in their tax forms.

This gist contains the JS blocks in the official tax form 145 PDF, version 1.0/2022. Enjoy.

The code is reproduced verbatim, except for normalizing the encoding (latin-1 to utf-8) and the newlines (CRLF to LF). Using some iconv command + unix2dos should give you back the exact bytes in the PDF, except for one thing: there's a stray CR without accompanying LF in object828.js:139. Yeah, idk.

var CONTROL=true;
var alertas = new Object;
alertas.CBcheckBox = {cMsg: "No volver a mostrar este aviso",bAfterValue: false};
var mostrarAvisoCB = false;
asistenteYmodelo();
actualizaContadores();
function actualizaContadores(){
if(this.getField("contador") != null){
this.getField("contador.campos_dato").value = indiceMax("dato" )+1;
this.getField("contador.campos_nif" ).value = indiceMax("dato.nif")+1;
var cuenta=false;
var maxEnt=indiceMax("dato.entidad" );
var maxOfi=indiceMax("dato.sucursal");
var maxDC =indiceMax("dato.dc" );
var maxCod=indiceMax("dato.cuenta" );
if (maxCod != maxEnt || maxCod != maxOfi || maxCod != maxDC)
app.alert("Falta algún campo en algún grupo de cuenta corriente.",1);
else
this.getField("contador.campos_ccc").value = maxCod + 1;
var maxDia =indiceMax("dato.dia" );
var maxMes =indiceMax("dato.mes" );
var maxAnyo=indiceMax("dato.anyo" );
var maxBot =indiceMax("dato.fecha");
if (maxDia != maxMes || maxDia != maxAnyo || maxDia != maxBot)
app.alert("Falta algún campo en algún grupo de fecha.",1);
else
this.getField("contador.campos_fecha").value = maxDia +1;}
else
elAsistente.creaContadores();}
function indiceMax(nombreCampo){
var mayor = 0;
if (this.getField(nombreCampo) != null){
var campos = this.getField(nombreCampo).getArray();
var listaIndices = "";
var elNombre, indice, lista;
if(isNaN(campos)){
for (var a = 0; a<campos.length; a++){
elNombre = campos[a].name.split(".");
indice = elNombre[elNombre.length-1];
listaIndices += isNaN(indice) ? "" : indice + "|";}
lista = listaIndices.split("|");
for (a = 0; a<lista.length; a++)
mayor = (mayor > Number(lista[a])) ? mayor : Number(lista[a]);}
else{
elNombre = campos[a].name.split(".");
mayor = Number(elNombre[elNombre.length-1])}}
return mayor;}
function coordenadasXY(){
var coord = new Array(4);
var x0 = this.viewState.toSource().split(",")[7].substr(11);
var y0 = this.viewState.toSource().split(",")[8].substr(11);
var zoom = this.viewState.toSource().split(",")[9].substr(14);
coord[0] = -x0/zoom + 295;
coord[1] = -y0/zoom + 715;
coord[2] = coord[0] + 90; //385
coord[3] = coord[1] - 15; //700
return coord;}
function pintaCampoGenerico(){
try{
app.execMenuItem("AuthoringMenuItem");
var campos_dato = this.getField("contador.campos_dato").value;
var nombre = "dato." + campos_dato;
var nuevoCampo = this.addField(nombre,"text",this.pageNum,coordenadasXY());
estiloDatos(nombre);
this.getField("contador.campos_dato").value = campos_dato + 1;}
catch(elError){
elAsistente.escribeErrorConsola(" al pintar un campo de texto genérico en el documento:\n Página: " + this.pageNum + ".\n Nombre de campo: dato." + campos_dato, elError);}}
function pintaCampoNIF(){
try{
app.execMenuItem("AuthoringMenuItem");
var campos_nif = this.getField("contador.campos_nif").value;
var nombreCampo = "dato.nif." + campos_nif;
var nuevoCampo = this.addField(nombreCampo,"text",this.pageNum,coordenadasXY());
nuevoCampo.setAction("OnBlur", "verificaNIF(event.target);");
estiloDatos(nombreCampo);
this.getField("contador.campos_nif").value = campos_nif + 1;}
catch(elError){
elAsistente.escribeErrorConsola(" al pintar un campo de NIF en el documento:\n Página: " + this.pageNum + ".\n Nombre de campo: " + nombreCampo, elError);}}
function pintaCampoCCC(){
try{
app.execMenuItem("AuthoringMenuItem");
var y = this.viewState.toSource().split(",")[8].substr(11);
var campos_ccc = this.getField("contador.campos_ccc").value;
var coord = coordenadasXY();
var coordEnt = new Array(coord[0], coord[1], coord[2]-50, coord[3]);
var coordOfi = new Array(coord[0]+42, coord[1], coord[2]-8 , coord[3]);
var coordDC = new Array(coord[0]+84, coord[1], coord[2]+14, coord[3]);
var coordCod = new Array(coord[0]+106, coord[1], coord[2]+124, coord[3]);
var nombreCampoEnt = "dato.entidad." + campos_ccc;
var nombreCampoOfi = "dato.sucursal." + campos_ccc;
var nombreCampoDC = "dato.dc." + campos_ccc;
var nombreCampoCod = "dato.cuenta." + campos_ccc;
var nuevoCampoEnt = this.addField(nombreCampoEnt,"text",this.pageNum,coordEnt);
var nuevoCampoOfi = this.addField(nombreCampoOfi,"text",this.pageNum,coordOfi);
var nuevoCampoDC = this.addField(nombreCampoDC, "text",this.pageNum,coordDC);
var nuevoCampoCod = this.addField(nombreCampoCod,"text",this.pageNum,coordCod);
estiloDatos(nombreCampoEnt);
nuevoCampoEnt.charLimit = 4; //Tamaño máximo para el campo Entidad
estiloDatos(nombreCampoOfi);
nuevoCampoOfi.charLimit = 4; //Tamaño máximo para el campo Oficina
estiloDatos(nombreCampoDC);
nuevoCampoDC.charLimit = 2; //Tamaño máximo para el campo DC
estiloDatos(nombreCampoCod);
nuevoCampoCod.charLimit = 10;//Tamaño máximo para el campo Código de cuenta
nuevoCampoCod.setAction("OnBlur", "validaCCC(event.target);");
this.getField("contador.campos_ccc").value = campos_ccc + 1;}
catch(elError){
elAsistente.escribeErrorConsola(" al pintar los campos correspondientes a una CCC en el documento:\n Página: " + this.pageNum + ".\n Nombres de campos: " + nombreCampoEnt + ", " + nombreCampoOfi + ", " + nombreCampoDC + ", " + nombreCampoCod, elError);}
}
function pintaCampoVer(){
try{
app.execMenuItem("AuthoringMenuItem");
var campos_verificacion = this.getField("contador.campos_dato").value;
var coordVer = coordenadasXY();
coordVer[2]=coordVer[0]+15;
coordVer[3]=coordVer[1]+15;
var nuevoCampo = this.addField("dato." + campos_verificacion,"checkbox",this.pageNum,coordVer);
nuevoCampo.delay = true;
nuevoCampo.style = style.cr;
nuevoCampo.textColor = color.blue;
nuevoCampo.fillColor = color.white;
nuevoCampo.delay = false;
this.getField("contador.campos_dato").value = campos_verificacion + 1;}
catch(elError){
elAsistente.escribeErrorConsola(" al pintar una casilla de verificación en el documento:\n Página: " + this.pageNum + ".\n Nombre de campo: dato." + campos_verificacion, elError);}}
function pintaCampoCB(){
try{
app.execMenuItem("AuthoringMenuItem");
var nombrecod="CodBar.Cod";
var nombrenum="CodBar.Num";
var pintaCB=true;
var poscod=new Array (334,783,485,755);
var posnum=new Array (354,795,467,779);
campo1=this.addField(nombrecod,"text",this.pageNum,poscod);
campo1.delay=true;
campo1.display=display.visible;
campo1.readonly=true;
campo1.textColor=color.black;
if (!fuenteCB(campo1,"ArialATCB") && !fuenteCB(campo1,"ArialAT")){
pintaCB=false;
if(!mostrarAvisoCB){
app.alert({
cMsg: "La fuente de Código de Barras de la AEAT no está instalada en\nel Sistema. No se puede crear un campo de Código de Barras sin\ndicha fuente. Por favor, cierre Acrobat, instale la fuente y\nreabra Acrobat.",
nIcon: 1,
cTitle: "Falta fuente de Código de Barras",
oCheckbox: alertas.CBcheckBox});
mostrarAvisoCB = alertas.CBcheckBox.bAfterValue;}}
campo1.alignment="center";
campo1.userName="Código de barras";
campo1.delay=false;
if(!pintaCB) this.removeField(nombrecod);
campo2=this.addField(nombrenum,"text",this.pageNum,posnum);
campo2.delay=true;
campo2.display=display.visible;
campo2.readonly=true;
campo2.textColor=color.black;
campo2.textFont=font.Helv;
campo2.alignment="center";
campo2.userName="Código de documento";
campo2.delay=false;}
catch(elError){
elAsistente.escribeErrorConsola(" al pintar los campos de Código de Barras en el documento:\n Página: " + this.pageNum + ".\n Nombre de campo: CodBar.Cod y CodBar.Num", elError);}}
function fuenteCB(campo,laFuente){
try{
campo.textFont=laFuente;
return true;
} catch(e){
if (e.name=="InvalidSetError")
return false;}}
function pintaFecha(){
try{
app.execMenuItem("AuthoringMenuItem");
var campos_fecha = this.getField("contador.campos_fecha").value;
var meses = " ,enero,febrero,marzo,abril,mayo,junio,julio,agosto,septiembre,octubre,noviembre,diciembre";
var coord = coordenadasXY();
var posDia = new Array(coord[0]-90, coord[1], coord[2]-135, coord[3]);
var posMes = new Array(coord[0]-5, coord[1], coord[2]-15, coord[3]);
var posAnyo = new Array(coord[0]+100, coord[1], coord[2]+55, coord[3]);
var posBot = new Array(coord[0]+150, coord[1], coord[2]+120, coord[3]);
var elDia = this.addField("dato.dia." + campos_fecha,"text",this.pageNum,posDia);
var elMes = this.addField("dato.mes." + campos_fecha,"combobox",this.pageNum,posMes);
var elAnyo = this.addField("dato.anyo." + campos_fecha,"text",this.pageNum,posAnyo);
var elBot = this.addField("dato.fecha." + campos_fecha,"button",this.pageNum,posBot);
estiloDatos(elDia.name);
estiloDatos(elMes.name);
estiloDatos(elAnyo.name);
elMes.delay = true;
elMes.setItems(meses.split(","));
elMes.editable = true;
elMes.delay = false;
elAnyo.setAction("OnBlur","compruebaFecha(event.target);");
elBot.delay = true;
elBot.display = display.visible;
elBot.buttonSetCaption("Fecha actual");
elBot.strokeColor = color.black;
elBot.textColor = color.black;
elBot.fillColor = ["RGB",.5,1,.5];
elBot.setAction("MouseUp","fecha(event.target);");
elBot.delay = false;
this.getField("contador.campos_fecha").value = campos_fecha + 1;}
catch(elError){
elAsistente.escribeErrorConsola(" al pintar los campos de Fecha en el documento:\n Página: " + this.pageNum + ".\n Nombre de campo: dato.dia." + campos_fecha + ", dato.mes." + campos_fecha + ", dato.anyo." + campos_fecha, elError);}}
function estiloDatos(suNombre){
var elCampo = this.getField(suNombre);
elCampo.delay = true;
elCampo.textSize = 9;
elCampo.textColor = color.blue;
elCampo.textFont = font.Helv;
elCampo.fillColor = color.white;
elCampo.delay = false;}
function numCamposModelo(){
var parte,cual,nPartes;
var indiceError = 0;
var elDialogo;
var rechazados, nombreCampo, raiz, a, b, respuesta;
var permitidos = new Array ("dato", "CodBar", "dato.nif", "dato.entidad", "dato.sucursal", "dato.dc", "dato.cuenta", "texto", "textofijo", "textoPie", "CodBar.Cod", "CodBar.Num","contador", "acc", "bot", "oculta", "inst");
var nTipos = permitidos.length;
//Busco y cuento los campos normalizados y borro los no normalizados
var laFamilia = familias();
for (a=0; a < laFamilia.length; a++){
// Detecto los campos no normalizados
valido = false;
for (b = 0; b < nTipos; b++)
if (laFamilia[a] == permitidos[b])
valido = true;
if (!valido){
elDialogo = {
initialize: function(dialog){
// Se pone uno de los radiobutton activo y se le da un valor por defecto
dialog.load({"rd01": true,
"nCam": "dato." + laFamilia[a]});
dialog.enable({"nCam": false});},
commit: function(dialog){
// Cuando se presiona "Ok", se ejecuta primero esto
var resultados = dialog.store();
//app.alert("Resultados: " + resultados);
var cual = this.accionElegida(resultados);
if (cual == 2)
this.removeField(parte[0]);
if (cual == 3)
renombrarCampos(parte[0],resultados["nCam"]);},
accionElegida: function (resultados){
var campo;
for ( var i=1; i<=6; i++) {
if ( resultados["rd0" + i] ) {
switch (i) {
case 1:
campo = 1;
break;
case 2:
campo = 2;
break;
case 3:
campo = 3;}}}
return campo;},
ok: function(dialog) {
// Esto lo hace tras presionar el botón Ok, después del "commit"
},
cancel: function(dialog) {
// Cuando presiona el botón Cancel
return;},
rd01: function(dialog){ //Procesa rd01
dialog.enable({ "nCam" : false});},
rd02: function(dialog){ //Procesa rd02
dialog.enable({ "nCam" : false});},
rd03: function(dialog){ //Procesa rd03
dialog.enable({ "nCam" : true});},
// Descripción del diálogo
description:
{
name: "Campo no normalizado",
elements:[
{
type: "view",
align_children: "align_left",
elements:[
{
type: "static_text",
name: "Se ha encontrado una familia de campos no normalizada: \"" + laFamilia[a] + "\".",
bold: true,
font: "dialog",
char_width: 40,
height: 30
},
{
type: "cluster",
name: "Acciones posibles:",
align_children: "align_row",
elements:[
{
type: "view",
align_children: "align_left",
elements:[
{
type: "radio",
item_id: "rd01",
group_id: "rado",
name: "Ignorar",
},
{
type: "radio",
item_id: "rd02",
group_id: "rado",
name: "Eliminar familia \"" + laFamilia[a] + "\"",
},
{
type: "view",
align_children: "align_row",
elements:[
{
type: "radio",
item_id: "rd03",
group_id: "rado",
name: "Renombrar familia:"
},
{
type: "edit_text",
item_id: "nCam",
char_width: 15
}
]
}
]
}
]
},
{
type: "ok_cancel",
ok_name: "Aceptar",
cancel_name: "Cancelar"
}
]
}
]
}
};
var retn = app.execDialog(elDialogo);}}}
function familias(){
var a, b;
var nueva;
var estaFamilia,familias,lasFamilias;
familias = "";
for (a=0; a < this.numFields; a++){
estaFamilia = this.getNthFieldName(a).split(".")[0];
if (familias == "") familias = estaFamilia + "|";
else {
lasFamilias = familias.split("|");
nueva = true;
for (b=0; b<lasFamilias.length-1; b++)
if (estaFamilia == lasFamilias[b]) nueva = false;
if (nueva) familias += estaFamilia + "|";}}
return familias.substring(0,familias.length-1).split("|");}
function renombra(){
var origen,destino,accion;
origen = app.response({
cQuestion: "RENOMBRADO DE CAMPOS [Paso 1]\nTeclee la raiz de la familia de campos a renombrar.",
cTitle: "Renombrar campos (Paso 1)",
cLabel: "Raiz origen:",
cDefault: this.getNthFieldName(0).split('.')[0]
}).replace(/[^a-zA-Z0-9.]/g,'');
if (origen == null || origen == ""){
if(app.alert("No ha indicado ninguna familia de campos <<origen>>.\n¿Desea cancelar esta acción?",2,2)==4)
return;
else
renombra();}
else{
destino = app.response({
cQuestion: "RENOMBRADO DE CAMPOS [Paso 2]\nTeclee la raiz de la familia que quiere dar a la familia " + origen + ".",
cTitle: "Renombrar campos (Paso 2)",
cLabel: "Raiz destino:",
cDefault: origen
}).replace(/[^a-zA-Z0-9.]/g,'');
if(destino == null || destino == ""){
if (app.alert("No ha indicado ninguna familia de campos <<destino>>.\n¿Desea cancelar esta acción?",2,2)==4)
return;
else
renombra();}
else{
accion = app.alert("Se va a proceder a renombrar la familia\n\torigen \"" + origen + "\"\ncon la familia\n\tdestino \"" + destino + "\".",3,3);
switch(accion){
case 4: //Sí
renombrarCampos(origen,destino);
break;
case 3: //No
renombra();
break;
default: //Cancelar
return;}}}}
function insertaCopias(){
var origen,destino,accion;
origen = this.pageNum;
destino = (origen == this.numPages-1) ? "" : (origen+2)
destino = app.response({
cQuestion: "INSERCIÓN DE CAMPOS COPIA\nTeclee los números de páginas (separadas por comas) donde quiera insertar los campos copia procedentes de esta página.",
cTitle: "Inserción de campos copia",
cLabel: "Página/s:",
cDefault: destino
}).replace(/[^0-9,]/g,'');
if(destino == null || destino == ""){
if (app.alert("No ha indicado ninguna página donde insertar los campos.\n¿Desea cancelar esta acción?",2,2)==4)
return;
else
insertaCopias();}
else{
accion = app.alert("Se va a proceder a insertar los campos copia en la/s página/s " + destino + ".",3,3);
switch(accion){
case 4: //Sí
copiaCampos(origen,destino);
break;
case 3: //No
insertaCopias();
break;
default: //Cancelar
return;}}}
function listaCamposDato(){
var nombresCampos = "";
if (this.getField("dato")!=null){
var losCamposDato = this.getField("dato").getArray();
console.println("Hay " + losCamposDato.length + " campos DATO");
for (var a=0; a<losCamposDato.length; a++)
nombresCampos += losCamposDato[a].name + ",";
nombresCampos = nombresCampos.replace(/dato\.(?:a\.)?(?:\w*\.)\d+/gi,'').replace(/,+/g,',').replace(/^,/,'').replace(/,$/,'').split(',');
console.println("Los campos encontrados son " + nombresCampos);
losCamposDato = new Array (nombresCampos.length);
for (a=0; a<nombresCampos.length; a++)
losCamposDato[a] = this.getField(nombresCampos[a]);
return losCamposDato;}
else return null;}
function renumerarCampos(nombreCampo,contador){
var losCampos;
var cuantos, cuantosAhora;
var elNuevo, losNuevos, losIndices, losNuevosIndices, a, b;
if(this.getField(nombreCampo) != null){
if (nombreCampo == "dato")
losCampos = listaCamposDato();
else
losCampos = this.getField(nombreCampo + ".").getArray();
cuantos = losCampos.length;
losIndices = new Array (cuantos);
for (a = 0; a < cuantos; a++)
losIndices[a] = indiceCampo(losCampos[a]);
losIndices = quicksort(losIndices);
console.println("Los índices son: " + losIndices);
for (a = 0; a < cuantos; a++)
if (losIndices[a] != (a+1))
copiaHijos(nombreCampo + "." + losIndices[a], nombreCampo + "." + (a+1));
losNuevos = this.getField(nombreCampo).getArray();
cuantosAhora = losNuevos.length;
losNuevosIndices = new Array (cuantosAhora);
this.getField("contador.campos_" + contador).value = cuantos+1;
for (a = 0; a < cuantosAhora; a++)
losNuevosIndices[a] = indiceCampo(losNuevos[a]);
losNuevosIndices = quicksort(losNuevosIndices);
for (a = cuantos; a < cuantosAhora; a++)
this.removeField(nombreCampo + "." + losNuevosIndices[a]);}}
function renumerarCamposCCC(){
var a, b, exReg, errores = "";
//Los campos implicados
var campos = new Array("dato.entidad","dato.sucursal","dato.dc","dato.cuenta");
//Cargo las listas de campos de cada título en un array
var CCC = new Array(4);
for (a=0; a<4; a++)
CCC[a] = this.getField(campos[a]).getArray();
//Guardo el número de campos de cada título en otro array
var nCCC = new Array(4);
for (a=0; a<4; a++)
nCCC[a]=CCC[a].length;
//Si no tiene el mismo número de elementos cada título, hay un error
if (nCCC.toString().replace(/,/g,'').match(/\d{4}/) != null){
app.alert("Existen juegos de campos de Código de Cuenta Corriente incompletos\nPor favor, revise los juegos de campos de CCC.",0,0,"ERROR EN CAMPOS CCC");
app.execMenuItem("ShowHideFields"); //Abre la ventana de navegación de campos
return;}
else{
//Los cuatro títulos tienen el mismo número de campos. Aparentemente están bien. Ya veremos...
//Extraigo los índices de cada título y los guardo en el array. Luego los ordeno.
for (a=0; a<4; a++){
for (b=0; b<nCCC[a]; b++){
exReg = new RegExp(campos[a]+".","i");
CCC[a][b] = Number(CCC[a][b].name.replace(exReg,''));}
quicksort(CCC[a]);}
for (a=0; a<nCCC[0]; a++){
for(b=0; b<4; b++){
if (CCC[b][a] != CCC[4-b][a]){
app.alert("Error en el juego de campos de CCC nº " + CCC[b][a],0,0,"ERROR EN JUEGO DE CCC nº " + CCC[b][a]);
errores += CCC[b][a] + ", ";}}}
//Si hay errores, indico dónde y paro el renumerado
if (errores != ""){
app.alert("Resumen de juegos de CCC erróneos.\nSe han detectado errores en los juegos de CCC número/s:\n" + errores.slice(0,-2),0,0 + ".","RESUMEN DE JUEGOS DE CCC ERRÓNEOS");
app.execMenuItem("ShowHideFields"); //Abre la ventana de navegación de campos
return;}
else{//Si no hay errores, indica que los índices son los mismos en todos los títulos: renumero campo por campo
for(a=0; a<4; a++)
renumerarCampos(campos[a],"ccc");}}}
function renumerarCamposFecha(){
var a, b, exReg, errores = "";
//Los campos implicados
var campos = new Array("dato.dia","dato.mes","dato.anyo","dato.fecha");
//Cargo las listas de campos de cada título en un array
var fecha = new Array(4);
for (a=0; a<4; a++)
fecha[a] = this.getField(campos[a]).getArray();
//Guardo el número de campos de cada título en otro array
var nFecha = new Array(4);
for (a=0; a<4; a++)
nFecha[a]=fecha[a].length;
//Si no tiene el mismo número de elementos cada título, hay un error
if (nFecha.toString().replace(/,/g,'').match(/\d{4}/) != null){
app.alert("Existen juegos de campos de Fecha incompletos\nPor favor, revise los juegos de campos de Fecha.",0,0,"ERROR EN CAMPOS FECHA");
app.execMenuItem("ShowHideFields"); //Abre la ventana de navegación de campos
return;}
else{
//Los cuatro títulos tienen el mismo número de campos. Aparentemente están bien. Ya veremos...
//Extraigo los índices de cada título y los guardo en el array. Luego los ordeno.
for (a=0; a<4; a++){
for (b=0; b<nFecha[a]; b++){
exReg = new RegExp(campos[a]+".","i");
fecha[a][b] = Number(fecha[a][b].name.replace(exReg,''));}
quicksort(fecha[a]);}
for (a=0; a<nFecha[0]; a++){
for(b=0; b<4; b++){
if (fecha[b][a] != fecha[4-b][a]){
app.alert("Error en el juego de campos de Fecha nº " + fecha[b][a],0,0,"ERROR EN JUEGO DE FECHA nº " + fecha[b][a]);
errores += fecha[b][a] + ", ";}}}
//Si hay errores, indico dónde y paro el renumerado
if (errores != ""){
app.alert("Resumen de juegos de Fecha erróneos.\nSe han detectado errores en los juegos de Fecha número/s:\n" + errores.slice(0,-2),0,0 + ".","RESUMEN DE JUEGOS DE FECHA ERRÓNEOS");
app.execMenuItem("ShowHideFields"); //Abre la ventana de navegación de campos
return;}
else{//Si no hay errores, indica que los índices son los mismos en todos los títulos: renumero campo por campo
for(a=0; a<4; a++)
renumerarCampos(campos[a],"fecha");}}}
function renombrarCampos(antiguo,nuevo){
var nombreAntiguo,nombreNuevo,cuantos;
var original = this.getField(antiguo).getArray();
cuantos = original.length;
for (var a = 0; a < cuantos; a++){
nombreAntiguo = original[a].name;
nombreNuevo = nuevo + nombreAntiguo.split(antiguo)[1];
copiaHijos(nombreAntiguo,nombreNuevo);}}
////////////////////////////////
//COPIA CAMPOS A OTRAS PÁGINAS//
////////////////////////////////
function copiaCampos(origen,destino){
try{
var cuantosCampos = this.numFields;
var elCampoOrigen,elCampoDestino,laPagina;
var a,b,c,cual,donde,nombre;
var paginaCorrecta,copiar;
var tipos,raiz,permitidos,expresion,nombreValido,tipoValido;
destino = destino.replace(/\s/,"").split(",");
for (a = 0; a <cuantosCampos; a++){
cual = this.getNthFieldName(a);
elCampoOrigen = this.getField(cual);
donde = elCampoOrigen.page;
paginaCorrecta = false;
origen = Number(origen);
if(isNaN(donde)){
for (b=0; b < donde.length; b++){
if(donde[b] == origen)
paginaCorrecta = true;}}
else if(donde == origen)
paginaCorrecta = true;
tipo = elCampoOrigen.type;
tipos = "checkbox,text,combobox";
expr = new RegExp(tipo,"i");
tipoValido = (tipos.match(expr) != null);
nombre = elCampoOrigen.name;
raiz = nombre.split(".")[0];
permitidos = "dato,CodBar";
expr = new RegExp(raiz,"i");
nombreValido = (permitidos.match(expr) != null);
if (tipoValido && nombreValido){
if (paginaCorrecta){
if (isNaN(destino)){
for (b=0; b < destino.length; b++){
copiar = true;
if (isNaN(donde)){
for (c=0; c < donde.length; c++){
if (donde[c] != Number(destino[b]-1)){
elCampoDestino = this.addField(nombre,tipo,Number(destino[b]-1),elCampoOrigen.rect);
copiaPropiedades(elCampoOrigen,elCampoDestino);}}}
else{
if (donde != Number(destino[b]-1)){
elCampoDestino = this.addField(nombre,tipo,Number(destino[b]-1),elCampoOrigen.rect);
copiaPropiedades(elCampoOrigen,elCampoDestino);}}}}
else{
elCampoDestino = this.addField(nombre,tipo,Number(destino-1),elCampoOrigen.rect);
copiaPropiedades(elCampoOrigen,elCampoDestino);}}}}}
catch(e){
elAsistente.escribeErrorConsola(" copiando las propiedades de los campos.\nError: " + e);}}
function copiaHijos(elCampoOrigen,elCampoDestino){
var b=0;
var elNuevo, elAnterior;
while(this.getField(elCampoOrigen + "." + b) != null){
elAnterior = this.getField(elCampoOrigen + "." + b);
elNuevo = this.addField(elCampoDestino,elAnterior.type,elAnterior.page,elAnterior.rect);
copiaPropiedades(elAnterior,elNuevo);
b++;}
this.removeField(elCampoOrigen);}
function indiceCampo(elCampo){
if (elCampo != null){
var partes = elCampo.name.split(".");
return Number(partes[partes.length-1]);}
else return 0;}
function copiaPropiedades(antiguo,nuevo){
try{
var losElementos,tipo;
tipo = antiguo.type;
if (tipo == "checkbox" || tipo == "text" || tipo == "combobox"){
nuevo.delay = true;
if (antiguo.borderStyle != null && antiguo.borderStyle != "")
nuevo.borderStyle = antiguo.borderStyle;
if (antiguo.fillColor != null && antiguo.fillColor != "")
nuevo.fillColor = antiguo.fillColor;
if (antiguo.lineWidth != null && antiguo.lineWidth != "")
nuevo.lineWidth = antiguo.lineWidth;
if (antiguo.strokeColor != null && antiguo.strokeColor != "")
nuevo.strokeColor = antiguo.strokeColor;
if (antiguo.rotation != null && antiguo.rotation != "")
nuevo.rotation = antiguo.rotation;
if (antiguo.userName != null && antiguo.userName != "")
nuevo.userName = antiguo.userName;
if (antiguo.textColor != null && antiguo.textColor != "")
nuevo.textColor = antiguo.textColor;
nuevo.hidden = antiguo.hidden;
if (tipo == "checkbox")
nuevo.style = antiguo.style;
else if (tipo == "text" || tipo == "combobox"){
if (antiguo.defaultValue != null && antiguo.defaultValue != "")
nuevo.defaultValue = antiguo.defaultValue;
if (antiguo.textFont != null && antiguo.textFont != "")
nuevo.textFont = antiguo.textFont;
nuevo.textSize = antiguo.textSize;
if (tipo == "text") {
if (!isNaN(antiguo.charLimit))
if (antiguo.charLimit > 0)
nuevo.charLimit = antiguo.charLimit;
if (antiguo.richText){
nuevo.richText = antiguo.richText;
nuevo.richValue = antiguo.richValue;}
else
if (antiguo.value != null && antiguo.value != "")
nuevo.value = antiguo.value;
if (antiguo.alignment != null && antiguo.alignment != "")
nuevo.alignment = antiguo.alignment;
nuevo.alignment = antiguo.alignment;
nuevo.multiline = antiguo.multiline;}
else if (tipo == "combobox"){
nuevo.editable = antiguo.editable;
losElementos = new Array(antiguo.numItems);
for (var a=0; a<antiguo.numItems; a++){
losElementos[a] = antiguo.getItemAt(a);
nuevo.setItems(losElementos);}}}
nuevo.display = antiguo.display;
nuevo.delay = false;}}
catch(e){
elAsistente.escribeErrorConsola(" copiando las propiedades de los campos.\nError: " + e);}}
function quicksort(nombres){
if (nombres.length == 0)
return [];
var izq = new Array();
var der = new Array();
var pivot = nombres[0];
for (var i = 1; i < nombres.length; i++) {
if (nombres[i] < pivot)
izq.push(nombres[i]);
else
der.push(nombres[i]);}
return quicksort(izq).concat(pivot, quicksort(der));}
var MODELO="145";
///////////
// COMÚN //
///////////
var docAlterado = "ESTE DOCUMENTO HA SIDO ALTERADO.\nNo es posible abrir este documento.\nRecuerde que la AEAT facilita los\ndocumentos PDF \"como están\", y no\nestá permitido realizar modificaciones\na su estructura.";
var verVisor = "Estos documentos sólo son funcionales en\nversiones en español de Acrobat iguales o\nsuperiores a la 5.0.";
var errorCampos = "Documento erróneo.\nPor favor, comunique este error a la Agencia Tributaria.";
var capBoton1a = "Rellenar Formulario";
var capBoton1b = "Iniciar Formulario";
var descBoton1a = "Activa los campos de captura de datos";
var descBoton1b = "Borra los datos y desactiva la captura de los campos";
var capBoton2 = "Página siguiente";
var ESTADO;
var CAMPOINICIAL;
var CAB="cabecera";
var DAT="dato";
var BOT="bot.reset";
var BOTS="bot";
inicio();
function inicio(){
console.hide();
if(!esSeguro()||!visorOK())
closeDoc(true);
estados(0);
ESTADO=0;
this.layout="SinglePage";
this.zoomType=zoomtype.fitW;
app.focusRect=true;
if (existe("CodBar.Num") || existe("CodBar.Cod"))
generaDato();}
function esSeguro(){
var seguridad=this.securityHandler;
if(seguridad==null){
aviso(docAlterado);
closeDoc(true);
return false;}
else
return true;}
function visorOK(){
if((typeof app.formsVersion!="undefined")&&(app.formsVersion>=5.0))
return true;
else{
aviso(verVisor);
return false;}}
function accion(campo,accion){
var elCampo;
if(existe(campo)){
elCampo=this.getField(campo);
if(elCampo!=null){
elCampo.delay=true;
switch(accion){
case "noVeo":
elCampo.display=display.hidden;
break;
case "escr":
elCampo.display=display.visible;
elCampo.readonly=false;
break;
default:}
elCampo.delay=false;}}}
function aviso(mensaje){app.alert(mensaje,1);}
function borra(){
var campo=new Array(2);
if(existe(DAT))
campo[0]=DAT;
if(existe(CAB))
campo[1]=CAB;
this.resetForm(campo);}
function boton(){
var nombre,nombre1,este;
if(existe(BOT)){
este=this.getField(BOT);
nombre=este.buttonGetCaption();
nombre1=capBoton1a;
if(nombre==nombre1)
estados(1);
else
estados(0);
if (existe("CodBar.Num") || existe("CodBar.Cod"))
generaDato();}}
function estados(opcion){
var reset=this.getField(BOT);
var nombre1=capBoton1a;
var nombre2=capBoton1b;
var explica;
var explica1=descBoton1a;
var explica2=descBoton1b;
var elnombre;
if(existe(DAT)||existe(CAB)){
if(opcion==1){
elnombre=nombre2;
explica=explica2;
accion(DAT,"escr");
accion(CAB,"escr");
poneFoco();
ESTADO=1;}
else{
elnombre=nombre1;
explica=explica1;
accion(DAT,"noVeo");
accion(CAB,"noVeo");
ESTADO=2;
borra();}}
if(existe(CAB))
generaDato();
reset.buttonSetCaption(elnombre);
reset.userName=explica;}
function poneFoco(){
if(existe("acc.campoInicial."+this.pageNum)){
CAMPOINICIAL=this.getField("acc.campoInicial."+this.pageNum).value;
if(existe(CAMPOINICIAL)){
var paginas=this.getField(CAMPOINICIAL).page;
var correcto=false;
if (isNaN(paginas)){
for (var k = 0; k < paginas.length; k++)
if(paginas[k] == this.pageNum) correcto=true;}
else
if (paginas == this.pageNum) correcto = true;
if (correcto)
this.getField(CAMPOINICIAL).setFocus();
else
aviso(errorCampos);}}
else
return;}
function existe(campo){return(!(this.getField(campo)==null));}
/////////////
// NIF/CIF //
/////////////
var errorNIF = "ERROR EN EL NIF/CIF:\nEl NIF/CIF no es correcto.\nTeclee correctamente todos los caracteres.";
function verificaNIF(cualo){
var cuantos,laLetra,i,numero;
var elNif=cualo;
var elDato=elNif.valueAsString;
elDato=elDato.toUpperCase();
elNif.value=elDato;
if(elDato!=""){
var elPrimero=elDato.charAt(0);
var longitud=elDato.length;
if(!isNaN(elDato)){
malNIF();
elNif.setFocus();
return false;}
if((!isNaN(elPrimero))||(elPrimero=="K")||(elPrimero=="L")||(elPrimero=="M")||(elPrimero=="X")||(elPrimero=="Y")||(elPrimero=="Z")){
if(longitud<9){
ceros=9-longitud;
for(i=0;i<ceros;i++)
elDato="0"+elDato;}
numero=!isNaN(elPrimero)?elDato.substr(0,8):elDato.substr(1,7);
numero=(elPrimero=="Y")?("1"+numero):((elPrimero=="Z")?("2"+numero):numero);
if(isNaN(numero)){
malNIF();
elNif.setFocus();
return false;}
laLetra=letraDNI(numero);
if(laLetra!=elDato.charAt(8)){
malNIF();
elNif.setFocus();
return false;}}
else{
if(longitud<9){
malNIF();
elNif.setFocus();
return false;}
else{
numero=elDato.substr(1,7);
elUltimo=elDato.charAt(8);
var EJN;
if(!isNaN(elUltimo)){
if(((elPrimero>="A")&&(elPrimero<="H"))||(elPrimero=="J")||(elPrimero=="U")||(elPrimero=="V"))EJN=true;
else{
malNIF();
elNif.setFocus();
return false;}}
else
if((elUltimo>="A")&&(elUltimo<="J")){
if(((elPrimero>="A")&&(elPrimero<="G"))||(elPrimero=="N")||(elPrimero=="P")||(elPrimero=="Q")||(elPrimero=="S")||(elPrimero=="R")||(elPrimero=="W"))EJN=false;
else{malNIF();
elNif.setFocus();
return false;}}
else{
malNIF();
elNif.setFocus();
return false;}
var control=letraCIF(numero);
laLetra=EJN?((control==10)?0:control):String.fromCharCode(64+control);
if(elUltimo!=laLetra){
malNIF();
elNif.setFocus();
return false;}}}
elNif.value=elDato;
return true;}}
function malNIF(){aviso(errorNIF);}
function letraDNI(num){return "TRWAGMYFPDXBNJZSQVHLCKE".charAt(num%23);}
function letraCIF(num){
num=num.toString();
var r=0;
for(var i=0;i<num.length;i++){
par=i%2;
r+=(par==0)?preR(num.charAt(i)):parseInt(num.charAt(i));}
var u=r%10;
return(10-u);}
function preR(n){
n=parseInt(n)*2;
return (n>9)?n-9:n;}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment