#include "H\General.H"
#include "H\Disco.H"
#include "H\Credito.H"
#include "H\Calc.H"
#include "H\Teclado.H"
#include "H\Efectivo.H"
#include "H\Gastos.H"
#include "H\Inst.H"
#include "H\Pend.H"

#define BT1		"\x01"
#define BT2		"\x02"

// Para manejo de pagos adicionales (TX)
typedef struct DxTX {
	Fecha  f;
	double v;
	Int16  n;
} xTX;
// Estructura de control
typedef struct DCR {
	ID          ide;			// ID de la cuenta de créditos
	ID          ido;			// ID original de la cuenta afectada
	ID          idm;			// ID del movimiento
	ID          idc;			// ID de la cuenta
	CRE         *arg;   		// Apuntador estructura mayor en disco
	UInt8 		*col;			// Colores
	Int16 		form;			// Forma de donde se llama
	Char  		ox;				// Operación interna
	Int16 		sl;				// Selección interna
	Int16 		cres;			// Número de credito seleccionado (-1=Nuevo)
	CRE   		cre,			// Crédito cargado
	            *cret;
	MemHandle	mcret;
	MOVC  		mov,moo;		// Movimiento cargado y original
	Int16       nmv;			// Num. Mov.
	Dsl	  		sli;			// Slider activado
	OCalc       oc;				// Para calculadora y teclado
	double      si;				// Saldo inicial
	Boolean     cmb;			// Hubo cambios
	Boolean     edt;			// Está en edición
	Int8        wf,hf;			// De fechas
	MOVGA       ga;				// Para cuenta de gastos
	MOVIN       mi;         	// Para instituciones
	Boolean     ayu;			// Hay ayuda ?
	Boolean     gas;			// Hay gastos ?
	Boolean     inst;			// Hay institución ?
	Boolean     slc;			// Hay selección de cuentas ?
	Boolean     pen;			// Hay pendientes ?
	CPer		per;			// para periodo en pagos / abonos
	Int16       idf;			// Forma de regreso de periodos
	Char        inicio;			// Tipo de inicialización
	FormType    *f;				// De donde es llamado
	Int16       sla;			// Selección pago adicional
	Char        str[8][120];	// Para manejo de strings
	Char        csel;			// Campo seleccionado en editar TX
	Periodo     rpe;			// Respaldo del periodo en rpe
	Int16       pagn,paga;		// Pagos vencidos - cálculo del nuevo
	double      apag,apagx;		// Valor doc a pagar
	Char        dstx[256];		// Descripción del pago
	Fecha       fpag;			// Y fecha en que se paga
	Boolean     paggen;			// 1=Pago 0=PagoDoc
} CR;

CR 			*cre=NULL,*rsp=NULL;
MemHandle 	mcr[2];


void 	NuevoCR			(Char)											ES8;
Boolean CGB_CR			(Int16,Int8,void*)								ES8;
Boolean CGB_DetCR		(Int16,Int16,Int8,void*)						ES8;
Int16 	CntLCR			(Char,Int16,double*)							ES8;
void 	PntLScCR		(Int16,RectangleType*,char**,ListType*)			ES8;
void 	PntLResCR		(Int16,RectangleType*,char**,ListType*)			ES8;
void 	PntLDetCR		(Int16,RectangleType*,char**,ListType*)			ES8;
void 	PntLDatCR		(Int16,RectangleType*,char**,ListType*)			ES8;
Boolean ProxP			(Char*,Char,Char,Boolean)						ES8;
void 	PFormaCR		(Char,Boolean)									ES9;
void 	DatoSMA			(FormType*,Int16,Char,UInt16)					ES9;
void 	CargaTextoTC	(Int16,Char*,Int16,Char*,Boolean)				ES9;
void 	CargaTextoTX	(Int16,Char*,Int16,Char*,Char*,Char*,Boolean) 	ES9;
void 	DatosTC			(FormType*, Boolean)							ES9;
void 	PintaTC			(FormType*)										ES9;
void 	IniPosTC		(FormType*)										ES9;
Int16 	PosYTC			(Int16)											ES9;
void 	PntLPagAdi		(Int16,RectangleType*,char**,ListType*)			ES9;
void 	PonPagAdi		(FormType*)										ES9;
Boolean EnFecTX			(Char,Int16,Int16)								ES9;
void 	PonAdiTX		(FormType*,Boolean,Boolean)						ES9;
void 	CalcVP			(FormType*,Char)								ES9;
void 	PintaTX			(FormType*,Boolean)								ES9;
void 	ListaOper		(FormType*)										ES9;
void 	FinEdt  		(Char)	 										ES9;
void 	AceMov			(FormType*,Char,Boolean)						ES9;
Boolean EnFecMovCR		(Int16,Int16)	 								ES9;
void 	CalcTX			(Char,ID*,CRE*,Periodo*) 						ES9;
void 	IniMov			(FormType*,Boolean)								ES9;
void 	IniPagCR		(FormType*,Boolean)								ES9;
void 	AcePagCR		(FormType*,Boolean,Boolean)						ES9;
Boolean RetAPagos		(Char,CRE*,MOVC*)								ES9;
void	BorrarCuenta	(void)											ES9;
Boolean RevTX			(void)											ES9;
void 	AgQuMovTX		(Char,ID*,CRE*,Fecha*,UInt8)					ES9;
void 	CalcVencTX		(Boolean,Periodo*,double*)						ES9;
Char    PintaPagTX		(FormType*,Int8)								ESA;
Boolean RevPagTX		(Boolean)										ESA;
void 	PintaDocTX		(FormType*,Boolean,Boolean)						ESA;
void 	RevDocsTX		(FormType*)										ESA;
void 	CalcDocTX		(double*,double*,MOVC*,Fecha*)					ESA;
void 	IniciaListaTX	(FormType*)										ESA;

// ======================================================================
//
// BASE DE DATOS
//
// ======================================================================
// Cargar(0),guardar(1) y borrar(2) movimiento de una cuenta de crédito
Boolean CGB_DetCR(Int16 ic, Int16 im, Int8 op, void *inf) {
UInt16    NReg;
Boolean   IB;
	switch(op) {
	case 0: // Cargar
            if(!SacarNReg(1,ic,&NReg)) return false;
            if(!LeerMov(inf,NReg,im,&IB)) return false;
			return true;
	case 1: // Guardar (im==-1 -> nuevo)
	        if(im==-1) {
               if(!SacarNReg(1,ic,&NReg)) return false;
               if(!InsMov(inf,NReg)) return false;
	           break;
	        } else {
               if(!SacarNReg(1,ic,&NReg)) return false;
               if(!ModMov(inf,NReg,im)) return false;
	           break;
	        }
			return true;
	case 2: // Borrar
            if(!SacarNReg(1,ic,&NReg)) return false;
			if(!BorMov(NReg,im,true)) return false;
			return true;
	}
	return false;
}
// Nueva cuenta de crédito
void NuevaCR(void) {
	cre->cre.sa=0; cre->cre.sc=0;
	cre->cre.DInst=false; 
	StrCopy(cre->cre.num," ");
	cre->cre.dp=1;
	cre->cre.si=0;
	cre->cre.estatus=0;
	FecHoy(&(cre->cre.fr));
	switch(cre->cre.tp) {
		case 0:
		case 1:
		case 2:
		case 3:
		case 4: cre->cre.un.tc.dc=1; 
				cre->cre.un.tc.lc=0;
				StrCopy(cre->cre.un.tc.pin," ");
				cre->cre.un.tc.mdm=1; cre->cre.un.tc.mda=2005;
				cre->cre.un.tc.vdm=1; cre->cre.un.tc.vda=2005;
				cre->cre.un.tc.vhm=1; cre->cre.un.tc.vha=2005;
				StrCopy(cre->cre.un.tc.seg," ");
				StrCopy(cre->cre.un.tc.te1," ");
	       		StrCopy(cre->cre.un.tc.te2," ");
	       		break;
   		case 5:
   		case 6: 
   		case 7: cre->cre.si=0;
   				IniPer(0,&(cre->cre.un.tx.per));
   		        cre->cre.un.tx.p=1;
   		        cre->cre.un.tx.pg=0;
   		        cre->cre.un.tx.pp=0;
   		        cre->cre.un.tx.por=0;
   		        cre->cre.un.tx.pa=false;
   		        cre->cre.un.tx.fa=0;
				cre->cre.un.tx.yapag=false;
    			cre->per.p=&(cre->cre.un.tx.per); cre->per.f=FEditarCR_TX; 
    			cre->per.ayu=&(cre->ayu);  
    			cre->per.col=cre->col;	cre->per.p->v=0; 
				cre->per.r.topLeft.x=66; cre->per.r.topLeft.y=79;
				cre->per.act=true; cre->per.tp=2; cre->per.inf=&(cre->cre);
				FecHoy(&(cre->per.p->f));
   				break;
	}
	StrCopy(cre->cre.ctc," ");
}
// Cargar(0),guardar(1) y borrar(2) una cuenta de crédito
Boolean CGB_CR(Int16 ic, Int8 op, void *cta) {
UInt16  NReg;
CRE     *cre;
	cre=(CRE*)cta;	
	switch(op) {
    case 0: // Cargar
            if(!SacarNReg(1,ic,&NReg)) return false;
            if(!LeerReg(cta,NReg)) return false;
			break;
	case 1: // Guardar
	        if(ic==-1) {
    	        cre->TipoReg=1;
	            if(InsReg(cta)) return false;
	        } else {
                if(!SacarNReg(1,ic,&NReg)) return false;
	            if(ModReg(cta,NReg)) return false;
	        } break;
    case 2: // Borrar
            if(!SacarNReg(1,ic,&NReg)) return false;
	        if(BorReg(NReg,true)) return false;
        	break;
	}
	return true;
}
// Sacar cantidad de entradas de la lista
Int16 CntLCR(Char tp, Int16 it, double *v) {
Int16 	 t=0,i,tr;
Char  	 s[20];
UInt16   NReg;
CRE      cr;
	switch(tp) {
	case 2:
	case 1:	v[0]=0; v[1]=0; v[2]=0;
	        for(i=0;i<SacarTotReg();i++) {
	        	if (!LeerTipo(i,&tr)) return 0;
	        	if (tr!=1) continue;
	        	if (!LeerReg((void *)&cr,i)) return 0;
	        	if (cr.TipoReg!=1) return 0;
	        	v[0]+=cr.sa; v[1]+=cr.sc; 
	        	if (tp==2) {
	        		if (ProxP(s,cr.dp,1,true)) v[2]+=cr.sc;
	        	}
	        	t++; 
	        }
	        return t;
    case 3: if(!SacarNReg(1,it,&NReg)) return 0;
            if(!TotMov(NReg,&t)) return 0;
            return t;
    case 4: switch(cre->cre.tp) {
    	      case 0: case 1: case 2: case 3: 
    	      case 4: return 11;
    	      case 5: case 6: 
    	      case 7: return(5+cre->cre.un.tx.fa+((cre->cre.un.tx.fa>0)?1:0));
    		}
    		return 0;
	}
	return 0;
}
// ======================================================================
//
// General
//
// ======================================================================
// Inicio y término de CREDITOS
void IniciaCR(UInt8 *col, Char op, FormType *f, ID *id) {
Int16 	t,i;
double 	d[5];
ID     	in;
	switch(op) {
	case 1: mcr[0]=MemHandleNew(sizeof(CR));
			cre=(CR *)MemHandleLock(mcr[0]); break;
 	case 2: case 3: case 4: case 5: 
 	case 6: case 7:
 	        mcr[1]=MemHandleNew(sizeof(CR));
 			rsp=cre; cre=(CR *)MemHandleLock(mcr[1]); break;
 	        break;
	}
	cre->arg=(CRE *)SacarApRM();
	cre->col=col;
	cre->cret=NULL;
 	cre->cmb=false;
 	cre->edt=false;
 	cre->gas=false;
 	cre->ayu=false;
 	cre->slc=false;
 	cre->inst=false;
 	cre->pen=false;
 	cre->inicio=op;
 	cre->f=f;
 	switch(op) {
 	case 1: FrmPopupForm(FResumenCR); break;
 	// Agregar cuenta de crédito, departamento, auto, hipo, personal
 	case 2: cre->cres=-1; cre->cre.tp=0; FrmPopupForm(FEditarCR_TC); break;
 	case 3: cre->cres=-1; 
 	        FrmUpdateForm(FrmGetFormId(cre->f),85); FrmReturnToForm(0); break;
 	case 4: cre->cres=-1; cre->cre.tp=6; FrmPopupForm(FEditarCR_TX); break;
 	case 5: cre->cres=-1; cre->cre.tp=5; FrmPopupForm(FEditarCR_TX); break;
 	case 6: cre->cres=-1; cre->cre.tp=7; 
 	        FrmUpdateForm(FrmGetFormId(cre->f),85); FrmReturnToForm(0); break;
 	// Ver cuenta
 	case 7: t=CntLCR(1,0,d);
 	 	    for (i=0;i<t;i++) {
				CGB_CR(i,0,&(cre->cre)); SacarID(&in);
 	 	    	if (id->r==in.r) break;
 	 	    }
 	 	    cre->ox=0; 
 	 	    LeerConID(id,&(cre->cre),true); 
 	 	    cre->cres=i; FrmPopupForm(FVerDatosCR);
 	 	    break;
 	}
}
Boolean FinalizaCR(Boolean home) {
Boolean cmb;
CR      *ap;
	if (home) {	if (rsp==NULL) ap=cre;	else ap=rsp; } else ap=cre;
	if (ap->ayu)  FinAyuda(); 
	if (ap->gas)  FinalizaGA();
	if (ap->slc)  FinalizaCuentas();
	if (ap->inst) FinalizaIN();
	if (ap->pen)  FinalizaPendientes();
	cmb=ap->cmb;
	if (ap->cret!=NULL) { MemHandleFree(ap->mcret); ap->cret=NULL; }
	switch(ap->inicio) {
	case 1: MemHandleUnlock(mcr[0]); MemHandleFree(mcr[0]); break;
 	case 2: case 3: case 4: case 5: 
 	case 6: MemHandleUnlock(mcr[1]); MemHandleFree(mcr[1]); cre=rsp; rsp=NULL; break;
	}
	return cmb;
}
// Calcular proxima fecha de pago tp-> 1=DD/MM 2=D MMM 3=D Mes
// Regresa si el pago es en este mes
Boolean ProxP(Char *s, Char dp, Char tp, Boolean revfest) {
DateTimeType d;	
Char    q[5],t[50],ss[3];
Boolean r=false;
	TimSecondsToDateTime(TimGetSeconds(),&d);
	if (tp>1) {
		if (d.day<=dp) { r=true; RMes(t,d.month-1,(tp!=3)); }
		else if (d.month==12) RMes(t,0,(tp!=3)); 
		     else RMes(t,d.month,(tp!=3));
		StrIToA(s,dp); StrCat(s," "); StrCat(s,t);
	}
	else {
		ss[0]=PrefGen(3); ss[1]=0;
		if (d.day>dp) { if (d.month==12) d.month=1; else d.month++; }
		else r=true;
		t[0]=0; StrIToA(q,d.month);	if (d.month<10) StrCopy(t,"0"); StrCat(t,q);
		s[0]=0; StrIToA(q,dp); if (dp<10) StrCopy(s,"0"); StrCat(s,q);
		StrCat(s,ss); StrCat(s,t);
	}
	return r;
}
// Pintar formas
// tp 1=Resumen     2=Res. al corte  3=Detalle Cta.  4=Ver Datos
//    5=Edt. datos  6=Sel-Mes-Año    7=Reg. Mov.
void PFormaCR(Char tp, Boolean ini) {
Int16 		fc,i,x,y,w,h;
Char  		s[50],cg;
FormType 	*f;
double      v[5],e;
UInt8       k;
UInt16   	a=2005;
Char     	m=0,T[50]; 
Int8        aa;
MOVIN       mv;
Fecha       fh;
    x=1; y=16; w=158; h=FntCharHeight(); f=FrmGetActiveForm(); cg=PrefGen(1);
    switch(tp) {
   	case  1:
    case  2: if (ini) FrmDrawForm(f);
    		 EliminaMarco(f,110,(ListDrawDataFuncPtr)((tp==1)?PntLResCR:PntLScCR),
    		              CntLCR(tp,cre->cres,v),ini,cre->cres);
             PintaB(255,x,y,w,8+(h*2),8,9,1,2,true,cre->col);
	    	 x+=4; y+=4;
	    	 if (tp==1) {
		    	SacaTexto(T,2100,0,sizeof(T)); PonTexto(T,x,y,B,I,0,false,-1,cre->col[8],&aa);
		    	SacaTexto(T,2100,1,sizeof(T)); PonTexto(T,100,y,B,D,50,false,-1,cre->col[8],&aa);
		    	SacaTexto(T,2100,2,sizeof(T)); PonTexto(T,150,y,B,D,50,false,-1,cre->col[8],&aa); y+=h+1;
		    	SacaTexto(T,2100,3,sizeof(T)); PonTexto(T,x,y,N,I,0,false,-1,cre->col[8],&aa);
		    	Astr(v[0],s,&k); PonTexto(s,100,y,N,D,50,false,((v[0]<0)?cre->col[5]:-1),cre->col[8],&aa);
		    	Astr(v[1],s,&k); PonTexto(s,150,y,N,D,50,false,((v[1]<0)?cre->col[5]:-1),cre->col[8],&aa);
	    	 }
	    	 else {
	    		SacaTexto(T,2100,4,sizeof(T)); PonTexto(T,x,y,B,I,0,false,-1,cre->col[8],&aa);
	    		Astr(v[2],s,&k); PonTexto(s,155,y,N,D,50,false,((v[2]<0)?cre->col[5]:-1),cre->col[8],&aa); y+=h+1;
	    		SacaTexto(T,2100,5,sizeof(T)); PonTexto(T,x,y,B,I,0,false,-1,cre->col[8],&aa);
	    		Astr(v[1],s,&k); PonTexto(s,155,y,N,D,50,false,((v[1]<0)?cre->col[5]:-1),cre->col[8],&aa);
	    		SacaTexto(cre->str[5],2100,((cre->ox==1)?6:7),sizeof(cre->str[5])); 
	    		CtlSetLabel(GetObjPtr(f,1010),cre->str[5]);
	    	 }
	    	 break;
   	case  4:
   	case  3: if (ini) {
   				FrmDrawForm(f); 
   				if (tp==3)
   				if (cre->cre.tp==5 || cre->cre.tp==6 || cre->cre.tp==7) {
   					SacaTexto(cre->str[7],2100,109,sizeof(cre->str[7])); 
	    			CtlSetLabel(GetObjPtr(f,1001),cre->str[7]);
   				}
   				if (tp==3) {
   					if (!HayPendientes())  FrmHideObject(f,FrmGetObjectIndex(f,BPen)); 
   					CGB_CR(cre->cres,0,&(cre->cre));
   					SacarID(&(cre->idc));
   				}
   			 }
    		 EliminaMarco(f,110,(ListDrawDataFuncPtr)((tp==3)?PntLDetCR:PntLDatCR),
    		              CntLCR(tp,cre->cres,v),ini,((tp==3)?cre->nmv:cre->sl));
             PintaB(255,x,y,w,36+(FntCharHeight()*3),8,9,(cg>2)?1:9,(cg>2)?2:0,true,cre->col);
    		 x=3; y=18; PintaImagen(2100+cre->cre.tp,x,y); x+=42; y++; x+=((160-x)/2);
    		 y+=(1+PonTexto(cre->cre.num,x,y,N,C,0,false,-1,cre->col[8],&aa));
        	 if (cre->cre.DInst) { 
        	 	LeerConID(&(cre->cre.Inst_ID),&mv,false);
    		    PonTexto(mv.Nom,x,y,B,C,0,false,-1,cre->col[8],&aa);
       		 }
    		 if (cg>1) PintaB(255,3,45,153,4+(FntCharHeight()*3),8,1,(cg>2)?2:0,8,true,cre->col);
    		 y=47; 
    		 SacaTexto(T,2100,8,sizeof(T)); PonTexto(T,6,y,B,I,0,false,cre->col[3],cre->col[8],&aa); 
    		 AstrX(cre->cre.sa,s,true,true); y+=PonTexto(s,152,y,B,D,0,false,((cre->cre.sa<0)?cre->col[5]:-1),cre->col[8],&aa);
    		 SacaTexto(T,2100,5,sizeof(T)); PonTexto(T,6,y,B,I,0,false,cre->col[3],cre->col[8],&aa); 
    		 AstrX(cre->cre.sc,s,true,true); y+=PonTexto(s,152,y,B,D,0,false,((cre->cre.sc<0)?cre->col[5]:-1),cre->col[8],&aa);
    		 SacaTexto(T,2100,9,sizeof(T)); PonTexto(T,6,y,B,I,0,false,cre->col[3],cre->col[8],&aa); 
    		 ProximoPago(0,&fh,cre->cre.dp,2);
    		 ProxP(s,cre->cre.dp,2,true); y+=PonTexto(s,152,y,B,D,0,false,-1,cre->col[8],&aa);
    		 if (cre->inicio==7) {
    		 	FrmHideObject(f,FrmGetObjectIndex(f,BBor));
    		 	FrmHideObject(f,FrmGetObjectIndex(f,BHom));
    		 }
    		 break;
	case  5: if (ini) {
				if (cre->cres!=-1) CGB_CR(cre->cres,0,&(cre->cre)); 
	         	else NuevaCR();
			 }
	         switch(cre->cre.tp) {
			 case 0: case 1: case 2: case 3:
			 case 4: if (ini) { 
			 			if (cre->cres!=1) { SacaTexto(T,2100,10,sizeof(T)); FrmCopyTitle(f,T); } 
			 		 	FrmDrawForm(f); 
			 		 }
			 		 break;
			 case 5: case 6:
			 case 7: if (ini) { 
			 			if (cre->cres!=1) { SacaTexto(T,2100,(cre->cre.tp==5)?11:(cre->cre.tp==6)?12:97,sizeof(T)); FrmCopyTitle(f,T); } 
			 		 	FrmDrawForm(f); 
			 		 }
			 		 break;
	         }
			 break;
	case  6: if (ini) FrmDrawForm(f); h+=3;
       	     for (i=0;i<3;i++) FrmHideObject(f,FrmGetObjectIndex(f,100+i));
       	     FrmHideObject(f,FrmGetObjectIndex(f,BAce));
       	     FrmHideObject(f,FrmGetObjectIndex(f,BCan));
			 y=14; PintaB(255,0,y-2,152,110-y+3,8,0,0,0,false,cre->col); 
			 y+=2; PintaB(255,2,y,146,h+4,8,1,2,8,true,cre->col); 
			 switch(cre->sl) {
				case 1: SacaTexto(T,2100,13,sizeof(T)); PonTexto(T,80,y+3,B,C,0,false,cre->col[0],cre->col[8],&aa); 
				        m=cre->cre.un.tc.mdm; a=cre->cre.un.tc.mda; break;
				case 2: SacaTexto(T,2100,14,sizeof(T)); PonTexto(T,80,y+3,B,C,0,false,cre->col[0],cre->col[8],&aa);  
						m=cre->cre.un.tc.vdm; a=cre->cre.un.tc.vda; break;
				case 3: SacaTexto(T,2100,15,sizeof(T)); PonTexto(T,80,y+3,B,C,0,false,cre->col[0],cre->col[8],&aa);  
						m=cre->cre.un.tc.vhm; a=cre->cre.un.tc.vha; break;
			 }
			 y+=(h+10);
			 PintaB(255,4,y,70,(h*3)+8,9,2,0,1,true,cre->col);
			 PintaB(255,5,y+1,68,h,1,0,0,0,false,cre->col);
			 SacaTexto(T,2100,16,sizeof(T)); PonTexto(T,39,y+2,B,C,0,false,cre->col[0],cre->col[1],&aa);
			 PintaB(255,78,y,71,(h*3)+8,9,2,0,1,true,cre->col);
			 PintaB(255,79,y+1,69,h,1,0,0,0,false,cre->col);
			 SacaTexto(T,2100,17,sizeof(T)); PonTexto(T,113,y+2,B,C,0,false,cre->col[0],cre->col[1],&aa);
			 y+=(h+3);
			 PintaB(255,97,y,33,17,2,2,1,2,true,cre->col);
    		 FrmSetObjectPosition(f,FrmGetObjectIndex(f,102),103,y+4); 
    		 y+=3; slIni(&cre->sli,GetObjPtr(f,102), 1900,2099,a, 84,y,135,y,7,12, 82,y+20,62,3,cre->col);
    		 Lista(GetObjPtr(f,100),GetObjPtr(f,101),m,true,0,NULL);
			 FrmSetObjectPosition(f,FrmGetObjectIndex(f,100),6,y+5);
			 fc=WinSetBackColor(cre->col[9]);
       	     for (i=0;i<3;i++) FrmShowObject(f,FrmGetObjectIndex(f,100+i));
       	     FrmShowObject(f,FrmGetObjectIndex(f,BAce));
       	     FrmShowObject(f,FrmGetObjectIndex(f,BCan));
			 WinSetBackColor(fc);
		 	 break;
	case  7: if (ini) FrmDrawForm(f); 
	         y=16; PintaB(255,x,y,w,4+(h*4),8,9,1,2,true,cre->col); y+=2;
    		 SacaTexto(T,2100,8,sizeof(T)); PonTexto(T,6,y,B,I,0,false,cre->col[3],cre->col[8],&aa); 
    		 AstrX(cre->cre.sa,s,true,true); y+=PonTexto(s,152,y,B,D,0,false,((cre->cre.sa<0)?cre->col[5]:-1),cre->col[8],&aa);
    		 if (cre->mov.tp==1) { SacaTexto(T,2100,5,sizeof(T)); e=cre->cre.sc; }
    		 else { SacaTexto(T,2100,18,sizeof(T)); e=cre->cre.un.tc.lc+cre->cre.sa; }
   		 	 PonTexto(T,6,y,B,I,0,false,cre->col[3],cre->col[8],&aa); 
    		 AstrX(e,s,true,true); y+=PonTexto(s,152,y,B,D,0,false,((e<0)?cre->col[5]:-1),cre->col[8],&aa);
    		 SacaTexto(T,2100,9,sizeof(T)); PonTexto(T,6,y,B,I,0,false,cre->col[3],cre->col[8],&aa); 
    		 ProxP(s,cre->cre.dp,2,true); y+=PonTexto(s,152,y,B,D,0,false,-1,cre->col[8],&aa);
    		 SacaTexto(T,2100,19,sizeof(T)); PonTexto(T,6,y,B,I,0,false,cre->col[3],cre->col[8],&aa); 
    		 ProxP(s,cre->cre.un.tc.dc,2,false); y+=PonTexto(s,152,y,B,D,0,false,-1,cre->col[8],&aa);
    		 break;
    }
}
// **********************************************************************
//
// EDITAR DATOS CUENTA DE CREDITO
//
// **********************************************************************
// ----------------------------------------------------------------------
// TC 
// Capturar mes / año
Boolean SmaTC(EventType* pEvent) {
Int16 v;
	switch (pEvent->eType) {
		case frmOpenEvent:
			PFormaCR(6,true); return true;
		case keyDownEvent:
			slCamp(&cre->sli,cre->col);
			return true;
		case ctlSelectEvent:
		    switch(pEvent->data.ctlSelect.controlID) { 
		    	case BAce: v=LstGetSelection(GetObjPtr(FrmGetActiveForm(),101));
		    	           switch(cre->sl) {
		    	           	 case 1: cre->cre.un.tc.mdm=v; cre->cre.un.tc.mda=cre->sli.v; break;
		    	             case 2: cre->cre.un.tc.vdm=v; cre->cre.un.tc.vda=cre->sli.v; break;
		    	             case 3: cre->cre.un.tc.vhm=v; cre->cre.un.tc.vha=cre->sli.v; break;
		    			   }
		    	           FrmReturnToForm(0); 
						   switch(cre->sl) {
		    	           	 case 1: DatoSMA(FrmGetActiveForm(),213,cre->cre.un.tc.mdm,cre->cre.un.tc.mda); break;
		    	             case 2: DatoSMA(FrmGetActiveForm(),215,cre->cre.un.tc.vdm,cre->cre.un.tc.vda); break;
		    	             case 3: DatoSMA(FrmGetActiveForm(),217,cre->cre.un.tc.vhm,cre->cre.un.tc.vha); break;
						   }
		    	           return true;
		    	case BCan: FrmReturnToForm(0); return true;
		    }
		    break;
        case ctlEnterEvent:
            switch(pEvent->data.ctlEnter.controlID) {
        	case 100:
        	   Lista(GetObjPtr(FrmGetActiveForm(),100),GetObjPtr(FrmGetActiveForm(),101),0,false,0,NULL);
			   v=37+(2*FntCharHeight());
			   PintaB(255,5,v,68,21,9,9,9,9,false,cre->col);
			   v=WinSetBackColor(cre->col[9]); 
			   FrmShowObject(FrmGetActiveForm(),FrmGetObjectIndex(FrmGetActiveForm(),100));
			   WinSetBackColor(v);
        	   return true;
            }
        	break;
        case penDownEvent:
            return slCnt(&cre->sli,1,pEvent->screenX,pEvent->screenY,cre->col);
        case penUpEvent:
            return slCnt(&cre->sli,2,pEvent->screenX,pEvent->screenY,cre->col);
        case penMoveEvent:
            return slCnt(&cre->sli,3,pEvent->screenX,pEvent->screenY,cre->col);
		default: break;
	}
	return false;
}
// Obtener / Poner info del / en diálogo
void DatoSMA(FormType *f, Int16 id, Char m, UInt16 a) {
Char  	st[150],tt[120];
Char    T[150];
  	SacaTexto(T,2100,m+20,sizeof(T)); StrCopy(st,T); StrIToA(tt,a); 
  	StrCat(st,tt); FrmCopyLabel(f,id,st);
}
void DatosTC(FormType *f, Boolean poner) {
Char st[150];
	switch(cre->sl) {
	case 1: if (poner) {
	        	if (!cre->cre.DInst) 
       	       		   Lista(GetObjPtr(FrmGetActiveForm(),201),GetObjPtr(FrmGetActiveForm(),202),0,true,80,cre->str[0]);
       	    	else { LeerConID(&(cre->cre.Inst_ID),&(cre->mi),false);
       	    		   AjustaSTR(cre->str[0],cre->mi.Nom,80);
       	           	   CtlSetLabel(GetObjPtr(FrmGetActiveForm(),201),cre->str[0]); }
	        	Texto(cre->cre.num,GetObjPtr(f,203),true);
	        	Lista(GetObjPtr(f,204),GetObjPtr(f,205),cre->cre.tp,true,0,NULL);
	        	AstrX(cre->cre.si,st,false,true); Texto(st,GetObjPtr(f,207),true);
				Lista(GetObjPtr(f,209),GetObjPtr(f,211),cre->cre.un.tc.dc-1,true,0,NULL);
				Lista(GetObjPtr(f,210),GetObjPtr(f,211),cre->cre.dp-1,true,0,NULL);
	        	AstrX(cre->cre.un.tc.lc,st,false,false); Texto(st,GetObjPtr(f,212),true);
			}
			else {
	        	Texto(cre->cre.num,GetObjPtr(f,203),false);
	        	Texto(st,GetObjPtr(f,207),false); cre->cre.si=AdblX(st);
	        	Texto(st,GetObjPtr(f,212),false); cre->cre.un.tc.lc=AdblX(st);
			}
	        break;
	case 2: if (poner) {
		        Texto(cre->cre.un.tc.pin,GetObjPtr(f,203),true);
		        DatoSMA(f,213,cre->cre.un.tc.mdm,cre->cre.un.tc.mda);
		        DatoSMA(f,215,cre->cre.un.tc.vdm,cre->cre.un.tc.vda);
		        DatoSMA(f,217,cre->cre.un.tc.vhm,cre->cre.un.tc.vha);
		        Texto(cre->cre.un.tc.seg,GetObjPtr(f,212),true);
		        Texto(cre->cre.un.tc.te1,GetObjPtr(f,219),true);
		        Texto(cre->cre.un.tc.te2,GetObjPtr(f,220),true);
			}
			else {
		        Texto(cre->cre.un.tc.pin,GetObjPtr(f,203),false);
		        Texto(cre->cre.un.tc.seg,GetObjPtr(f,212),false);
		        Texto(cre->cre.un.tc.te1,GetObjPtr(f,219),false);
		        Texto(cre->cre.un.tc.te2,GetObjPtr(f,220),false);
			}
	        break;
	}
}
// pintar el diálogo
void PintaTC(FormType *f) {
Int16 bc,i,y,h;
Char  T[150];
Int8  a;
	for (i=1;i<10;i++) FrmHideObject(f,FrmGetObjectIndex(f,100+i));
   	for (i=1;i<21;i++) if (i!=8 && i!=6) FrmHideObject(f,FrmGetObjectIndex(f,200+i));
   	if (cre->sl==0) cre->sl=1;
    h=FntCharHeight()+3; y=19; 
	PintaB(255,0,y,159,(h*8)+10,9,2,0,1,true,cre->col); y+=(h+4);
	PintaB(255,65,y,93,(h*7)+4,2,1,2,9,true,cre->col);  y=21; 
	PintaB(255,3,y,154,h,6,0,0,0,false,cre->col);
	SacaTexto(T,2100,((cre->sl==1)?46:47),sizeof(T)); PonTexto(T,80,y+1,B,C,0,false,-1,cre->col[6],&a);
	y+=(h+1);
	PintaB(255,5,y,52,(h*7)+4,9,0,0,0,false,cre->col);
	switch(cre->sl) {
	case 1: for (i=1;i<10;i++) { SacaTexto(T,2100,i+32,sizeof(T)); FrmCopyLabel(f,100+i,T); }
			y=24+(2*h); 
	        FrmSetObjectPosition(f,FrmGetObjectIndex(f,203),70,y); y+=(5*h); 
	        FrmSetObjectPosition(f,FrmGetObjectIndex(f,212),70,y);
        	bc=WinSetBackColor(cre->col[9]);
			for (i=1;i<8;i++) FrmShowObject(f,FrmGetObjectIndex(f,100+i));
        	WinSetBackColor(cre->col[2]);
			for (i=1;i<13;i++) if (i!=5 && i!=8 && i!=11 && i!=6) 
				FrmShowObject(f,FrmGetObjectIndex(f,200+i));
			for (i=8;i<10;i++) FrmShowObject(f,FrmGetObjectIndex(f,100+i));
			CtlSetLabel(GetObjPtr(f,BSB),BT2);
	        DatosTC(f,true);
	        break;
    case 2: bc=WinSetBackColor(cre->col[9]);
			for (i=1;i<8;i++) { 
				StrCopy(T," ");
		    	     if (i>=1 && i<3) SacaTexto(T,2100,41+i,sizeof(T));
		    	else if (i>=3 && i<5) SacaTexto(T,2100,11+i,sizeof(T));
		    	else if (i==7) SacaTexto(T,2100,93,sizeof(T));
		    	else SacaTexto(T,2100,i+39,sizeof(T));
    			FrmCopyLabel(f,100+i,T); 
    			FrmShowObject(f,FrmGetObjectIndex(f,100+i));
    		}
	        WinSetBackColor(cre->col[2]);
			y=24+h;
	        FrmSetObjectPosition(f,FrmGetObjectIndex(f,203),70,y); y+=(4*h); 
	        FrmSetObjectPosition(f,FrmGetObjectIndex(f,212),70,y);
			for (i=12;i<21;i++) FrmShowObject(f,FrmGetObjectIndex(f,200+i));
			FrmShowObject(f,FrmGetObjectIndex(f,203));
			CtlSetLabel(GetObjPtr(f,BSB),BT1);
	        DatosTC(f,true);
            break;
	}
	WinSetBackColor(bc);
}
// Iniciar posiciones de los campos
void IniPosTC(FormType *f) {
Int16 y,h;
	h=FntCharHeight()+3; y=19+(h+6);
    FrmSetObjectPosition(f,FrmGetObjectIndex(f,101),2,y);
    FrmSetObjectPosition(f,FrmGetObjectIndex(f,201),67,y);
    FrmSetObjectPosition(f,FrmGetObjectIndex(f,202),70,y);      y+=h; 
    FrmSetObjectPosition(f,FrmGetObjectIndex(f,102),2,y);
    FrmSetObjectPosition(f,FrmGetObjectIndex(f,213),70,y); 
    FrmSetObjectPosition(f,FrmGetObjectIndex(f,214),142,y);     y+=h; 
    FrmSetObjectPosition(f,FrmGetObjectIndex(f,103),2,y);
    FrmSetObjectPosition(f,FrmGetObjectIndex(f,204),67,y);
    FrmSetObjectPosition(f,FrmGetObjectIndex(f,205),70,y); 
    FrmSetObjectPosition(f,FrmGetObjectIndex(f,215),70,y); 
    FrmSetObjectPosition(f,FrmGetObjectIndex(f,216),142,y);     y+=h; 
    FrmSetObjectPosition(f,FrmGetObjectIndex(f,104),2,y);
    FrmSetObjectPosition(f,FrmGetObjectIndex(f,207),70,y); 
    FrmSetObjectPosition(f,FrmGetObjectIndex(f,217),70,y); 
    FrmSetObjectPosition(f,FrmGetObjectIndex(f,218),142,y);     y+=h; 
    FrmSetObjectPosition(f,FrmGetObjectIndex(f,105),2,y);
    FrmSetObjectPosition(f,FrmGetObjectIndex(f,209),67,y); 
    FrmSetObjectPosition(f,FrmGetObjectIndex(f,108),97,y);      y+=h; 
    FrmSetObjectPosition(f,FrmGetObjectIndex(f,106),2,y);
    FrmSetObjectPosition(f,FrmGetObjectIndex(f,210),67,y); 
    FrmSetObjectPosition(f,FrmGetObjectIndex(f,219),70,y); 
    FrmSetObjectPosition(f,FrmGetObjectIndex(f,109),97,y);      y+=h; 
    FrmSetObjectPosition(f,FrmGetObjectIndex(f,107),2,y);
    FrmSetObjectPosition(f,FrmGetObjectIndex(f,220),70,y); 
}

Int16 PosYTC(Int16 s) { return (25+((5+s)*(FntCharHeight()+3))); }

void CalcTX(Char op, ID *id, CRE *c, Periodo *p) {
Fecha  		f,h,g;
double 		v;
void   		*inf1;
Int16 		i,t;
xTX    		*ap,tx;
MemHandle 	mh;
Boolean     sig;
	switch(op) {
	case 1: // Eliminar vencidos adicionales ya pagados
			// Agregar nuevos
			if (cre->paga>0) {
				mh=MemHandleNew(sizeof(xTX)*cre->paga);
				ap=(xTX*)MemHandleLock(mh);
				for (t=i=0;i<cre->cre.un.tx.fa;i++) {
					MemMove(&h,&(cre->cre.un.tx.pga[i].f),sizeof(Fecha));
					do { MemMove(&g,&h,sizeof(Fecha));
			     		 PasarFDL(cre->per.p->v4,(Int16)cre->per.p->da,&g);
			     		 if (Pasada(&g) && t<cre->paga) { 
			     		 	MemMove(&(ap[t].f),&g,sizeof(Fecha));
			     		 	ap[t].v=cre->cre.un.tx.pga[i].v; 
			     		 	ap[t].n=i; t++;
			     		 } else break;
			     		 if (cre->cre.un.tx.pga[i].rep==0) break;
			     		 SumarMeses(cre->cre.un.tx.pga[i].rep,&h);
					} while(1==1);
				}
				do { sig=false; for (i=0;i<t-1;i++) if (Comp2Fec(&(ap[i].f),&(ap[i+1].f))==1) {
						MemMove(&tx,&(ap[i]),sizeof(xTX));
						MemMove(&(ap[i]),&(ap[i+1]),sizeof(xTX));
						MemMove(&(ap[i+1]),&tx,sizeof(xTX));
						sig=true;
				     }
				} while (sig==true);
				i=(Int16)(c->un.tx.pagva);
				for (;i<cre->paga;i++) AgQuMovTX(2,id,c,&(ap[i].f),ap[i].n);
				MemHandleUnlock(mh); MemHandleFree(mh);
			} 
			// Eliminar vencidos normales ya pagados
			// Actualizar prox. fecha de pago y agregar nuevos
	        if (c->un.tx.pagvn>0) {
	        	v=c->un.tx.pagvn;
	        	while (v>0) { c->sa+=c->un.tx.pp; c->un.tx.pg++; v--; ProxFPPer(&(p->f),p,3); }
			}
			MemMove(&f,&(p->f),sizeof(Fecha)); ProxFPPer(&f,p,2);
			while (!Futura(&f) && c->un.tx.pg<c->un.tx.p) {
				AgQuMovTX(1,id,c,&f,0); ProxFPPer(&(p->f),p,3);
				MemMove(&f,&(p->f),sizeof(Fecha)); ProxFPPer(&f,p,2);
			}
			// Actualizar registros
			inf1=SacarApRM(); MemMove(inf1,c,sizeof(CRE)); CGB_ID(id,4);
	 		break;
	case 2: ProxFPPer(&(p->f),p,1); AgQuMovTX(0,id,c,&f,0); break;
	}
}
// Principal Editar datos TC
void FinEdt(Char op) {
Fecha fc,fp;
ID    id;
	    if (!cre->edt) return; cre->edt=false;
		switch(op) {
		case  0: // Solo borrar estructuras
		         break;
		case  1: // Guardar
				 switch(cre->cre.tp) {
				 case 0: case 1: case 2: case 3:
				 case 4: DatosTC(FrmGetActiveForm(),false);
				 		 cre->cre.sa=cre->cre.sa-cre->si+cre->cre.si;
				 		 cre->cre.sc=cre->cre.sc-cre->si+cre->cre.si;
				 		 ProximoPago(0,&fp,cre->cre.dp,2); ProximoPago(0,&fc,cre->cre.un.tc.dc,3);
				 		 MemMove(&(cre->cre.fr),((Comp2Fec(&fp,&fc)==-1)?&fp:&fc),sizeof(Fecha));
				 		 cre->cmb=true; CGB_CR(cre->cres,1,&(cre->cre));
				 		 break;
				 case 5: 
				 case 6:
				 case 7: cre->cmb=true; 
				         CGB_CR(cre->cres,1,&(cre->cre)); SacarID(&id);
				         cre->cre.sa=cre->cre.sa+cre->si-cre->cre.si;
				         FecHoy(&(cre->cre.fr));
				 		 if (cre->cres!=-1) CalcTX(2,&id,&(cre->cre),cre->per.p);
				 		 CalcTX(1,&id,&(cre->cre),cre->per.p);
				 		 break;
				 }
				 
		         break;
		case  2: // Cancelar
				 cre->cret=(CRE *)MemHandleLock(cre->mcret);
				 MemMove(&cre->cre,cre->cret,sizeof(CRE));
				 MemHandleUnlock(cre->mcret);
		         break;
		}
		if (cre->cret!=NULL) { MemHandleFree(cre->mcret); cre->cret=NULL; }
		switch(cre->inicio) {
		case  1: if (op!=0) FrmUpdateForm(((cre->cres==-1)?FResumenCR:FVerDatosCR),98);
				 break;
		default: FrmUpdateForm(FrmGetFormId(cre->f),85+op); break;
		}
		FrmReturnToForm(0);
}
Boolean EditarCR_TC(EventType* pEvent) {
Int16    v;
	switch (pEvent->eType) {
		case frmUpdateEvent:
			switch(pEvent->data.frmUpdate.updateCode) {
			case 70: break;
			case 90: cre->ayu=false; break;
			case 80: cre->cre.DInst=true; 
			case 81: cre->inst=false; break;
			default: return false;
			}
			PFormaCR(5,false); PintaTC(FrmGetActiveForm()); return true;
		case frmOpenEvent:
			cre->sl=0; 
			cre->mcret=MemHandleNew(sizeof(CRE));
			cre->cret=(CRE *)MemHandleLock(cre->mcret);
			MemMove(cre->cret,&cre->cre,sizeof(CRE));
			MemHandleUnlock(cre->mcret);
		    IniPosTC(FrmGetActiveForm()); 
		    PFormaCR(5,true); PintaTC(FrmGetActiveForm());
		    PonBotonCT(&(cre->oc),0,0,NULL,NULL,FrmGetActiveForm(),0,2100,0);
		    cre->si=cre->cre.si; cre->cmb=false; cre->edt=true;
			return true;
		case ctlSelectEvent:
		    switch(pEvent->data.ctlSelect.controlID) {
		   	case BAyu: DatosTC(FrmGetActiveForm(),false);
		   	           cre->ayu=Ayuda(2110,1,cre->col,FResumenCR); return true;
	        case  214: DatosTC(FrmGetActiveForm(),false);
	                   cre->sl=1; FrmPopupForm(FSmaTC); return true;
	        case  216: DatosTC(FrmGetActiveForm(),false);
	                   cre->sl=2; FrmPopupForm(FSmaTC); return true;
	        case  218: DatosTC(FrmGetActiveForm(),false);
	                   cre->sl=3; FrmPopupForm(FSmaTC); return true;
			case BCal: DatosTC(FrmGetActiveForm(),false);
					   OpBotonCT(&(cre->oc)); return true;
		   	case BAce: FinEdt(1); return true;
		   	case BCan: FinEdt(2); return true;
		    }
		    break;
	    case fldEnterEvent:
            switch(pEvent->data.fldEnter.fieldID) {
           	case  203: if (cre->sl==2) PonBotonCT(&(cre->oc),2,203,NULL,cre->cre.un.tc.pin,FrmGetActiveForm(),sizeof(cre->cre.un.tc.pin),2100,59);
           			   else PonBotonCT(&(cre->oc),2,203,NULL,cre->cre.num,FrmGetActiveForm(),sizeof(cre->cre.num),2100,75); return false;
            case  219: PonBotonCT(&(cre->oc),2,219,NULL,cre->cre.un.tc.te1,FrmGetActiveForm(),sizeof(cre->cre.un.tc.te1),2100,62); return false;
            case  220: PonBotonCT(&(cre->oc),2,219,NULL,cre->cre.un.tc.te2,FrmGetActiveForm(),sizeof(cre->cre.un.tc.te2),2100,62); return false;
            case  212: if (cre->sl==2) PonBotonCT(&(cre->oc),2,212,NULL,cre->cre.un.tc.seg,FrmGetActiveForm(),sizeof(cre->cre.un.tc.seg),2100,61); 
            		   else PonBotonCT(&(cre->oc),1,212,&(cre->cre.un.tc.lc),NULL,FrmGetActiveForm(),0,2100,0); return false;
           	case  207: PonBotonCT(&(cre->oc),1,207,&(cre->cre.si),NULL,FrmGetActiveForm(),0,2100,0);return false;
           	default  : PonBotonCT(&(cre->oc),0,0,NULL,NULL,FrmGetActiveForm(),0,2100,0); return false;
            }
            break;
        case ctlEnterEvent:
            switch(pEvent->data.ctlEnter.controlID) {
            case  201: v=LstPopupList(GetObjPtr(FrmGetActiveForm(),202));
            		   switch(v) {
            		   case 0: cre->cre.DInst=false; break;
            		   case 1: cre->inst=true; IniciaInst(2,FEditarCR_TC,&cre->cre.Inst_ID,cre->cre.DInst,cre->col); break;
        	           case 2: PintaTC(FrmGetActiveForm()); break;
            		   }
        	           return true;
        	case 204:
        	   cre->cre.tp=Lista(GetObjPtr(FrmGetActiveForm(),204),GetObjPtr(FrmGetActiveForm(),205),0,false,0,NULL);
        	   switch(cre->cre.tp) {
       	   	   case 0: StrCopy(cre->cre.ctc,"AMX"); break;
       	   	   case 1: StrCopy(cre->cre.ctc,"DNCL"); break;
       	   	   case 2: StrCopy(cre->cre.ctc,"DISC"); break;
       	   	   case 3: StrCopy(cre->cre.ctc,"MC"); break;
       	   	   case 4: StrCopy(cre->cre.ctc,"VISA"); break;
        	   }
        	   return true;
        	case 209:
	           FrmSetObjectPosition(FrmGetActiveForm(),FrmGetObjectIndex(FrmGetActiveForm(),211),63,PosYTC(0));
	           LstSetSelection(GetObjPtr(FrmGetActiveForm(),211),cre->cre.un.tc.dc);
	           cre->cre.un.tc.dc=1+Lista(GetObjPtr(FrmGetActiveForm(),209),GetObjPtr(FrmGetActiveForm(),211),0,false,0,NULL);
        	   return true;
        	case 210:
	           FrmSetObjectPosition(FrmGetActiveForm(),FrmGetObjectIndex(FrmGetActiveForm(),211),63,PosYTC(1));
	           LstSetSelection(GetObjPtr(FrmGetActiveForm(),211),cre->cre.dp);
	           cre->cre.dp=1+Lista(GetObjPtr(FrmGetActiveForm(),210),GetObjPtr(FrmGetActiveForm(),211),0,false,0,NULL);
        	   return true;
        	}
        	break;
	    case ctlRepeatEvent:
	    	DatosTC(FrmGetActiveForm(),false);
		   	cre->sl=((cre->sl==1)?2:1); PintaTC(FrmGetActiveForm()); 
		   	return true;
		default: break;
	}
	return false;
}
// ----------------------------------------------------------------------
// TX
// Pagos adicionales
Boolean EnFecTX(Char tp, Int16 x, Int16 y) {
	switch(tp) {
	case 0:	return (y>=15 && y<=15+cre->hf && x>=43 && x<=43+cre->wf);
	case 1:	return (y>=40 && y<=40+cre->hf && x>=61 && x<=61+cre->wf);
	case 2: return (y>=50 && y<=50+cre->hf && x>=61 && x<=61+cre->wf);
	}
	return false;
}
void PonAdiTX(FormType *f, Boolean ini, Boolean pon) {
Char  s[150];
	if (ini && cre->sla==-1) {
		cre->sla=cre->cre.un.tx.fa;
		FecHoy(&(cre->cre.un.tx.pga[cre->sla].f));
		cre->cre.un.tx.pga[cre->sla].v=0;
		cre->cre.un.tx.pga[cre->sla].rep=0;
		SacaTexto(s,2100,96,150); FrmCopyTitle(f,s);
		SacaTexto(cre->cre.un.tx.pga[cre->sla].s,2100,48,sizeof(cre->cre.un.tx.pga[cre->sla].s));
	}
	if (pon) {
		FrmDrawForm(f);
		if (cre->sla==cre->cre.un.tx.fa) FrmHideObject(f,FrmGetObjectIndex(f,BBor));
		cre->hf=PonFecCamp(43,15,&(cre->cre.un.tx.pga[cre->sla].f),-1,-1,true,&cre->wf);
		AstrX(cre->cre.un.tx.pga[cre->sla].v,s,false,true);
		Texto(s,GetObjPtr(f,201),true);
		if (cre->cre.un.tx.pga[cre->sla].rep==0) {
			CtlSetValue((ControlType*)GetObjPtr(f,203),0);
			FrmHideObject(f,FrmGetObjectIndex(f,204));
			FrmHideObject(f,FrmGetObjectIndex(f,102));
		}
		else  {
			CtlSetValue((ControlType*)GetObjPtr(f,203),1);
			FrmShowObject(f,FrmGetObjectIndex(f,204));
			FrmShowObject(f,FrmGetObjectIndex(f,102));
			Lista(GetObjPtr(f,204),GetObjPtr(f,205),cre->cre.un.tx.pga[cre->sla].rep-1,true,0,NULL);
		}
		Texto(cre->cre.un.tx.pga[cre->sla].s,GetObjPtr(f,206),true);
	}
	else { 
		Texto(s,GetObjPtr(f,201),false); cre->cre.un.tx.pga[cre->sla].v=AdblX(s); 
		Texto(cre->cre.un.tx.pga[cre->sla].s,GetObjPtr(f,206),false);
	}
}
Boolean EdtPagAdiTX(EventType* pEvent) {
Char  s[150];
Int16 i;
	switch (pEvent->eType) {
		case frmUpdateEvent:
			switch(pEvent->data.frmUpdate.updateCode) {
			case 70: break;
			default: return false;
			}
			PonAdiTX(FrmGetActiveForm(),false,true); return true;
		case frmOpenEvent:
		    if (cre->sla!=-1) MemMove(&cre->cre.un.tx.pga[10],&cre->cre.un.tx.pga[cre->sla],sizeof(PA));
			PonAdiTX(FrmGetActiveForm(),true,true);
			PonBotonCT(&(cre->oc),1,201,&(cre->cre.un.tx.pga[cre->sla].v),NULL,FrmGetActiveForm(),0,2200,0);
			return true;
		case ctlSelectEvent:
		    switch(pEvent->data.ctlSelect.controlID) {
	    	case  203: if (cre->cre.un.tx.pga[cre->sla].rep==0) {
	    		              cre->cre.un.tx.pga[cre->sla].rep=12;
							  FrmShowObject(FrmGetActiveForm(),FrmGetObjectIndex(FrmGetActiveForm(),204));
							  FrmShowObject(FrmGetActiveForm(),FrmGetObjectIndex(FrmGetActiveForm(),102));
							  Lista(GetObjPtr(FrmGetActiveForm(),204),GetObjPtr(FrmGetActiveForm(),205),cre->cre.un.tx.pga[cre->sla].rep-1,true,0,NULL); }
	    		       else { cre->cre.un.tx.pga[cre->sla].rep=0;
	    		       	      FrmHideObject(FrmGetActiveForm(),FrmGetObjectIndex(FrmGetActiveForm(),204));
							  FrmHideObject(FrmGetActiveForm(),FrmGetObjectIndex(FrmGetActiveForm(),102)); }
	    		       return true;
	    	case BAce: PonAdiTX(FrmGetActiveForm(),false,false);
	    			   if (Comp2Fec(&(cre->cre.un.tx.pga[cre->sla].f),&(cre->cre.un.tx.per.f))==-1) 
	    			   	  { FrmAlert(2108); return true; }
	    			   if (cre->sla==cre->cre.un.tx.fa) cre->cre.un.tx.fa++;
	    	           FrmUpdateForm(FPagAdiTX,80); FrmReturnToForm(0); return true;
	    	case BCan: if (cre->sla!=cre->cre.un.tx.fa) MemMove(&cre->cre.un.tx.pga[cre->sla],&cre->cre.un.tx.pga[10],sizeof(PA));
	    	           FrmUpdateForm(FPagAdiTX,80); FrmReturnToForm(0); return true;
	    	case BBor: if (FrmAlert(2105)==1) {
	    				  	for (i=cre->sla;i<cre->cre.un.tx.fa-1;i++) 
	    				  		MemMove(&(cre->cre.un.tx.pga[i]),&(cre->cre.un.tx.pga[i+1]),sizeof(PA));
	    				    cre->cre.un.tx.fa--;
    				  		FrmUpdateForm(FPagAdiTX,80); FrmReturnToForm(0);
	    			   } return true;
			case BCal: PonAdiTX(FrmGetActiveForm(),false,false);
					   OpBotonCT(&(cre->oc)); return true;
		    }
		    break;
	    case fldEnterEvent:
            switch(pEvent->data.fldEnter.fieldID) {
   		    case  201: PonBotonCT(&(cre->oc),1,201,&(cre->cre.un.tx.pga[cre->sla].v),NULL,FrmGetActiveForm(),0,2200,0); return false;
   		    case  206: PonBotonCT(&(cre->oc),2,206,NULL,cre->cre.un.tx.pga[cre->sla].s,FrmGetActiveForm(),sizeof(cre->cre.un.tx.pga[cre->sla].s),2100,48); return false;
           	default  : PonBotonCT(&(cre->oc),0,0,NULL,NULL,FrmGetActiveForm(),0,2200,0); return false;
            }
            break;
        case ctlEnterEvent:
            switch(pEvent->data.ctlEnter.controlID) {
	        case  204: cre->cre.un.tx.pga[cre->sla].rep=
	        		   1+Lista(GetObjPtr(FrmGetActiveForm(),204),GetObjPtr(FrmGetActiveForm(),205),0,false,0,NULL);
	        		   return true;
            }
            break;
        case penDownEvent:
            if (EnFecTX(0,pEvent->screenX,pEvent->screenY)) {
            	PonAdiTX(FrmGetActiveForm(),false,false);
            	SacaTexto(s,2100,99,sizeof(s));
		        SelFecha(s,&(cre->cre.un.tx.pga[cre->sla].f),false);
				PonAdiTX(FrmGetActiveForm(),false,true);
                return true;
            }
            break;
		default: break;
	}
	return false;
}
void PntLPagAdi(Int16 it, RectangleType *r,char **u, ListType *p) {
Boolean  		pn;
Int16    		fc;
Char            s[51],t[51];
Int8            a;
	pn=SelecLst(cre->col[0]);
    if (pn) fc=1; else fc=-1;
    ForFec(s,7,&(cre->cre.un.tx.pga[it].f));
    PonTexto(s,r->topLeft.x,r->topLeft.y,N,I,40,false,-1,-1,&a);
    if (cre->cre.un.tx.pga[it].rep>0) {
    	StrIToA(t,cre->cre.un.tx.pga[it].rep);
    	StrCopy(s," ("); StrCat(s,t); StrCat(s,")");
    	PonTexto(s,r->topLeft.x+40,r->topLeft.y,N,I,30,false,-1,-1,&a);
    }
    PonTexto(cre->cre.un.tx.pga[it].s,r->topLeft.x+42,r->topLeft.y,N,I,48,false,-1,-1,&a);
    AstrX(cre->cre.un.tx.pga[it].v,s,false,true);
    PonTexto(s,150,r->topLeft.y,N,D,60,false,-1,-1,&a);
}
void PonPagAdi(FormType *f) {
	FrmDrawForm(f);	
	EliminaMarco(f,206,(ListDrawDataFuncPtr)PntLPagAdi,cre->cre.un.tx.fa,true,cre->sla);
}
Boolean PagAdiTX(EventType* pEvent) {
Int16 	v;
	switch (pEvent->eType) {
		case frmUpdateEvent:
			switch(pEvent->data.frmUpdate.updateCode) {
			case 70: break;
			case 80: break;
			default: return false;
			}
		    PonPagAdi(FrmGetActiveForm()); return true;
		case frmOpenEvent:
		    PonPagAdi(FrmGetActiveForm());
		    if (cre->cre.un.tx.fa==0)
		    	{ cre->sla=-1; FrmPopupForm(FEdtPagAdiTX); }
			return true;
		case ctlSelectEvent:
		    switch(pEvent->data.ctlSelect.controlID) {
	    	case BNue: if (cre->cre.un.tx.fa==10) { FrmAlert(2102); return true; }
	    	           cre->sla=-1; FrmPopupForm(FEdtPagAdiTX); return true;
		   	case BAce: FrmUpdateForm(FEditarCR_TX,69); FrmReturnToForm(0); return true;
		    }
		    break;
        case lstSelectEvent:
		    v=pEvent->data.lstSelect.selection;
		    if (v==noListSelection) break;
		    cre->sla=v; FrmPopupForm(FEdtPagAdiTX);
            return true;
		default: break;
	}
	return false;
}
void PintaTX(FormType *f, Boolean pinta) {
Int16 bc,i,y,h;	
Char  s[150];
	if (pinta) {
		for (i=0;i<7;i++)  FrmHideObject(f,FrmGetObjectIndex(f,100+i));
	    for (i=1;i<6;i++)  if (i!=2) FrmHideObject(f,FrmGetObjectIndex(f,200+i));
	    for (i=8;i<13;i++) if (i!=9) FrmHideObject(f,FrmGetObjectIndex(f,200+i));
	    y=16; h=FntCharHeight()+3;
		PintaB(255,0,y,159,(h*8)+14,9,2,0,1,true,cre->col); y+=2;
		PintaB(255,61,y,95,(h*7)+6,2,1,2,9,true,cre->col);
	   	y=27+(7*h); PintaB(255,4,y,152,h,2,1,0,2,true,cre->col);
		bc=WinSetBackColor(cre->col[9]);
		for (i=0;i<6;i++) FrmShowObject(f,FrmGetObjectIndex(f,100+i));
		WinSetBackColor(cre->col[2]);
		FrmShowObject(f,FrmGetObjectIndex(f,107));
	    for (i=1;i<6;i++)  if (i!=2) FrmShowObject(f,FrmGetObjectIndex(f,200+i));
	    for (i=8;i<13;i++) if (i!=9) FrmShowObject(f,FrmGetObjectIndex(f,200+i));
		WinSetBackColor(bc);
    	if (!cre->cre.DInst) 
       		   Lista(GetObjPtr(f,201),GetObjPtr(f,202),0,true,85,cre->str[0]);
    	else { LeerConID(&(cre->cre.Inst_ID),&(cre->mi),false);
    		   AjustaSTR(cre->str[0],cre->mi.Nom,85);
           	   CtlSetLabel(GetObjPtr(f,201),cre->str[0]); }
        Texto(cre->cre.num,GetObjPtr(f,203),true);
        AstrX(cre->cre.si,s,false,true); Texto(s,GetObjPtr(f,204),true);
		PonPerCamp(&(cre->per),false);
		AstrX(cre->cre.un.tx.por,s,false,true); Texto(s,GetObjPtr(f,205),true);
        Lista(GetObjPtr(f,208),GetObjPtr(f,209),cre->cre.un.tx.p-1,true,85,cre->str[1]);
        if (cre->cre.un.tx.pa) { CtlSetValue(GetObjPtr(f,211),1);
								 FrmShowObject(f,FrmGetObjectIndex(f,212)); }
        else { CtlSetValue(GetObjPtr(f,211),0);
			   FrmHideObject(f,FrmGetObjectIndex(f,212)); }
	    AstrX(cre->cre.un.tx.pp,s,false,true); Texto(s,GetObjPtr(f,210),true);
	}
	else {
		Texto(cre->cre.num,GetObjPtr(f,203),false);
		Texto(s,GetObjPtr(f,205),false); cre->cre.un.tx.por=AdblX(s);
		Texto(s,GetObjPtr(f,204),false); cre->cre.si=AdblX(s);
		Texto(s,GetObjPtr(f,210),false); cre->cre.un.tx.pp=AdblX(s);
		ProxFPPer(&(cre->cre.un.tx.per.f),&(cre->cre.un.tx.per),1);
	}
}
void CalcVP(FormType *f, Char op) {
Char s[150];
	switch(op) {
	case 1: Texto(s,GetObjPtr(f,204),false); cre->cre.si=AdblX(s); break;
	case 2: Texto(s,GetObjPtr(f,205),false); cre->cre.un.tx.por=AdblX(s); break;
	}
    cre->cre.un.tx.pp=cre->cre.si/cre->cre.un.tx.p;
    AstrX(cre->cre.un.tx.pp,s,false,true); Texto(s,GetObjPtr(f,210),true);
}

Boolean PagosVencidosTX(EventType* pEvent) {
Int16 		  v;
Char  		  s[20];
FieldAttrType at;
	switch (pEvent->eType) {
		case frmUpdateEvent:
			switch(pEvent->data.frmUpdate.updateCode) {
			case 90: cre->ayu=false; break;
			default: return false;
			} 
			return true;
		case frmOpenEvent:
		    FrmDrawForm(FrmGetActiveForm());
			FrmHideObject(FrmGetActiveForm(),FrmGetObjectIndex(FrmGetActiveForm(),202)); 
			FrmHideObject(FrmGetActiveForm(),FrmGetObjectIndex(FrmGetActiveForm(),206)); 
			v=cre->pagn; StrIToA(s,v); Texto(s,GetObjPtr(FrmGetActiveForm(),210),true);
			FldGetAttributes(GetObjPtr(FrmGetActiveForm(),210),&at); at.editable=0; FldSetAttributes(GetObjPtr(FrmGetActiveForm(),210),&at);
			v=cre->paga; StrIToA(s,v); Texto(s,GetObjPtr(FrmGetActiveForm(),211),true); 
			FldGetAttributes(GetObjPtr(FrmGetActiveForm(),211),&at); at.editable=0; FldSetAttributes(GetObjPtr(FrmGetActiveForm(),211),&at);
			 							Texto("1",GetObjPtr(FrmGetActiveForm(),212),true); 
			FldGetAttributes(GetObjPtr(FrmGetActiveForm(),212),&at); at.editable=0; FldSetAttributes(GetObjPtr(FrmGetActiveForm(),212),&at);
			cre->cre.un.tx.pagvn=-2;
			Lista(GetObjPtr(FrmGetActiveForm(),200),GetObjPtr(FrmGetActiveForm(),201),2,true,0,NULL);
			cre->cre.un.tx.pagva=-1;
			Lista(GetObjPtr(FrmGetActiveForm(),204),GetObjPtr(FrmGetActiveForm(),205),1,true,0,NULL);
			return true;
		case ctlSelectEvent:
		    switch(pEvent->data.ctlSelect.controlID) {
		   	case BAyu: cre->ayu=Ayuda(2112,1,cre->col,FPagosVencidos); return true;
		   	case BAce: if (cre->cre.un.tx.pagvn>0) {
        	           	  Texto(s,GetObjPtr(FrmGetActiveForm(),202),false);	cre->cre.un.tx.pagvn=StrAToI(s);
        	           	  if (cre->cre.un.tx.pagvn<0 || cre->cre.un.tx.pagvn>cre->pagn+1)
        	           	  	{ FrmAlert(2107); return true; }
		   			   } else if (cre->cre.un.tx.pagvn==-1) cre->cre.un.tx.pagvn=cre->pagn;
		   			     else if (cre->cre.un.tx.pagvn==-2) cre->cre.un.tx.pagvn=cre->pagn+1;
		   			   if (cre->cre.un.tx.pagva>0) {
        	           	  Texto(s,GetObjPtr(FrmGetActiveForm(),206),false);	cre->cre.un.tx.pagva=StrAToI(s);
        	           	  if (cre->cre.un.tx.pagva<0 || cre->cre.un.tx.pagva>cre->paga)
        	           	  	{ FrmAlert(2110); return true; }
		   			   } else if (cre->cre.un.tx.pagva==-1) cre->cre.un.tx.pagva=cre->paga;
                       FrmUpdateForm(FEditarCR_TX,51); FrmReturnToForm(0); return true;
		   	case BCan: FrmUpdateForm(FEditarCR_TX,50); FrmReturnToForm(0); return true;
		    }
		    break;
	    case fldEnterEvent:
            switch(pEvent->data.fldEnter.fieldID) {
            case  202: PonBotonCT(&(cre->oc),1,202,&(cre->cre.un.tx.pagvn),NULL,FrmGetActiveForm(),0,2100,0); return false;
            case  206: PonBotonCT(&(cre->oc),1,206,&(cre->cre.un.tx.pagva),NULL,FrmGetActiveForm(),0,2100,0); return false;
           	default  : PonBotonCT(&(cre->oc),0,0,NULL,NULL,FrmGetActiveForm(),0,2100,0); return false;
            }
            break;
        case ctlEnterEvent:
            switch(pEvent->data.ctlEnter.controlID) {
            case  200: v=Lista(GetObjPtr(FrmGetActiveForm(),200),
        	                   GetObjPtr(FrmGetActiveForm(),201),0,false,0,NULL);
					   switch(v) {
					   case 0: cre->cre.un.tx.pagvn= 0; break;
            		   case 1: cre->cre.un.tx.pagvn=-1; break;
            		   case 2: cre->cre.un.tx.pagvn=-2; break;
        	           case 3: v=cre->cre.un.tx.pagvn=cre->pagn+1; 
        	                   FrmShowObject(FrmGetActiveForm(),FrmGetObjectIndex(FrmGetActiveForm(),202)); 
        	           		   StrIToA(s,v); Texto(s,GetObjPtr(FrmGetActiveForm(),202),true);
        	                   break;
            		   }
        	           return true;
            case  204: v=Lista(GetObjPtr(FrmGetActiveForm(),204),
        	                   GetObjPtr(FrmGetActiveForm(),205),0,false,0,NULL);
					   switch(v) {
            		   case 0: cre->cre.un.tx.pagva= 0; break;
            		   case 1: cre->cre.un.tx.pagva=-1; break;
        	           case 2: v=cre->cre.un.tx.pagva=cre->paga; FrmShowObject(FrmGetActiveForm(),FrmGetObjectIndex(FrmGetActiveForm(),206)); 
        	           		   StrIToA(s,v); Texto(s,GetObjPtr(FrmGetActiveForm(),206),true);
        	                   break;
            		   }
        	           return true;
        	}
        	break;
		default: break;
	}
	return false;
}

Boolean RevTX(void) {
Fecha   f,h,g,t;
Int16   i;
Boolean r=true;
	// Si hay pagos adicionales previos a la fecha de inicio alertar y terminar
	if (cre->cre.un.tx.pa && cre->cre.un.tx.fa>0) {
		for (i=0;i<cre->cre.un.tx.fa;i++) {
		   if (Comp2Fec(&(cre->cre.un.tx.pga[i].f),&(cre->cre.un.tx.per.f))==-1) 
	   	   { FrmAlert(2109); return false; }
		}
	}
	cre->pagn=cre->paga=0;
	// Determinar fecha tope (fecha de pago final)
	ProxFPPer(&(cre->per.p->f),cre->per.p,1); MemMove(&t,&(cre->per.p->f),sizeof(Fecha));
	for (i=0;i<cre->cre.un.tx.p;i++) ProxFPPer(&t,cre->per.p,3); SumarDias(1,&t);
	FecHoy(&f); if (Comp2Fec(&f,&t)==-1) MemMove(&t,&f,sizeof(Fecha));
	// Calcular pagos vencidos normales
	MemMove(&f,&(cre->per.p->f),sizeof(Fecha)); 
	MemMove(&h,&f,sizeof(Fecha)); MemMove(&g,&f,sizeof(Fecha)); 
	ProxFPPer(&h,cre->per.p,2);
	if (Comp2Fec(&h,&t)==-1) {
		r=false;
		do { if (!EsteMesX(&h)) (cre->pagn)++;
			 ProxFPPer(&g,cre->per.p,3);
			 MemMove(&h,&g,sizeof(Fecha)); ProxFPPer(&h,cre->per.p,2);
		} while (Comp2Fec(&h,&t)==-1);
	} else cre->cre.un.tx.pagvn=-1;
	// Calcular pagos vencidos adicionales
	if (cre->cre.un.tx.pa && cre->cre.un.tx.fa>0) {
		for (i=0;i<cre->cre.un.tx.fa;i++) {
			MemMove(&h,&(cre->cre.un.tx.pga[i].f),sizeof(Fecha));
			do { MemMove(&g,&h,sizeof(Fecha));
			     PasarFDL(cre->per.p->v4,(Int16)cre->per.p->da,&g);
			     if (Comp2Fec(&g,&t)==-1) { (cre->paga)++; r=false; } else break;
			     if (cre->cre.un.tx.pga[i].rep==0) break;
			     SumarMeses(cre->cre.un.tx.pga[i].rep,&h);
			} while(1==1);
		}
	} else cre->cre.un.tx.pagva=-1;
	// Alertar pagos vencidos, capturar cuantos ya han sido liquidados
	if (!r) FrmPopupForm(FPagosVencidos);
	return r;
}

Boolean EditarCR_TX(EventType* pEvent) {
Int16 v;
	switch (pEvent->eType) {
		case frmUpdateEvent:
			switch(pEvent->data.frmUpdate.updateCode) {
			case 50: break;
			case 51: FinEdt(1); return true; 
			case 69: if (cre->cre.un.tx.fa==0) cre->cre.un.tx.pa=false; break;
			case 70: break;
			case 98: break;
			case 80: cre->cre.DInst=true; 
			case 81: cre->inst=false; break;
			default: return false;
			}
			PintaTX(FrmGetActiveForm(),true); return true;
		case frmOpenEvent:
			if (cre->cres==-1) {
    			cre->per.p=&(cre->cre.un.tx.per); cre->per.f=FEditarCR_TX; 
    			cre->per.ayu=&(cre->ayu);  
    			cre->per.col=cre->col; 
				cre->per.r.topLeft.x=66; cre->per.r.topLeft.y=79;
				cre->per.act=true; cre->per.tp=2; cre->per.inf=&(cre->cre);
			}
			cre->sl=0;	cre->mcret=MemHandleNew(sizeof(CRE));
			cre->cret=(CRE *)MemHandleLock(cre->mcret);
			MemMove(cre->cret,&cre->cre,sizeof(CRE));
			MemHandleUnlock(cre->mcret);
			MemMove(&(cre->rpe),cre->per.p,sizeof(Periodo));
		    PFormaCR(5,true); PintaTX(FrmGetActiveForm(),true);
		    cre->si=cre->cre.si; cre->cmb=false; cre->edt=true; cre->csel=0;
			return true;
		case ctlSelectEvent:
		    switch(pEvent->data.ctlSelect.controlID) {
	    	case  211: cre->cre.un.tx.pa=!cre->cre.un.tx.pa;
	    			   if (cre->cre.un.tx.pa) {
	    			        FrmShowObject(FrmGetActiveForm(),FrmGetObjectIndex(FrmGetActiveForm(),212));
	    			        PintaTX(FrmGetActiveForm(),false); FrmPopupForm(FPagAdiTX);
	    			   }
	    			   else FrmHideObject(FrmGetActiveForm(),FrmGetObjectIndex(FrmGetActiveForm(),212));	
	    			   return true;
            case  212: PintaTX(FrmGetActiveForm(),false); 
                       FrmPopupForm(FPagAdiTX); return true;
		   	case BAce: PintaTX(FrmGetActiveForm(),false); 
		   			   if (RevTX()) FinEdt(1); return true;
		   	case BCan: FinEdt(2); return true;
			case BCal: PintaTX(FrmGetActiveForm(),false);
					   OpBotonCT(&(cre->oc)); return true;
		    }
		    break;
		case keyDownEvent:
			switch(cre->csel) {
			case 1: CalcVP(FrmGetActiveForm(),1); break;
			case 2: CalcVP(FrmGetActiveForm(),2); break;
			}
			return false;
	    case fldEnterEvent:
            switch(pEvent->data.fldEnter.fieldID) {
           	case  203: cre->csel=0; PonBotonCT(&(cre->oc),2,203,NULL,cre->cre.num,FrmGetActiveForm(),sizeof(cre->cre.num),2100,89); return false;
            case  204: cre->csel=1; PonBotonCT(&(cre->oc),1,204,&(cre->cre.si),NULL,FrmGetActiveForm(),0,2100,0); return false;
            case  205: cre->csel=2; PonBotonCT(&(cre->oc),1,205,&(cre->cre.un.tx.por),NULL,FrmGetActiveForm(),0,2100,94); return false;
            case  210: cre->csel=0; PonBotonCT(&(cre->oc),1,210,&(cre->cre.un.tx.pp),NULL,FrmGetActiveForm(),0,2100,0); return false;
           	default  : cre->csel=0; PonBotonCT(&(cre->oc),0,0,NULL,NULL,FrmGetActiveForm(),0,2100,0); return false;
            }
            break;
        case ctlEnterEvent:
            switch(pEvent->data.ctlEnter.controlID) {
            case  201: PintaTX(FrmGetActiveForm(),false);
            		   v=Lista(GetObjPtr(FrmGetActiveForm(),201),
        	                   GetObjPtr(FrmGetActiveForm(),202),0,false,0,NULL);
        	           switch(v) {
        	           	case 0: cre->cre.DInst=false; break;
        	           	case 1: IniciaInst(2,FEditarCR_TC,&(cre->cre.Inst_ID),cre->cre.DInst,cre->col);
        	           	        break;
        	           	case 2: if (!cre->cre.DInst) 
        	           			   Lista(GetObjPtr(FrmGetActiveForm(),201),GetObjPtr(FrmGetActiveForm(),202),0,true,85,cre->str[0]);
        	           			else {
        	           	           LeerConID(&(cre->cre.Inst_ID),&(cre->mi),false);
        	           	           AjustaSTR(cre->str[0],cre->mi.Nom,85);
        	           	           CtlSetLabel(GetObjPtr(FrmGetActiveForm(),201),cre->str[0]);
        	           			}
        	           	        break;
        	           }
        	           return true;
            case  208: PintaTX(FrmGetActiveForm(),false);
            		   cre->cre.un.tx.p=(UInt8)Lista(GetObjPtr(FrmGetActiveForm(),208),
        	                   					     GetObjPtr(FrmGetActiveForm(),209),cre->cre.un.tx.p-1,false,0,NULL);
        	           cre->cre.un.tx.p+=1;
        	           CalcVP(FrmGetActiveForm(),0);
        	           break;
        	}
        	break;
        case penDownEvent:
            if (EnPeriodo(pEvent->screenX,pEvent->screenY,&(cre->per))) {
            	PintaTX(FrmGetActiveForm(),false);
            	PonPerCamp(&(cre->per),true);
		        SelecPeriodo(&(cre->per),false);
                return true;
            }
            break;
            break;
		default: break;
	}
	return false;
}
// **********************************************************************
//
// CONSULTAR DATOS CUENTA DE CREDITO
//
// **********************************************************************
void BorrarCuenta(void) {
	 switch(cre->cre.estatus) {
	 case 0: switch(FrmAlert(2105)) {
	 	     case 0: return;
	 	     case 1: cre->cmb=true; CGB_CR(cre->cres,2,&(cre->cre)); break;
	         } break;
	 case 1: switch(FrmAlert(2106)) {
	 		 case 0: return;
	 		 case 1: cre->cre.estatus=2;
	 		         cre->cmb=true; CGB_CR(cre->cres,1,&(cre->cre)); break;
	 		 } break;
	 }
	 FrmUpdateForm(FVerDatosCR,92); FrmReturnToForm(0);
}
// Detalle general (ZOOM)
Boolean DetGenCR(EventType* pEvent) {
Char 	t[50],s[50],s2[50],s3[50];
Int16 	y;
Int8    a;
	switch (pEvent->eType) {
		case frmOpenEvent:
       	    FrmDrawForm(FrmGetActiveForm());
       	    switch(cre->cre.tp) {
       	    	case 0: case 1: case 2: case 3: 
       	    	case 4: CargaTextoTC(cre->sl,t,sizeof(t),s,false); 
       	                y=16; y+=(PonTexto(t,80,y,B,C,0,false,-1,-1,&a)+3);
    		            PonTexto(s,80,y,N,C,156,false,-1,-1,&a); break;
    		    case 5: 
    		    case 6: 
    		    case 7: CargaTextoTX(cre->sl,t,sizeof(t),s,s2,s3,false); 
       	                y=16; y+=(PonTexto(t,80,y,B,C,0,false,-1,-1,&a)+3);
    		            PonTexto(s,80,y,N,C,156,false,-1,-1,&a); break;
       	    }       	                
			return true;
		case ctlSelectEvent:
		    switch(pEvent->data.ctlSelect.controlID) {
		   	case BAce: FrmReturnToForm(0); return true;
		    }
		    break;
		default: break;
	}
	return false;
}
// Obtener texto lista TC
void CargaTextoTC(Int16 it, Char *t, Int16 st, Char *s, Boolean c) {
Char q[50];
	switch(it) {
	case  0: StrIToA(s,cre->cre.un.tc.dc); SacaTexto(q,2100,55,sizeof(q)); StrCat(s,q); 
			 SacaTexto(t,2100,37,st); break;
	case  1: StrIToA(s,cre->cre.dp); SacaTexto(q,2100,55,sizeof(q)); StrCat(s,q); 
			 SacaTexto(t,2100,38,st); break;
	case  2: AstrX(cre->cre.un.tc.lc,s,true,false);
	         SacaTexto(t,2100,((c)?56:57),st);  break;
	case  3: AstrX(cre->cre.un.tc.lc-cre->cre.sa,s,true,false);
	         SacaTexto(t,2100,58,st); break;
    case  4: StrCopy(s,cre->cre.un.tc.pin);
	         SacaTexto(t,2100,((c)?42:59),st); break;
    case  5: RMesA(s,cre->cre.un.tc.mdm,cre->cre.un.tc.mda,false);
	         SacaTexto(t,2100,((c)?43:13),st); break;
    case  6: RMesA(s,cre->cre.un.tc.mdm,cre->cre.un.tc.mda,false);
	         SacaTexto(t,2100,14,st); break;
    case  7: RMesA(s,cre->cre.un.tc.mdm,cre->cre.un.tc.mda,false);
	         SacaTexto(t,2100,15,st); break;
    case  8: StrCopy(s,cre->cre.un.tc.seg);
	         SacaTexto(t,2100,((c)?44:61),st); break;
    case  9: StrCopy(s,cre->cre.un.tc.te1);
	         SacaTexto(t,2100,((c)?45:62),st); break;
    case 10: StrCopy(s,cre->cre.un.tc.te2);
	         SacaTexto(t,2100,((c)?32:62),st); break;
	}
}
void CargaTextoTX(Int16 it, Char *t, Int16 st, Char *s, Char *s2, Char *s3, Boolean c) {
	switch(it) {
	case  0: AstrX(cre->cre.si,s,true,false);
	         SacaTexto(t,2100,((c)?63:64),st);
	         break;
	case  1: TextoPeriodo(s,&(cre->per));
	         SacaTexto(t,2100,((c)?67:68),st);
	         break;
	case  2: StrIToA(s,cre->cre.un.tx.p);
	         SacaTexto(t,2100,((c)?69:70),st);
	         break;
	case  3: AstrX(cre->cre.un.tx.pp,s,true,false);
	         SacaTexto(t,2100,((c)?71:72),st);
	         break;
	case  4: AstrX(cre->cre.un.tx.por,s,true,false);
	         SacaTexto(t,2100,((c)?104:105),st);
	         break;
	default: StrCopy(s3,"("); StrIToA(s,cre->cre.un.tx.pga[it-4].rep); StrCat(s3,s); StrCat(s3,")");
			 AstrX(cre->cre.un.tx.pga[it-4].v,s2,false,false);
			 ForFec(s,7,&(cre->cre.un.tx.pga[it-4].f));
			 SacaTexto(t,2100,74,st);
	         break;
	}
}
// Pintar lista ver datos
void PntLDatCR(Int16 it, RectangleType *r,char **u, ListType *p) {
Boolean pn;
Char  	t[50],s[50],s2[50],s3[50];
Int16 	cl;
Int8    a;
	pn=SelecLst(cre->col[0]);
	switch(cre->cre.tp) {
		case 0:	case 1:	case 2:	case 3:
		case 4: CargaTextoTC(it,t,sizeof(t),s,true);
				if (pn) cl=WinSetTextColor(cre->col[1]); 
				WinDrawTruncChars(s,StrLen(s),r->topLeft.x+65,r->topLeft.y,r->extent.x-65-7);
				if (pn) WinSetTextColor(cl); 
				WinDrawChars(t,StrLen(t),r->topLeft.x,r->topLeft.y);
				if (pn) WinSetTextColor(cl);
				break;
		case 5: case 6:
		case 7: CargaTextoTX(it,t,sizeof(t),s,s2,s3,true);
		        if (it==5) PonTexto(t,r->topLeft.x+(r->extent.x/2),r->topLeft.y,N,C,0,false,-1,-1,&a);
		        else if (it<6) {
					if (pn) cl=WinSetTextColor(cre->col[1]); 
					FntSetFont(boldFont);
					WinDrawTruncChars(s,StrLen(s),r->topLeft.x+65,r->topLeft.y,r->extent.x-65-7);
					FntSetFont(stdFont);
					if (pn) WinSetTextColor(cl); 
					WinDrawChars(t,StrLen(t),r->topLeft.x,r->topLeft.y);
					if (pn) WinSetTextColor(cl);
		        }
		        else if (it>5) {
					if (pn) cl=WinSetTextColor(cre->col[1]);
    				PonTexto(s ,r->topLeft.x,r->topLeft.y,N,I,40,false,-1,-1,&a);
    				PonTexto(s2,r->topLeft.x+40+80,r->topLeft.y,N,D,80,false,-1,-1,&a);
   					PonTexto(s3,r->topLeft.x+40+80+20,r->topLeft.y,N,D,16,false,-1,-1,&a);
					if (pn) WinSetTextColor(cl);
		        }
				break;
	}
}
// Principal ver datos
Boolean VerDatosCR(EventType* pEvent) {
Int16 	v;
	switch (pEvent->eType) {
		case frmUpdateEvent:
			switch(pEvent->data.frmUpdate.updateCode) {
				case  0: break;
				case  1: break;
				case  2: break; 
				case 90: cre->ayu=false; break;
				case 98: break;
				case 92: FrmUpdateForm(FDetallesCR,92); FrmReturnToForm(0); return true;
				default: return false;
			}
			PFormaCR(4,false); return true;
		case frmOpenEvent:
		    PFormaCR(4,true);
			return true;
		case ctlSelectEvent:
		    switch(pEvent->data.ctlSelect.controlID) {
		   	case BAyu: cre->ayu=Ayuda(2108,1,cre->col,FResumenCR); return true;
		   	case BAce: if (cre->inicio==7) FrmUpdateForm(FrmGetFormId(cre->f),86);
		   			   else FrmUpdateForm(FDetallesCR,70);
		   	           FrmReturnToForm(0); return true;
		   	case BEdi: switch(cre->cre.tp) {
		   		       case 0: case 1: case 2: case 3:
		   		       case 4: FrmPopupForm(FEditarCR_TC); return true;
		   		       case 5: case 6: 
		   		       case 7: FrmPopupForm(FEditarCR_TX); return true;
		   			   }
		   			   break;
		  	case BBor: BorrarCuenta(); return true;
		   	case BHom: FrmUpdateForm(FDetallesCR,99);
		   			   FrmReturnToForm(0); 
		   	           return true;
		    }
		    break;
        case lstSelectEvent:
		    v=pEvent->data.lstSelect.selection;
		    if (v==noListSelection) break;
		    cre->sl=v; FrmPopupForm(FDetGenCR); 
		    return true; 
		default: break;
	}
	return false;
}
// **********************************************************************
//
// Registrar / Editar movimiento TC
//
// 1=Dep. 2=Compra 3=ATM 4=Cargo 5=Abono
//
// **********************************************************************
// tp: 0=A partir de hoy, 1=A partir de f
void ProximoPago(Char tp, Fecha *f, Int8 dp, Int16 pasa) {
	if (tp==0) FecHoy(f);
	if ((f->m==3 || f->m==5 || f->m==8 || f->m==10) && dp>30) dp=30;
	if (f->m==2 && dp>28) dp=28;
	if (f->d>dp) { f->d=dp; SumarMeses(1,f); } else f->d=dp;
	PasarFDL(pasa,0,f);
}
Boolean EnFecMovCR(Int16 x, Int16 y) {
	switch(cre->mov.tp) {
	case  1: return (y>=69 && y<=69+cre->hf && x>=60 && x<=60+cre->wf);
	case  3: return (y>=69 && y<=69+cre->hf && x>=55 && x<=55+cre->wf);
	case  2: 
	case  4: 
	case  5: return (y>=69 && y<=69+cre->hf && x>=65 && x<=65+cre->wf);
	}
	return false;
}
void IniMov(FormType *f, Boolean ini) {
Char s[250];
	if (ini) { CGB_CR(cre->cres,1,&(cre->cre)); SacarID(&(cre->ide)); }
	PFormaCR(7,ini);
    if (cre->nmv==-1 && ini) {
		FecHoy(&(cre->mov.f));
		cre->mov.v=0;
		if (cre->mov.tp==1) cre->mov.v=cre->cre.sc;
		SacaTexto(cre->mov.p,2100,83+cre->mov.tp,sizeof(cre->mov.p));
		StrCopy(cre->mov.ds," ");
		cre->mov.ct=0;
		cre->mov.didg=false;
		cre->mov.un.mvc.np=0;
		cre->mov.un.mvc.didp=false;
		cre->mov.un.mvc.sa=0;
		cre->mov.un.mvc.sc=0;
		cre->mov.un.mvc.rev=0;
		FecHoy(&(cre->mov.un.mvc.fr));
		IniPer(0,&(cre->mov.un.mvc.per));
		FrmHideObject(f,FrmGetObjectIndex(f,BBor));
    }
   	AstrX(cre->mov.v,s,false,false); Texto(s,GetObjPtr(f,201),true);
	switch(cre->mov.tp) {
	case  1: cre->hf=PonFecCamp(60,69,&(cre->mov.f),-1,-1,true,&cre->wf); break;
	case  2: 
	case  4: cre->hf=PonFecCamp(65,69,&(cre->mov.f),-1,-1,true,&cre->wf); break;
	default: cre->hf=PonFecCamp(55,69,&(cre->mov.f),-1,-1,true,&cre->wf); break;
	}
    Texto(cre->mov.ds,GetObjPtr(f,205),true);
    if ((cre->mov.tp==2 || cre->mov.tp==3)) {
    	if (cre->mov.un.mvc.per.op!=0) { CtlSetValue(GetObjPtr(f,300),1);
    						             FrmShowObject(f,FrmGetObjectIndex(f,301)); }
    	else { CtlSetValue(GetObjPtr(f,300),0);
    		   FrmHideObject(f,FrmGetObjectIndex(f,301)); }
    }
	switch(cre->mov.tp) {
	case  1: 
	case  3: PonValorCuenta(f,203,&(cre->mov.idg),cre->mov.didg,cre->str[4]); break;
	default: if (!cre->mov.didg) Lista(GetObjPtr(f,203),GetObjPtr(f,204),0,true,((cre->mov.tp==2)?80:90),cre->str[2]);
    		 else { LeerConID(&(cre->mov.idg),&(cre->ga),false);
    		 	    AjustaSTR(cre->str[2],cre->ga.Nom,((cre->mov.tp==2)?80:90));
    		        CtlSetLabel(GetObjPtr(f,203),cre->str[2]); }
			 break;
	}
	if (ini) {
		MemMove(&(cre->moo),&(cre->mov),sizeof(MOVC));
    	PonBotonCT(&(cre->oc),0,0,NULL,NULL,f,0,2100,0);
	}
	else if (cre->oc.op==true) RefBotonCT(&(cre->oc));
}
Boolean RetAPagos(Char op, CRE *cre, MOVC *mov) {
Fecha   fh,fc,fp;
Boolean c;
    FecHoy(&fh); ProximoPago(0,&fc,cre->un.tc.dc,3);
    switch(op) {
	    case 1: // Agregar
		do { if (Comp2Fec(&(mov->un.mvc.per.f),&fc)==-1) { 
			 	c=true; cre->sa-=mov->un.mvc.per.v; mov->un.mvc.sa-=mov->un.mvc.per.v; 
			 	if (mov->un.mvc.sa==0) { if (mov->un.mvc.rev<10) mov->un.mvc.rev=2; else mov->un.mvc.rev=12; }
			 	else if (mov->un.mvc.rev==0 || mov->un.mvc.rev==10) mov->un.mvc.rev+=1;
				ProximoPago(0,&fp,cre->dp,3); SumarMeses(-1,&fp); PasarFDL(2,0,&fp);
				if (Comp2Fec(&fh,&fp)==1) { cre->sc-=mov->un.mvc.per.v; mov->un.mvc.sc+=mov->un.mvc.per.v; }
				ProxFPPer(&(mov->un.mvc.per.f),&(mov->un.mvc.per),4);
			 } else break;
		} while(mov->un.mvc.rev==0 || mov->un.mvc.rev==1);
		break;
	case 2: // Eliminar
		if (mov->un.mvc.rev<10) {
			MemMove(&(mov->un.mvc.per.f),&(mov->f),sizeof(Fecha));
			ProxFPPer(&(mov->un.mvc.per.f),&(mov->un.mvc.per),5);
			do { if (Comp2Fec(&(mov->un.mvc.per.f),&fc)==-1) { 
			 	 	c=true; cre->sa+=mov->un.mvc.per.v; mov->un.mvc.sa+=mov->un.mvc.per.v; 
				 	ProximoPago(0,&fp,cre->dp,3); SumarMeses(-1,&fp); PasarFDL(2,0,&fp);
				 	if (Comp2Fec(&fh,&fp)==1) { cre->sc+=mov->un.mvc.per.v; mov->un.mvc.sc-=mov->un.mvc.per.v; }
				 	ProxFPPer(&(mov->un.mvc.per.f),&(mov->un.mvc.per),4);
			 	 } else break;
			} while(1==1);
		}
		else {
			if (mov->un.mvc.rev==0) return false;
			cre->sa+=((mov->un.mvc.np*mov->un.mvc.per.v)-mov->un.mvc.sa);
			ProximoPago(0,&fp,cre->dp,3); SumarMeses(-1,&fp); PasarFDL(2,0,&fp);
			if (Comp2Fec(&fh,&fp)==1) cre->sc+=mov->un.mvc.per.v;
		}
		break;
    }
    return c;
}

Boolean RgMovCR(CRE *cre, MOVC *mov) {
Fecha   fc,fp;
Boolean c=false;
	if (mov->un.mvc.per.op==0) switch(mov->un.mvc.rev) { // Mov. normal (sin pagos)
	case 0: ProximoPago(0,&fc,cre->un.tc.dc,3);
			if (Comp2Fec(&(mov->f),&fc)==-1)	{ 
				mov->un.mvc.rev=1; c=true; 
				if (mov->tp==1 || mov->tp==5) cre->sa+=mov->v;
				else cre->sa-=mov->v;
			}
			else break;
	case 1: ProximoPago(0,&fp,cre->dp,3); SumarMeses(-1,&fp); PasarFDL(2,0,&fp);
	        if (Pasada(&fp)) {
				mov->un.mvc.rev=2; c=true; 
				if (mov->tp==1 || mov->tp==5) cre->sc+=mov->v;
				else cre->sc-=mov->v;
			}
			break;
	case 2: break; // Eliminar
	}
 	else switch (mov->un.mvc.rev) {				// Mov. a pagos
 	case  1: case 10: case 11:
 	case  0: c=RetAPagos(1,cre,mov); break;
 	case 12:
	case  2: ProximoPago(0,&fp,cre->dp,3); SumarMeses(-1,&fp); PasarFDL(2,0,&fp);
	         if (Pasada(&fp)) { 
	         	cre->sc-=mov->un.mvc.per.v;  mov->un.mvc.sc+=mov->un.mvc.per.v; 
	         }
			 mov->un.mvc.rev+=1; break;
	case 13:
	case  3: break; // Eliminar
 	}
 	return c;
}

// Afectar cuentas de crédito programadas
// op: 1=Eliminar depósito 2=Agregar depósito 
void ValCrePag(Char op, ID *id, Int16 cs, double v) {
double  c,d[5];
Int16   i,t;
MOVC    mov;
CRE     cre;
Boolean co;
ID      in;
	if (id!=NULL) {
		t=CntLCR(1,cs,d);
		for (i=0;i<t;i++) {
			CGB_CR(i,0,&cre); SacarID(&in);
			if (in.r==id->r) break;
		}
		if (i==t) return; cs=i;
	}
	t=CntLCR(3,cs,d); 
 	do for (co=false,i=0;i<t;i++) {
	 	CGB_DetCR(cs,i,0,(void*)&mov);
	 	if (mov.un.mvc.per.op!=0) switch(op) {
		 	case 1: if (v>0) {
		 				c=((mov.un.mvc.per.v>v)?mov.un.mvc.per.v:v);
			          	v-=c; mov.un.mvc.sc+=c; co=true; if (mov.un.mvc.rev<10) mov.un.mvc.rev+=10;
			 			CGB_DetCR(cs,i,0,(void*)&mov);	
			 		} break;
		 	case 2: if (mov.un.mvc.sc>0 && v>0) {
				  		c=((mov.un.mvc.per.v>mov.un.mvc.sc)?mov.un.mvc.sc:mov.un.mvc.per.v); if (c>v) c=v;
			          	v-=c; mov.un.mvc.sc-=c; if (mov.un.mvc.sc>0) co=true; if (mov.un.mvc.rev<10) mov.un.mvc.rev+=10;
			          	CGB_DetCR(cs,i,1,(void*)&mov);
					} break;
		}
 	} while(co && v>0);
}
void AceMov(FormType *f, Char op, Boolean oper) {
Char s[50];
	if (cre->cre.estatus==0) cre->cre.estatus=1;	
	if (oper) if (op==1 && cre->nmv==-1) 
		{ CGB_DetCR(cre->cres,cre->nmv,1,(void*)&(cre->mov)); SacarID(&(cre->idm)); }
	// Si edición registar cambio
	if (cre->nmv!=-1 && oper) switch(cre->mov.tp) {
	case 1: // Depósito
			if (!Futura(&(cre->moo.f))) ValCrePag(1,NULL,cre->cres,cre->moo.v);
	case 5: // Abono adicional
	 		if (!Futura(&(cre->moo.f))) 
	 		{ cre->cre.sa-=cre->moo.v; cre->cre.sc-=cre->moo.v; } break;
	case 2: // Compra
	case 3: // Retiro (ATM)
	case 4: // Cargo
			if (cre->mov.un.mvc.per.op!=0) RetAPagos(2,&(cre->cre),&(cre->mov));
			else if (RvC(2,&(cre->moo.f),cre->cre.un.tc.dc)) {
	 			cre->cre.sa+=cre->moo.v; 
				if (RvC(1,&(cre->moo.f),cre->cre.un.tc.dc)) cre->cre.sc+=cre->moo.v;
			}
			break;
	}
	// Leer nuevos valores
	Texto(s,GetObjPtr(f,201),false); cre->mov.v=AdblX(s);
	Texto(cre->mov.ds,GetObjPtr(f,205),false);
	// Afectar cuentas
	if (oper) {
		if (op==1) switch(cre->mov.tp) {
		case 1:	if (!Futura(&(cre->mov.f))) ValCrePag(2,NULL,cre->cres,cre->mov.v);
		case 5: if (!Futura(&(cre->mov.f))) {
			      cre->cre.sa+=cre->mov.v; cre->cre.sc+=cre->mov.v; 
				  cre->mov.un.mvc.rev=2; 
				} break;
		case 2: 
		case 3:	
		case 4: cre->mov.un.mvc.rev=0;
				if (cre->mov.un.mvc.per.op!=0) RetAPagos(1,&(cre->cre),&(cre->mov));
		        else if (RvC(2,&(cre->mov.f),cre->cre.un.tc.dc)) {
					cre->cre.sa-=cre->mov.v; cre->mov.un.mvc.rev=1;
			 		if (RvC(1,&(cre->mov.f),cre->cre.un.tc.dc)) {
			   			cre->cre.sc-=cre->mov.v;
			   			ProximoPago(0,&(cre->mov.un.mvc.fr),cre->cre.un.tc.dc,3);
			   			cre->mov.un.mvc.rev=2;
			 		}
			 		else FecHoy(&(cre->mov.un.mvc.fr));
				}
				break;
		}
		if (cre->mov.tp==1 || cre->mov.tp==3) 
			ActualizaCuenta(op,&(cre->mov),1,&(cre->idm),&(cre->ido),(cre->nmv!=-1));
		if (op==1) GuardarConID(&(cre->idm),(void *)&(cre->mov));
		else CGB_DetCR(cre->cres,cre->nmv,op,(void*)&(cre->mov));
		CGB_CR(cre->cres,1,&(cre->cre));
   		cre->cmb=true;
	}
}
Boolean RegMovCR(EventType* pEvent) {
Char  s[50];
Int16 v;
	switch (pEvent->eType) {
		case frmOpenEvent:  
			MemMove(&(cre->ido),&(cre->mov.idg),sizeof(ID));
			IniMov(FrmGetActiveForm(),true);
			return true;
		case frmUpdateEvent:
			switch(pEvent->data.frmUpdate.updateCode) {
			case 70: break;
			case 92: cre->slc=false; break;
			case 93: cre->slc=false; cre->mov.didg=true; break;
			case 95: cre->gas=false; cre->mov.didg=true; break;
			case 94: cre->gas=false; break;
			default: return false;
			} 
			IniMov(FrmGetActiveForm(),false); return true;
		case ctlSelectEvent:
		    switch(pEvent->data.ctlSelect.controlID) {
			case BCal: AceMov(FrmGetActiveForm(),1,false);
			           OpBotonCT(&(cre->oc)); return true;
		   	case BAce: if ((cre->mov.tp==1 || cre->mov.tp==3) && !cre->mov.didg) 
		   			   { FrmAlert(2100); break; }
					   if (cre->nmv!=-1)
		   			     if ((cre->mov.tp==2 || cre->mov.tp==3 || cre->mov.tp==4) && cre->mov.un.mvc.per.op!=0)
		   			       if (cre->mov.un.mvc.rev>=10) { if (FrmAlert(2101)==1) break; }
		   	           AceMov(FrmGetActiveForm(),1,true); cre->cmb=true; 
			case BCan: FrmUpdateForm(FDetallesCR,98); FrmReturnToForm(0); return true;
            case BBor: if (FrmAlert(104)!=1) break;
                       AceMov(FrmGetActiveForm(),2,true); cre->cmb=true; 
					   FrmUpdateForm(FDetallesCR,98); FrmReturnToForm(0); return true;
            case  300: cre->mov.un.mvc.per.op=((cre->mov.un.mvc.per.op!=0)?0:1);
            		   if (cre->mov.un.mvc.per.op!=0) 
            		        FrmShowObject(FrmGetActiveForm(),FrmGetObjectIndex(FrmGetActiveForm(),301));
            		   else FrmHideObject(FrmGetActiveForm(),FrmGetObjectIndex(FrmGetActiveForm(),301));  
            		   return true;
            case  301: cre->idf=FrmGetFormId(FrmGetActiveForm());
            		   AceMov(FrmGetActiveForm(),1,false);
                       FrmPopupForm(FRegPagosCR); return true;
		    }
		    break;
	    case fldEnterEvent:
            switch(pEvent->data.fldEnter.fieldID) {
            case  201: PonBotonCT(&(cre->oc),1,201,&(cre->mov.v),NULL,FrmGetActiveForm(),0,2100,0); return false;
            case  205: PonBotonCT(&(cre->oc),2,205,NULL,cre->mov.ds,FrmGetActiveForm(),sizeof(cre->mov.ds),2100,90); return false;
            default  : PonBotonCT(&(cre->oc),0,0,NULL,NULL,FrmGetActiveForm(),0,2100,0); return false;
            }
            break;
        case ctlEnterEvent:
            switch(pEvent->data.ctlEnter.controlID) {
        	case  203: AceMov(FrmGetActiveForm(),1,false);
        			   if (cre->mov.tp==2 || cre->mov.tp==4 || cre->mov.tp==5) {
                       	  v=Lista(GetObjPtr(FrmGetActiveForm(),203),
        	                      GetObjPtr(FrmGetActiveForm(),204),0,false,0,NULL);
        	           	  switch(v) {
        	           	  case 0: cre->mov.didg=false; break;
        	           	  case 1: cre->gas=true;
        	           	          IniciaGastos((cre->mov.tp==5)?1:0,2,FrmGetFormId(FrmGetActiveForm()),&(cre->mov.idg),cre->mov.didg,cre->col,0);
        	           	          break;
        	           	  case 2: IniMov(FrmGetActiveForm(),false); break;
        	           	  }
            		   }
            		   else 
        	           cre->slc=IniciaCuentas(FrmGetFormId(FrmGetActiveForm()),
            		                          &(cre->ide),&(cre->mov.idg),cre->mov.didg,cre->col);
        	           return true;
            }
            return false;
        case penDownEvent:
            if (EnFecMovCR(pEvent->screenX,pEvent->screenY)) {
            	AceMov(FrmGetActiveForm(),1,false);
		        SelFecha(s,&(cre->mov.f),false);
	        	IniMov(FrmGetActiveForm(),false);
                return true;
            }
            break;
		default: break;
	}
	return false;
}
// En pagos -----------------------------------------------------------
void IniPagCR(FormType *f, Boolean ini) {
Char   	s[250];
	if (ini) { 
		FrmDrawForm(f); 
	    cre->per.p=&(cre->mov.un.mvc.per); cre->per.f=FRegPagosCR; 
	    cre->per.ayu=&(cre->ayu);  
	    cre->per.col=cre->col;	cre->mov.un.mvc.per.v=cre->mov.v/(cre->mov.un.mvc.np+2); 
		cre->per.r.topLeft.x=56; cre->per.r.topLeft.y=30;
		cre->per.act=true; cre->per.tp=2; cre->per.inf=&(cre->cre);
		cre->mov.un.mvc.rev=0;
		MemMove(&(cre->per.p->f),&(cre->mov.f),sizeof(Fecha));
	}
	AstrX(cre->mov.un.mvc.per.v,s,false,true); Texto(s,GetObjPtr(f,113),true);
	Lista(GetObjPtr(f,100),GetObjPtr(f,101),cre->mov.un.mvc.np,true,0,NULL);
	PonPerCamp(&(cre->per),false);
	if (cre->oc.op==true) RefBotonCT(&(cre->oc));
	if (!cre->mov.un.mvc.didp) Lista(GetObjPtr(f,102),GetObjPtr(f,103),0,true,94,cre->str[3]);
	else { LeerConID(&(cre->mov.un.mvc.idp),&(cre->ga),false);
		   AjustaSTR(cre->str[3],cre->ga.Nom,94);	
		   CtlSetLabel(GetObjPtr(f,103),cre->str[3]); }
}
void AcePagCR(FormType *f, Boolean inigas, Boolean term) {
Char   s[120];
double d;
GA     g;
Char   gi;
	Texto(s,GetObjPtr(f,113),false); cre->mov.un.mvc.per.v=AdblX(s);
	if (inigas) {
		d=((cre->mov.un.mvc.np+2)*cre->mov.un.mvc.per.v)-cre->mov.v;
        cre->gas=true;
        if (!cre->mov.un.mvc.didp) gi=((d>0)?0:1);
        else {
        	LeerConID(&(cre->mov.un.mvc.idp),&g,true);
        	if (d>=0) { gi=0; if (g.TipoReg==3) cre->mov.un.mvc.didp=false; }
        	else      { gi=1; if (g.TipoReg==5) cre->mov.un.mvc.didp=false; }
        }
        IniciaGastos(gi,4,FRegPagosCR,&(cre->mov.un.mvc.idp),cre->mov.un.mvc.didp,cre->col,0);
	}
}
Boolean RegPagosCR(EventType* pEvent) {
Int16 v;
	switch (pEvent->eType) {
		case frmOpenEvent:  
			IniPagCR(FrmGetActiveForm(),true);
            PonBotonCT(&(cre->oc),0,0,NULL,NULL,FrmGetActiveForm(),0,2100,0);
			return true;
		case frmUpdateEvent:
			switch(pEvent->data.frmUpdate.updateCode) {
			case 70: break;
			case 94: cre->gas=false; break;
			case 95: cre->cmb=true; cre->gas=false; break;
			case 98: break;
			default: return false;
			} 
			IniPagCR(FrmGetActiveForm(),false); return true;
		case ctlSelectEvent:
		    switch(pEvent->data.ctlSelect.controlID) {
			case BCal: AcePagCR(FrmGetActiveForm(),false,false);
			           OpBotonCT(&(cre->oc)); return true;
		   	case BAce: AcePagCR(FrmGetActiveForm(),false,true); cre->cmb=true; 
			case BCan: FrmUpdateForm(cre->idf,70); FrmReturnToForm(0); return true;
			case  100: cre->mov.un.mvc.np=Lista(GetObjPtr(FrmGetActiveForm(),100),
        	                   			        GetObjPtr(FrmGetActiveForm(),101),0,false,0,NULL); 
					   cre->mov.un.mvc.per.v=cre->mov.v/(cre->mov.un.mvc.np+2);
		    		   IniPagCR(FrmGetActiveForm(),false); return true;
			case  102: v=Lista(GetObjPtr(FrmGetActiveForm(),102),
        	                   GetObjPtr(FrmGetActiveForm(),103),0,false,0,NULL);
        	           switch(v) {
        	           	  case 0: cre->mov.un.mvc.didp=false; break;
        	           	  case 1: AcePagCR(FrmGetActiveForm(),true,false); break;
        	           	  case 2: IniPagCR(FrmGetActiveForm(),false); break;
            		   }
        	           return true;
		    }
		    break;
	    case fldEnterEvent:
            switch(pEvent->data.fldEnter.fieldID) {
            case  113: PonBotonCT(&(cre->oc),1,113,&(cre->mov.un.mvc.per.v),NULL,FrmGetActiveForm(),0,2100,0); return false;
            default  : PonBotonCT(&(cre->oc),0,0,NULL,NULL,FrmGetActiveForm(),0,2100,0); return false;
            }
            break;
        case penDownEvent:
            if (EnPeriodo(pEvent->screenX,pEvent->screenY,&(cre->per))) {
            	AcePagCR(FrmGetActiveForm(),false,false);
            	PonPerCamp(&(cre->per),true);
		        SelecPeriodo(&(cre->per),true);
                return true;
            }
            break;
		default: break;
	}
	return false;
}
// **********************************************************************
//
// Registrar / Editar movimiento TX
//
// **********************************************************************
void CalcVencTX(Boolean normal, Periodo *p, double *sa) {
Int16 	pv,i;
double 	v,d;
Fecha   f;
	MemMove(&f,&(p->f),sizeof(Fecha));
	while(!Futura(&(p->f))) ProxFPPer(&(p->f),p,3);
	pv=PerVenc(&(cre->mov.f),p,NULL);
	MemMove(&(p->f),&f,sizeof(Fecha));
	cre->mov.un.mvt.pg=0; cre->mov.un.mvt.in=0; d=1.0+(cre->cre.un.tx.por/100.0);
	if (d>0) {
		if (normal) { v=(*sa)*-1; v*=d; v+=*sa; cre->mov.un.mvt.in+=v; }
		v=cre->mov.v+cre->mov.un.mvt.in; 
		for (i=0;i<pv;i++) v*=d; cre->mov.un.mvt.in=v-cre->mov.v; 
	}
}
void AgQuMovTX(Char op, ID *id, CRE *c, Fecha *f, UInt8 ad) {
Char 	s[150];
void    *inf1,*inf2;
Int16   t;
double  sp;
	inf1=SacarApRM(); inf2=SacarApMM();
	switch(op) {
	case 0: // Borrar existente
			do { t=CntLCR(3,cre->cres,NULL); if (t==0) break;
			     CGB_DetCR(cre->cres,0,2,NULL);
			} while(1==1);
			c->sa=-cre->si; c->sc=0; c->un.tx.pg=0;
			break;
	case 1: // Insertar nuevo normal
			c->un.tx.pg++; 
			MemMove(&(cre->mov.f),f,sizeof(Fecha));
			cre->mov.tp=1; cre->mov.ct=0;
			SacaTexto(cre->mov.p,2100,102,150); StrCat(cre->mov.p," ");
			StrIToA(s,c->un.tx.pg); StrCat(cre->mov.p,s); StrCat(cre->mov.p,"/");
			StrIToA(s,c->un.tx.p); StrCat(cre->mov.p,s); 
			StrCat(cre->mov.ds," ");
			cre->mov.didg=false; 
			sp=c->sa*-1;
			if (c->un.tx.pg==c->un.tx.p) cre->mov.v=sp;
			else if (c->un.tx.pp>sp) cre->mov.v=sp; 
			else cre->mov.v=c->un.tx.pp; 
			cre->mov.un.mvt.nmv=c->un.tx.pg;
			CalcVencTX(true,&(c->un.tx.per),&(c->sa)); 
			c->sa+=cre->mov.v;	c->sc-=(cre->mov.v+cre->mov.un.mvt.in);	
			MemMove(inf1,c,sizeof(CRE)); MemMove(inf2,&(cre->mov),sizeof(MOVC)); CGB_ID(id,3);
			break;
	case 2: // Insertar nuevo adicional
			MemMove(&(cre->mov.f),f,sizeof(Fecha));
			MemMove(&(c->un.tx.pga[ad].fr),f,sizeof(Fecha));
			cre->mov.tp=2; cre->mov.ct=ad;
			SacaTexto(cre->mov.p,2100,99,150);
			StrCat(cre->mov.ds," ");
			cre->mov.didg=false; cre->mov.v=c->un.tx.pga[ad].v;
			CalcVencTX(false,&(c->un.tx.per),&(c->sa)); 
			c->sc-=(cre->mov.v+cre->mov.un.mvt.in);
			MemMove(inf1,c,sizeof(CRE)); MemMove(inf2,&(cre->mov),sizeof(MOVC)); CGB_ID(id,3);
			break;
	}
}
// Calcular aduedo del documento en la fecha dada
void CalcDocTX(double *dc, double *in, MOVC *mov, Fecha *f) {
double 	d;
Fecha   fi,ff;
	if (mov->un.mvt.pg>=mov->v) *dc=0; else *dc=mov->v-mov->un.mvt.pg;
	*in=mov->un.mvt.in;
	MemMove(&fi,&(cre->cre.un.tx.per.f),sizeof(Fecha));	d=1.0+(cre->cre.un.tx.por/100.0);
	do { ProxFPPer(&fi,&(cre->cre.un.tx.per),6); 
		 MemMove(&ff,&fi,sizeof(Fecha)); ProxFPPer(&ff,&(cre->cre.un.tx.per),2);
		 if (Comp2Fec(&ff,&(cre->fpag))==1) *in=((*in+*dc)/d)-*dc;
		 else break;
	} while(1==1);
}
// Aceptar/Borrar pago - ajustar cuentas - registrar movimientos en cuentas
Boolean RevPagTX(Boolean borrar) { 
double 		ap,dc;
Int8   		r=0;
Int16   	t,tf,pt,i,tm;
double  	d[5];
MOVC 		mov,*mv;
ID      	id;
Char    	s[150];
MemHandle 	m;
Fecha       h;
	if (!borrar) {
		// Si no se seleccionó cuenta cancelar
		if (!cre->mov.didg) { FrmAlert(2100); return false; }
		cre->apagx+=0.000001;
		// Si pago mayor a adeudo preguntar que hacer
		if (cre->apag>cre->apagx) switch(FrmAlert(2111)) {
		case 0: r=1; break; 		// No abonar
		case 1: r=2; break;			// Abonar dif a saldo
		case 2: return false;		// Cancelar
		}
		// Documentos entre el último pagado y la fecha dada de pago
		// después de la fecha (tf) y en total (t)
		tm=CntLCR(3,cre->cres,d); for (t=tf=0,i=tm-1;i>=0;i--,t++) {
			CGB_DetCR(cre->cres,i,0,(void*)&mov);
			if (mov.tp==1 || mov.tp==2 || mov.tp==3) {
				d[1]=(mov.v+mov.un.mvt.in-mov.un.mvt.pg);
				if (d[1]==0) break;
				if (Comp2Fec(&(mov.f),&(cre->fpag))==1) tf++;
			}
		}
	} else { tm=CntLCR(3,cre->cres,d); tf=tm-1-cre->nmv; t=tm-tf-1; }
	// Eliminar documentos después de la fecha y respaldarlos
	if (tf>0) { 
		m=MemHandleNew(sizeof(MOVC)*tf); mv=(MOVC*)MemHandleLock(m);
		for (pt=tf-1,i=tm-1;pt>=0;i--,pt--) { // Eliminarlos y respaldarlos
			CGB_DetCR(cre->cres,i,0,(void*)&(mv[pt]));
			cre->cre.sa-=mv[pt].v;	
			cre->cre.sc+=(mv[pt].v+mv[pt].un.mvt.in);	
			CGB_DetCR(cre->cres,i,2,(void*)&mov);
		}
	}
	CGB_CR(cre->cres,1,&(cre->cre)); SacarID(&id);
	// Ajustar cuentas de docs antes de la fecha, ajustar saldos
	ap=cre->apag; FecHoy(&h);
	if (t>0) {
		if (ap>0) for (pt=t-tf,i=tm-t;pt>0;i++,pt--) { 
			CGB_DetCR(cre->cres,i,0,(void*)&(mov));
			if (!borrar) {
				cre->cre.sc+=mov.un.mvt.in;
				CalcDocTX(&dc,&(mov.un.mvt.in),&(mov),&(cre->fpag));
				cre->cre.sc-=mov.un.mvt.in;
				d[1]=mov.v+mov.un.mvt.in-mov.un.mvt.pg;
				if (ap<d[1]) d[1]=ap;
				ap-=d[1]; mov.un.mvt.pg=d[1]; cre->cre.sc+=d[1];
			}
			else {
				switch(cre->mov.tp) {
				case 4:
				case 5:
				}
				/////////if (mov.v+mov.un.mvt.in<=ap) 
			}
			CGB_DetCR(cre->cres,i,1,(void*)&(mov));
			if (ap==0 || !cre->paggen) break;
		}
	}
	if (r==2) cre->cre.sa+=ap; 
	CGB_CR(cre->cres,1,&(cre->cre));
	// Agregar o borrar movimiento de pago
	if (borrar) CGB_DetCR(cre->cres,cre->nmv,2,(void*)&mov);
	else {
		MemMove(&(mov.f),&(cre->fpag),sizeof(Fecha)); mov.ct=r; 
		if (cre->paggen) { SacaTexto(mov.p,2100,108,150); mov.tp=5; }
		else switch(cre->mov.tp) {
		case 1: SacaTexto(mov.p,2100,106,150); StrCat(mov.p," ");
				StrIToA(s,cre->cre.un.tx.pg); StrCat(mov.p,s); StrCat(mov.p,"/");
				StrIToA(s,cre->cre.un.tx.p);  StrCat(mov.p,s); 
				mov.un.mvt.nmv=cre->mov.un.mvt.pg; mov.tp=4; break;
		case 2: SacaTexto(mov.p,2100,107,150); StrCat(mov.p," ");
				ForFec(s,7,&(cre->mov.f)); StrCat(mov.p,s); 
				mov.un.mvt.nmv=cre->mov.ct; mov.tp=4; break;
		}
		StrCopy(mov.ds,cre->dstx); mov.v=cre->apag;
		mov.didg=true; MemMove(&(mov.idg),&(cre->mov.idg),sizeof(ID));
		CGB_DetCR(cre->cres,-1,1,(void*)&mov);
	}
	// Reinsertar documentos respaldados
	if (tf>0) {
		d[1]=1.0+(cre->cre.un.tx.por/100.0);
		for (i=0;i<tf;i++) {
			mv[i].un.mvt.pg=0; mv[i].un.mvt.in=0; 
			if (mv[i].tp==1) mv[i].un.mvt.in=(cre->cre.sa*-1*d[1])+cre->cre.sa;
			CalcDocTX(&dc,&(mv[i].un.mvt.in),&(mv[i]),&h);
			cre->cre.sa+=mv[i].v;
			cre->cre.sc-=(mv[pt].v+mv[pt].un.mvt.in);
			CGB_DetCR(cre->cres,-1,1,(void*)&(mv[i]));
		}
		CGB_CR(cre->cres,1,&(cre->cre));
		MemHandleUnlock(m); MemHandleFree(m);
	}
	// generar movimiento en cuenta destino
	return false;
}
// cnt: bit 1=Inicio 2=Pon 3=IniVal
Char PintaPagTX(FormType *f, Int8 cnt) {
Boolean t;
double  dc,in,d[5];
Char    s[150],q[150];
Int8    a;
Int16   bc;
MOVC    mov;
Int16   i,tm;
	if (cnt&2) {
		// Iniciar la forma
		if (cnt&1) { if (!cre->paggen) FrmDrawForm(f); FecHoy(&(cre->fpag)); StrCopy(cre->dstx," "); }
		if (cre->paggen) {
			FrmHideObject(f,FrmGetObjectIndex(f,200));
			FrmDrawForm(f);
			PintaB(255,0,16,159,26,8,0,1,2,true,cre->col);
			bc=WinSetBackColor(cre->col[8]); 
			FrmShowObject(f,FrmGetObjectIndex(f,200));
			WinSetBackColor(bc); 
		}
		else {
			PintaB(255,0,16,159,18,8,0,1,2,true,cre->col);
			switch(cre->mov.tp) {
			case 1: SacaTexto(s,2100,98,150); StrCat(s," ");
					StrIToA(q,cre->mov.un.mvt.nmv); StrCat(s,q); StrCat(s,"/");
					StrIToA(q,cre->cre.un.tx.p); StrCat(s,q);
					break;
			case 2: StrCopy(s,cre->cre.un.tx.pga[cre->mov.ct].s); break;
			}
			PonTexto(s,80,19,B,C,146,false,-1,cre->col[8],&a);
		}
		// Revisar fecha del pago
		if (cnt&4) {
			tm=CntLCR(3,cre->cres,d);
			// Si fecha de pago < fecha de emisión de doc ajustar
			if (!cre->paggen) if (Comp2Fec(&(cre->fpag),&(cre->mov.f))==-1) 
				MemMove(&(cre->fpag),&(cre->mov.f),sizeof(Fecha));
			// No puede haber un pago antes del primer documento
			CGB_DetCR(cre->cres,0,0,(void*)&mov);
			if (Comp2Fec(&(cre->fpag),&(mov.f))==-1) MemMove(&(cre->fpag),&(mov.f),sizeof(Fecha));
			// Revisar que no exista un pago previo
			for (i=0;i<tm;i++) {
				CGB_DetCR(cre->cres,i,0,(void*)&mov);
				if (mov.tp==4 || mov.tp==5) if (Comp2Fec(&(mov.f),&(cre->mov.f))<=0) 
				{ FrmAlert(2112); FecHoy(&(cre->fpag)); break; }
			}
			// Revisar la fecha no sea mayor a hoy
			if (Futura(&(cre->mov.f))) { FrmAlert(2113); FecHoy(&(cre->fpag)); }
		}		
		cre->hf=PonFecCamp(61,(cre->paggen)?50:40,&(cre->fpag),-1,-1,true,&cre->wf);
		// Calcular valor a pagar en la fecha dada
		// Caso de pago general
		if (cre->paggen) {
			tm=CntLCR(3,cre->cres,d); d[0]=cre->cre.sc*-1;
			for (i=tm-1;i>=0;i--) {
				CGB_DetCR(cre->cres,i,0,(void*)&mov);
				if (mov.tp==1 || mov.tp==2 || mov.tp==3) {
					d[1]=(mov.v+mov.un.mvt.in-mov.un.mvt.pg);
					if (d[1]==0) break;	d[0]-=d[1];
					if (Comp2Fec(&(mov.f),&(cre->fpag))<=0) 
					{ CalcDocTX(&dc,&in,&(mov),&(cre->fpag)); d[0]+=(dc+in); }
				}
			}
			PintaB(255,61,65,90,15,2,2,2,2,false,cre->col);
			AstrX(d[0],s,false,true); PonTexto(s,61,65,N,I,0,false,-1,-1,&a);
			if (cnt&4) cre->apagx=cre->apag=d[0];
		}
		// Caso de pago de documento
		else {
			CalcDocTX(&dc,&in,&(cre->mov),&(cre->fpag));
			PintaB(255,61,55,90,30,2,2,2,2,false,cre->col);
			AstrX(dc,s,false,true); PonTexto(s,61,55,N,I,0,false,-1,-1,&a);
			AstrX(in,s,false,true); PonTexto(s,61,70,N,I,0,false,-1,-1,&a);
			if (cnt&4) cre->apagx=cre->apag=dc+in;
		}
		AstrX(cre->apag,s,false,true); Texto(s,GetObjPtr(f,100),true);
		Texto(cre->dstx,GetObjPtr(f,101),true);
		IniCuenta(f,cre->mov.didg,&(cre->mov.idg),&(cre->mov.tppl),true,&(cre->mov.NumChRef),&t);
		if (cre->mov.didg) {
			switch(PonValorCuenta(f,114,&(cre->mov.idg),cre->mov.didg,cre->str[7])) {
			case 1: Lista(GetObjPtr(f,115),GetObjPtr(f,210),cre->mov.tppl,true,0,NULL);	break;
			case 2: break;
			case 7: AstrX(cre->mov.NumChRef,s,false,false); Texto(s,GetObjPtr(f,116),true);		
					Lista(GetObjPtr(f,115),GetObjPtr(f,211),cre->mov.tppl,true,0,NULL);
					break;  
			}
		}
	}
	else { 
		Texto(s,GetObjPtr(f,100),false); cre->apag=AdblX(s); 
		Texto(cre->dstx,GetObjPtr(f,101),false);
	}
	return 0;
}
Boolean PagDocTX(EventType* pEvent) {
Char s[150],t[50];
	switch (pEvent->eType) {
		case frmOpenEvent:
		    PintaPagTX(FrmGetActiveForm(),7);
			return true;
		case frmUpdateEvent:
			switch(pEvent->data.frmUpdate.updateCode) {
		  	case 92: cre->slc=false; break;
			case 93: cre->slc=false; cre->mov.didg=true; cre->mov.tppl=0; break;
			default: return false;
			} 
			PintaPagTX(FrmGetActiveForm(),2); return true;
		case ctlSelectEvent:
		    switch(pEvent->data.ctlSelect.controlID) {
			case BCal: PintaPagTX(FrmGetActiveForm(),0);
			           OpBotonCT(&(cre->oc)); return true;
		   	case BAce: PintaPagTX(FrmGetActiveForm(),0);
		   			   if (!RevPagTX(false)) break;
		   	           FrmUpdateForm(FVerDocTX,70); FrmReturnToForm(0); return true;
		   	case BCan: FrmUpdateForm(FVerDocTX,71); FrmReturnToForm(0); return true;
		    }
		    break;
        case ctlEnterEvent:
            switch(pEvent->data.ctlEnter.controlID) {
            case  114: PintaPagTX(FrmGetActiveForm(),0);
                       cre->slc=IniciaCuentas(FPagDocTX,&(cre->idc),&(cre->mov.idg),cre->mov.didg,cre->col); 
                       return true;
            } break;
	    case fldEnterEvent:
            switch(pEvent->data.fldEnter.fieldID) {
            case  100: PonBotonCT(&(cre->oc),1,100,&(cre->mov.v),NULL,FrmGetActiveForm(),0,2100,0); return false;
            default  : PonBotonCT(&(cre->oc),0,0,NULL,NULL,FrmGetActiveForm(),0,2100,0); return false;
            }
            break;
        case penDownEvent:
            if (EnFecTX((cre->paggen)?2:1,pEvent->screenX,pEvent->screenY)) {
            	PintaPagTX(FrmGetActiveForm(),0);
            	BorFecCamp(61,(cre->paggen)?50:40,cre->wf,cre->hf,-1);
				if (cre->paggen) SacaTexto(s,2100,108,150);
				else switch(cre->mov.tp) {
				case 1: SacaTexto(s,2100,106,150); StrCat(s," ");
						StrIToA(t,cre->mov.un.mvt.nmv); StrCat(s,t); StrCat(s,"/");
						StrIToA(t,cre->cre.un.tx.p);  StrCat(s,t); break;
				case 2: SacaTexto(s,2100,107,150); StrCat(s," ");
						ForFec(t,7,&(cre->mov.f)); StrCat(s,t); break;
            	}
		        SelFecha(s,&(cre->fpag),false);
		        PintaPagTX(FrmGetActiveForm(),6);
            	return true;
            }
		default: break;
	}
	return false;
}
// Si hay un documento anterior al seleccionado quitar botón "Pagar"
void RevDocsTX(FormType *f) {
MOVC 	mov;
double  d[5];
Int16   i,tm;
	if (cre->mov.v+cre->mov.un.mvt.in-cre->mov.un.mvt.pg==0)
		FrmHideObject(f,FrmGetObjectIndex(f,2000));
	else {
		tm=CntLCR(3,cre->cres,d);	
		if (tm>1) {
			for (i=0;i<tm;i++) if (i!=cre->nmv) {
				CGB_DetCR(cre->cres,i,0,(void*)&mov);
				if (mov.tp<3) if (mov.v+mov.un.mvt.in-mov.un.mvt.pg>0) break;
			}
			if (i<cre->nmv) FrmHideObject(f,FrmGetObjectIndex(f,2000));
		}
	}
}
void PintaDocTX(FormType *f, Boolean ini, Boolean pon) {
Int16 	i,bc;
Int8  	aa;
Char 	s[150],t[150];
double  v;
	switch(cre->mov.tp) {
	case 1: case 2:
	case 3:	if (pon) {
				for (i=0;i<5;i++) FrmHideObject(f,FrmGetObjectIndex(f,i+100));
				if (Futura(&(cre->mov.f))) 
					{ SacaTexto(s,2100,100,150); FrmCopyLabel(f,100,s); }
				FrmDrawForm(f);
				PintaB(255,1,13,153,18,8,0,1,2,true,cre->col);	PintaB(255,1,31,153,87,9,0,1,2,true,cre->col);
				PintaB(255,3,97,148,18,6,1,0,2,true,cre->col);	PintaB(255,50,33,101,62,2,1,0,2,true,cre->col);
				switch(cre->mov.tp) {
				case 1: SacaTexto(s,2100,98,150); StrCat(s," ");
						StrIToA(t,cre->mov.un.mvt.nmv); StrCat(s,t); StrCat(s,"/");
						StrIToA(t,cre->cre.un.tx.p); StrCat(s,t);
						break;
				case 2: StrCopy(s,cre->cre.un.tx.pga[cre->mov.ct].s); break;
				}
				PonTexto(s,80,17,B,C,146,false,-1,cre->col[8],&aa);
				bc=WinSetBackColor(cre->col[9]);
				for (i=0;i<5;i++) FrmShowObject(f,FrmGetObjectIndex(f,i+100));
				WinSetBackColor(cre->col[6]);
				FrmShowObject(f,FrmGetObjectIndex(f,105));
				WinSetBackColor(bc);
				ForFec(s,6,&(cre->mov.f)); PonTexto(s,53,35,N,I,0,false,-1,-1,&aa);
				PerVenc(&(cre->mov.f),&(cre->cre.un.tx.per),s);
				PonTexto(s,53,47,N,I,0,false,-1,-1,&aa);
				AstrX(cre->mov.v, s,true,true); PonTexto(s,53,59,N,I,80,false,-1,-1,&aa);
				AstrX(cre->mov.un.mvt.in,s,true,true); PonTexto(s,53,71,N,I,80,false,-1,-1,&aa);
				AstrX(cre->mov.un.mvt.pg,s,true,true); PonTexto(s,53,83,N,I,80,false,-1,-1,&aa);
				v=cre->mov.v+cre->mov.un.mvt.in-cre->mov.un.mvt.pg;
				AstrX(v,s,true,true); PonTexto(s,150,101,B,D,80,false,-1,cre->col[6],&aa);
				if (ini) RevDocsTX(f);
			}
			break;
	case 4:
	case 5: 
	        break;
	}
}
Boolean VerDocTX(EventType* pEvent) {
	switch (pEvent->eType) {
		case frmOpenEvent:  
			PintaDocTX(FrmGetActiveForm(),true,true);
			return true;
		case frmUpdateEvent:
			switch(pEvent->data.frmUpdate.updateCode) {
			case 70: break;
			case 71: break;
			default: return false;
			} 
			PintaDocTX(FrmGetActiveForm(),false,true); return true;
		case ctlSelectEvent:
		    switch(pEvent->data.ctlSelect.controlID) {
		   	case BAce: FrmUpdateForm(cre->idf,70); FrmReturnToForm(0); return true;
		   	case 2000: cre->paggen=false; FrmPopupForm(FPagDocTX); break;
		    }
		    break;
	    case fldEnterEvent:
            switch(pEvent->data.fldEnter.fieldID) {
//            case  113: PonBotonCT(&(cre->oc),1,113,&(cre->per.v),NULL,FrmGetActiveForm(),0,2100,0); return false;
            default  : PonBotonCT(&(cre->oc),0,0,NULL,NULL,FrmGetActiveForm(),0,2100,0); return false;
            }
            break;
		default: break;
	}
	return false;
}
// **********************************************************************
//
// DETALLES (movimientos) CUENTA DE CREDITO
//
// **********************************************************************
// Pintar lista
void PntLDetCR(Int16 it, RectangleType *r,char **u, ListType *p) {
Boolean  		pn;
Int16    		bc,x,y;
RectangleType 	q;
Char            s[51];
double          v;
Int8            a;
	pn=SelecLst(cre->col[0]);
    q.topLeft.x=r->topLeft.x; q.topLeft.y=r->topLeft.y; 
    q.extent.y=r->extent.y; q.extent.x=150;
    if (pn && ((it&0x01)>0)) {
		bc=WinSetBackColor(cre->col[6]); 
		WinEraseRectangle(&q,0);
    }
    switch(cre->cre.tp) {
    case 0: case 1: case 2: case 3:
    case 4: CGB_DetCR(cre->cres,it,0,(void*)&(cre->mov)); x=r->topLeft.x; y=r->topLeft.y;
    		ForFec(s,1,&(cre->mov.f));
    		PonTexto(s,x,y,N,I,26,false,-1,-1,&a); x+=28;
    		PonTexto(cre->mov.p,x,y,N,I,64,false,-1,-1,&a);
    		v=cre->mov.v; 
    		if (cre->mov.tp==2 || cre->mov.tp==3 || cre->mov.tp==4) v*=-1;
    		AstrX(v,s,false,true);
    		PonTexto(s,150,y,N,D,55,false,((v<0 && pn)?cre->col[5]:-1),-1,&a);
    		break;
    case 5: case 6:
    case 7: CGB_DetCR(cre->cres,it,0,(void*)&(cre->mov)); x=r->topLeft.x; y=r->topLeft.y;
    		ForFec(s,1,&(cre->mov.f));
    		PonTexto(s,x,y,N,I,26,false,-1,-1,&a); x+=28;
    		switch(cre->mov.tp) {
    		case 1: PonTexto(cre->mov.p,x,y,N,I,64,false,-1,-1,&a); break;
    		case 2: PonTexto(cre->cre.un.tx.pga[cre->mov.ct].s,x,y,N,I,64,false,-1,-1,&a); break;
    		}
    		v=cre->mov.v+cre->mov.un.mvt.in-cre->mov.un.mvt.pg;
    		if (cre->mov.tp==1 || cre->mov.tp==2 || cre->mov.tp==3) v*=-1;
    		AstrX(v,s,false,true); PonTexto(s,150,y,N,D,55,false,((v<0 && pn)?cre->col[5]:-1),-1,&a);
    		break;
    }
	if (pn && ((it&0x01)>0)) WinSetBackColor(bc);
}
// Sacar valor de opreación a realizar
void ListaOper(FormType *f) {
   switch(cre->cre.tp) {
   	case 0: case 1: case 2: case 3:
    case 4: switch(LstPopupList((ListType*)GetObjPtr(f,100))) {
            case 0: cre->mov.tp=2; cre->nmv=-1; FrmPopupForm(FRegComCR); break;
            case 1: cre->mov.tp=1; cre->nmv=-1; FrmPopupForm(FRegDepCR); break;
            case 2: cre->mov.tp=3; cre->nmv=-1; FrmPopupForm(FRegRetCR); break;
            case 3: cre->mov.tp=4; cre->nmv=-1; FrmPopupForm(FRegCarCR); break;
            case 4: cre->mov.tp=5; cre->nmv=-1; FrmPopupForm(FRegAboCR); break;
    		} break;
    case 5: case 6:
    case 7: switch(LstPopupList((ListType*)GetObjPtr(f,101))) {
            } break;
   }
}
void IniciaListaTX(FormType *f) {
Int16 	tm,i;
double  d[5];
MOVC    mov;
	tm=CntLCR(3,cre->cres,d);
	for (i=0;i<tm;i++) {
		CGB_DetCR(cre->cres,i,0,(void*)&mov);
		if (mov.tp==1 || mov.tp==2)
			if (mov.v+mov.un.mvt.in-mov.un.mvt.pg>0) break;
	}
	if (i>tm) i=tm;
	LstSetSelection(GetObjPtr(f,110),i);
	if (tm==0) FrmHideObject(f,FrmGetObjectIndex(f,BNue)); 
}
// Principal detalles cuenta de crédito
Boolean DetallesCR(EventType* pEvent) {
Int16 v;
	switch (pEvent->eType) {
		case frmUpdateEvent:
			switch(pEvent->data.frmUpdate.updateCode) {
				case 60: cre->pen=false; break;
				case 70: break;
				case 90: cre->ayu=false; break;
				case 98: break;
				case 99: if (cre->ox==0) FrmUpdateForm(FResumenCR,99); 
		   			     else            FrmUpdateForm(FSaldoCorteCR,99);
		   			     FrmReturnToForm(0); return true;
		   		case 92: FrmUpdateForm(FResumenCR,92); FrmReturnToForm(0); return true;
				default: return false;
			}
			PFormaCR(3,false); return true;
		case frmOpenEvent:
		    PFormaCR(3,true); 
		    if (cre->cre.tp==5 || cre->cre.tp==6 || cre->cre.tp==7) IniciaListaTX(FrmGetActiveForm());
			return true;
		case ctlSelectEvent:
		    switch(pEvent->data.ctlSelect.controlID) {
		   	case BAyu: cre->ayu=Ayuda(2106,1,cre->col,FResumenCR); return true;
		   	case BAce: if (cre->ox==0) FrmUpdateForm(FResumenCR,70); 
		   			   else            FrmUpdateForm(FSaldoCorteCR,70);
		   			   FrmReturnToForm(0); return true;
		   	case BNue: if (cre->cre.tp==5 || cre->cre.tp==6 || cre->cre.tp==7) 
		   					{ cre->paggen=true; FrmPopupForm(FPagTX); }
		   			   else ListaOper(FrmGetActiveForm()); return true;
		   	case BDat: FrmPopupForm(FVerDatosCR); return true;
		   	case BHom: if (cre->ox==0) FrmUpdateForm(FResumenCR,99); 
		   			   else            FrmUpdateForm(FSaldoCorteCR,99);
		   			   FrmReturnToForm(0);
		   			   return true;
		   	case BPen: cre->pen=Pendientes(FrmGetActiveForm(),&(cre->idc),cre->col); return true;
		    }
		    break;
        case lstSelectEvent:
		    v=pEvent->data.lstSelect.selection;
		    if (v==noListSelection) break; cre->nmv=v;
		    switch(cre->cre.tp) {
		    case 0: case 1: case 2: case 3:
		    case 4: CGB_DetCR(cre->cres,cre->nmv,0,(void*)&(cre->mov)); SacarID(&(cre->idm));
		    		switch(cre->mov.tp) {
   	           		case 1: FrmPopupForm(FRegDepCR); break;
   	           		case 2: FrmPopupForm(FRegComCR); break;
   	           		case 3: FrmPopupForm(FRegRetCR); break;
   	           		case 4: FrmPopupForm(FRegCarCR); break;
   	           		case 5: FrmPopupForm(FRegAboCR); break;
		    		} break;
		    case 5: case 6:
		    case 7: CGB_DetCR(cre->cres,cre->nmv,0,(void*)&(cre->mov)); SacarID(&(cre->idm));
		    		
		    		switch(cre->mov.tp) {
		    		case 1: 
		    		case 2: FrmPopupForm(FVerDocTX); break;
		    		case 4:
		    		case 5: FrmPopupForm(FVerPagTX); break;
		    		} break;
		    }
            return true;
		default: break;
	}
	return false;
}
// **********************************************************************
//
// SALDO AL CORTE
//
// **********************************************************************
// Pintar lista saldo al corte
void PntLScCR(Int16 it, RectangleType *r,char **u, ListType *p) {
Boolean  		pn;
Int16    		bc,x,y;
RectangleType 	q;
Char            s[51];
Int8            a;
	pn=SelecLst(cre->col[0]);
    q.topLeft.x=r->topLeft.x; q.topLeft.y=r->topLeft.y; 
    q.extent.y=r->extent.y; q.extent.x=150;
    if (pn) {
		bc=WinSetBackColor((((it&0x01)>0)?cre->col[6]:cre->col[2])); 
		WinEraseRectangle(&q,0);
    }
    CGB_CR(it,0,&(cre->cre)); x=r->topLeft.x; y=r->topLeft.y;
    PintaImagen(2110+cre->cre.tp,x,y+1);  x+=16;
    PonTexto(cre->cre.ctc,x,y,N,I,34,false,-1,-1,&a); x+=34;
    AstrX(cre->cre.sc,s,false,false); PonTexto(s,x+50,y,N,D,50,false,-1,-1,&a); x+=50;
    ProxP(s,cre->cre.dp,1,true); PonTexto(s,150,y,N,D,50,false,-1,-1,&a);
	if (pn) WinSetBackColor(bc);
}
// Principal
Boolean SaldoCorteCR(EventType* pEvent) {
Int16 v;
	switch (pEvent->eType) {
		case frmOpenEvent:
		    cre->ox=1; 
		    PFormaCR(2,true);return true;
        case frmUpdateEvent:
			switch(pEvent->data.frmUpdate.updateCode) {
		    case  0: PFormaCR(2,false); break;
			case 90: cre->ayu=false; return true;
			case 99: FrmUpdateForm(FResumenCR,99); FrmReturnToForm(0);
		   	 	 	 return true;
			}
		    return true;
		case ctlSelectEvent:
		    switch(pEvent->data.ctlSelect.controlID) {
		   	case BAyu: cre->ayu=Ayuda(2102,1,cre->col,FResumenCR); return true;
		   	case BAce: FrmReturnToForm(0); return true;
		   	case BHom: FrmUpdateForm(FResumenCR,99); FrmReturnToForm(0);
				 	   return true;
		   	case 1010: cre->ox=((cre->ox==1)?2:1); 
					   FrmUpdateForm(FSaldoCorteCR,0);
					   return true;
		    }
		    break;
        case lstSelectEvent:
		    v=pEvent->data.lstSelect.selection;
		    if (v==noListSelection) break;
		    cre->cres=v; FrmPopupForm(FDetallesCR);
		default: break;
	}
	return false;
}
// **********************************************************************
//
// RESUMEN GENERAL
//
// **********************************************************************
// Pintar lista resumen
void PntLResCR(Int16 it, RectangleType *r,char **u, ListType *p) {
Boolean  		pn;
Int16    		bc,x,y;
RectangleType 	q;
Char            s[51];
Int8            a;
	pn=SelecLst(cre->col[0]);
    q.topLeft.x=r->topLeft.x; q.topLeft.y=r->topLeft.y; 
    q.extent.y=r->extent.y; q.extent.x=150;
    if (pn) {
		bc=WinSetBackColor((((it&0x01)>0)?cre->col[6]:cre->col[2])); 
		WinEraseRectangle(&q,0);
    }
    CGB_CR(it,0,&(cre->cre)); x=r->topLeft.x; y=r->topLeft.y;
    PintaImagen(2110+cre->cre.tp,x,y+1);  x+=16;
    PonTexto(cre->cre.ctc,x,y,N,I,34,false,-1,-1,&a); x+=34;
    AstrX(cre->cre.sa,s,false,true); 
    PonTexto(s,x+48,y,N,D,48,false,((cre->cre.sa<0 && pn)?cre->col[5]:-1),-1,&a); x+=48;
    AstrX(cre->cre.sc,s,false,true); 
    PonTexto(s,x+48,y,N,D,48,false,((cre->cre.sc<0 && pn)?cre->col[5]:-1),-1,&a);
	if (pn) WinSetBackColor(bc);
}
// Principal
Boolean ResumenCR(EventType* pEvent) {
Int16 v;
	switch (pEvent->eType) {
		case frmUpdateEvent:
			switch(pEvent->data.frmUpdate.updateCode) {
			case 70: break;
			case 90: cre->ayu=false; break;
			case 98: break;
			case 99: if (FinalizaCR(false)) FrmUpdateForm(FPrincipal,99);
				 	 else FrmUpdateForm(FPrincipal,98);
				 	 FrmReturnToForm(0);
		   	 	 	 return true;
		   	case 92: break;
			default: return false;
			}
			PFormaCR(1,false); return true;
		case frmOpenEvent:
		    PFormaCR(1,true);
			return true;
		case ctlSelectEvent:
		    switch(pEvent->data.ctlSelect.controlID) {
		   	case BAce: if (FinalizaCR(false)) FrmUpdateForm(FPrincipal,99);
					   else FrmUpdateForm(FPrincipal,98); FrmReturnToForm(0);
		   	 		   return true;
		   	case BAyu: cre->ayu=Ayuda(2100,1,cre->col,FResumenCR); return true;
		   	case BNue: v=LstPopupList((ListType*)GetObjPtr(FrmGetActiveForm(),100));
		   			   cre->cres=-1;
		   			   switch(v) {
		   			   	case 0: cre->cre.tp=0; FrmPopupForm(FEditarCR_TC); return true;
		   			   	case 1: return true;
		   			   	case 2: cre->cre.tp=6; FrmPopupForm(FEditarCR_TX); return true;
		   			   	case 3: cre->cre.tp=5; FrmPopupForm(FEditarCR_TX); return true;
		   			   	case 4: cre->cre.tp=7; FrmPopupForm(FEditarCR_TX); return true;
		   			   }
    				   break;
		   	case 1010: FrmPopupForm(FSaldoCorteCR); return true;
		    }
		    break;
        case lstSelectEvent:
		    v=pEvent->data.lstSelect.selection;
		    if (v==noListSelection) break;
		    cre->ox=0; cre->cres=v; FrmPopupForm(FDetallesCR);
            return true;
		default: break;
	}
	return false;
}
// **********************************************************************
//
// Actualizar saldos al iniciar
//
// **********************************************************************
void ActualizaSaldosTC() {
double  d[5],v,p,t;
Int16   k,j,i,tc,tm;
MOVC    mov;
CRE     cre;
Fecha   fc,fp,f,g;
Boolean c;
ID      id;
void    *inf1;
	tc=CntLCR(1,0,d);
 	for (i=0;i<tc;i++) {
 		c=false; CGB_CR(i,0,&cre); SacarID(&id);
 		switch (cre.tp) {
 		case 0:	case 1:	case 2:	case 3:
 		case 4: tm=CntLCR(3,i,d); 
 				// Siempre revisar si hay movimientos que inician hoy
 				for (j=0;j<tm;j++) {
	 				CGB_DetCR(i,j,0,&mov); 
	 				if ((mov.un.mvc.rev==0 || mov.un.mvc.rev==10) && !Futura(&(mov.f)))
	 					if (RgMovCR(&cre,&mov)) { c=true; CGB_DetCR(i,j,1,&mov); }
 				}
 				if (c) CGB_CR(i,1,&cre);
 		        // Cambio de dia a fecha de pago o fecha de corte
 		        if (Pasada(&(cre.fr))) {
 				 	for (j=0;j<tm;j++) {
		 				CGB_DetCR(i,j,0,&mov); 
		 				if (RgMovCR(&cre,&mov)) CGB_DetCR(i,j,1,&mov); 
 				 	}
 			     	ProximoPago(0,&fp,cre.dp,2); ProximoPago(0,&fc,cre.un.tc.dc,3);
				 	MemMove(&(cre.fr),((Comp2Fec(&fp,&fc)==-1)?&fp:&fc),sizeof(Fecha));
				 	CGB_CR(i,1,&cre);
 				}
 			    break;
 		case 5: case 6:
 		case 7: // Determinar periodos transcurridos desde la última 
 				// fecha de revisión y actualizar intereses
 				tm=CntLCR(3,i,d); 
 				if (Pasada(&(cre.un.tx.per.f))) {
 					if (Comp2Fec(&(cre.fr),&(cre.un.tx.per.f))==-1) tc=1; else tc=0;
 					MemMove(&fc,&(cre.un.tx.per.f),sizeof(Fecha));
 					do { ProxFPPer(&fc,&(cre.un.tx.per),3);
 						 if (Pasada(&fc)) tc++; else break;
 					} while(1==1);
 					if (tc>0) for (j=0;j<tm;j++) {
 						CGB_DetCR(i,j,0,&mov);
 						switch(mov.tp) {
 						case 1:
 						case 2: v=mov.v+mov.un.mvt.in-mov.un.mvt.pg; p=1.0+cre.un.tx.por;
 								t=v; for (k=0;k<tc;k++) t*=p; t-=v; mov.un.mvt.in+=t; 
 								CGB_DetCR(i,j,1,&mov); break;
 						}
 					}
 				}
 				// Determinar si hay movimientos para insertar
 				MemMove(&fc,&(cre.un.tx.per.f),sizeof(Fecha));
 				while (cre.un.tx.pg<cre.un.tx.p) {
 					MemMove(&fp,&fc,sizeof(Fecha)); ProxFPPer(&fp,&(cre.un.tx.per),2);
 					if (cre.un.tx.pa) for (j=0;j<cre.un.tx.fa;j++) {
 					 	MemMove(&f,&(cre.un.tx.pga[j].fr),sizeof(Fecha)); 
 					 	do { SumarMeses(cre.un.tx.pga[j].rep,&f);
 					 		 MemMove(&g,&f,sizeof(Fecha)); ProxFPPer(&g,&(cre.un.tx.per),2);
 					 		 if (Comp2Fec(&g,&fp)!=1) AgQuMovTX(2,&id,&cre,&g,j);
 					 		 else break;
 					 	} while(1==1);
 					}
 					if (!Futura(&fp)) AgQuMovTX(1,&id,&cre,&g,0);
 					else break;
 					ProxFPPer(&fc,&(cre.un.tx.per),3);
 				}
 				// Actualizar fechas
 				MemMove(&(cre.un.tx.per.f),&fc,sizeof(Fecha)); FecHoy(&(cre.fr));
 				inf1=SacarApRM(); MemMove(inf1,&cre,sizeof(CRE)); CGB_ID(&id,4);
 				break;
 		}
 	}
}
