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

// Estructura de control de Bancos

typedef struct DBA {
	REGBA       r;          // Registro general de bancos
	MOVBA       m;          // Movimiento general de bancos
	UInt8 		*col;		// Colores
	Int8        OpE;        // Opcion de ejecucion 
	Boolean     cnva;       // Nueva cuenta de cheques, ...
	                        // Poner antes de llamar a FCuentaBA
	UInt8       CDI;        // Se trabaja con 0=Cheque 1=Debito 2=inversion
	Int16       ncs;        // Numero de cuenta seleccionado 
    ID          idcs;       // ID de cuenta de banco seleccionada
	Int16       nds;        // Numero del detalle seleccionado
	Int16       nms;        // Numero de movimiento seleccionado
	Boolean     mnvo;       // movimiento nuevo
	Boolean     cargo;      // Cargo o credito
	Boolean     Modfa,ModCh,ModMo;  // Modificados ?
	Boolean     NumErr;     // Error en dato numerico
	Boolean     mtcs;        // Movimiento tiene cuenta secundaria
	ID          idco;       // ID original de la cuenta-movimiento
    OCalc       oc;			// Para calculadora y teclado
	MOVGA       ga;			// Para cuenta de gastos
	MOVIN       mi;         // Para instituciones
	CRE         *cre;       // Para credito
	Boolean     ayu;		// Hay ayuda ?
	Boolean     gas;		// Hay gastos ?
	Boolean     ins;        // Hay instuciones ?
	Boolean     pen;        // Hay pendientes
	Boolean     ceb;        // Hay cuentas de credito, efectivo o bancos
	Boolean     cmb;        // Cambio
	Int16       yi1,yi2,yf1,yf2; // Para limites de fechas 
	Char        str[2][150];
} BA;

BA 			*ba,*ba1,*bax;
MemHandle 	mba1,mbax;
UInt8       PO[]={1,1,1,1,1,1,1,1,0,0,0,   // poner objecto
                  1,1,1,0,1,0,1,1,0,0,0,
                  1,1,1,0,1,0,0,1,1,2,3};
UInt8       IL[]={16,25,32};         // inicio de letreros         	
UInt8       NO[]={8,6,8};            // numero de objectos
UInt8       CF[]={6,7,8};            // color

Int16 CntLBA(NumX *)                                         ES7;
Boolean CGB_CBA(Int16, Int8, INF  *)                         ES7;
Boolean CGB_MBA(Int16,Int8, MOV  *)                          ES7;
Int16 CntMCBA(Int16)                                         ES7;
void PntLResBA(Int16, RectangleType *,char **, ListType *)   ES7;
void FormaResumenBA(Boolean)                                 ES7;
void FormaCuentaBA(Boolean)                                  ES7;
void PSCuentaBA (Boolean)                                    ES7;
void FormaListaMovBA(Boolean)                                ES7;
void PntMovBA(Int16,RectangleType *,char **,ListType *)      ES7;
void PntDatosBA(Int16,RectangleType *,char **,ListType *)    ES7;
void SacarLD(Boolean,Int16, Char * ,Char * )                 ES7;
void EncBA(void)                                             ES7;
void FormaDepositoBA(Boolean)                                ES7;
void PSDepositoBA (Boolean)                                  ES7;
void ActDepositoBA(void)                                     ES7;
void BorDepositoBA(Boolean)                                  ES7;
void FormaCarCreBA(Boolean)                                  ES7;
void PSCarCreBA (Boolean)                                    ES7;
void ActCarCreBA(void)                                       ES7;
void BorCarCreBA(Boolean)                                    ES7;
void FormaRetiroBA(Boolean)                                  ES7;
void PSRetiroBA (Boolean)                                    ES7;
void ActRetiroBA(void)                                       ES7;
void BorRetiroBA(Boolean)                                    ES7;
void InsSecBA(ID *,Int16,double,Fecha*,Int16,Char *,ID *)    ES7;
void BorSecBA(ID)                                            ES7;

//  ***************************************************************

//  *****  actualiza saldos

void   ActualizaSaldosBA() {
Int16    nr,nm,tm,tr;	
REGBA    *rb;
MOVBA    *mb;

         rb=SacarApRM();mb=SacarApMM();
         for(nr=0;nr<SacarTotReg();nr++) {
         	if(!LeerTipo(nr,&tr)) return;
         	if(tr!=7) continue;
            if(!LeerReg((void *)rb,nr)) return;
            if(!TotMov(nr,&tm)) return;         	
            for (nm=0;nm<tm;nm++) {
            	if(!LeerMov((void*)mb,nr,nm)) return;
            	if(mb->aplicado) continue;
            	if(Futura(&mb->fa)) continue;
            	mb->aplicado=true;
            	switch(mb->drcc) {
            		case 1: NumSRN(&rb->sa,1,&mb->v);  
            		        NumSRN(&rb->sp,2,&mb->v);  
            		        break;
            		case 2: NumSRN(&rb->sa,2,&mb->v);         
            		        break;
            		case 3: NumSRN(&rb->sa,2,&mb->v);         
            		        break;        
            		case 4: NumSRN(&rb->sa,1,&mb->v);         
            		        break;        
            	}
             	if(!ModMov((void*)mb,nr,nm)) return;
            }
            if(!ModReg((void *)rb,nr)) return;
         }
         return;
}

//  ***************************************************************

//  *****  manejo de Disco

//  Cantidad de registros de bancos

Int16 CntLBA(NumX *v) {
Int16    t=0,i,tr;
         for (i=0;i<6;i++) Pasa0aN(&v[i]); 
	     for(i=0;i<SacarTotReg();i++) {
	      	if(!LeerTipo(i,&tr)) return 0;
//                               Solo tipo registro bancos (7)	      	
	       	if(tr!=7) continue;
        	if(!LeerReg((void *)&(ba->r),i)) return 0;
        	if(ba->r.TipoReg!=7) return 0;
//                                Acumular pos subtipo (CDI)        	
        	if(ba->r.TipoCDI==1) {NumSRN(&v[0],1,&ba->r.sa);
        		                  NumSRN(&v[1],1,&ba->r.sp);}
        	if(ba->r.TipoCDI==2) {NumSRN(&v[2],1,&ba->r.sa);
        		                  NumSRN(&v[3],1,&ba->r.sp);}
        	if(ba->r.TipoCDI==3) {
        		NumSRN(&v[5],1,&ba->r.sa);
        		if(ba->r.Vista || EsteMes(&ba->r.fv)) NumSRN(&v[4],1,&ba->r.sa);
        	}
        	t++; 
	    }
        return t;
}

// Cantidad de movimientos de una cuenta

Int16   CntMCBA(Int16 it) {
UInt16  NReg;
Int16   t;		
        if(!SacarNReg (7,it,&NReg)) return 0;
        if (!TotMov (NReg,&t)) return 0;
        return t;
}	

// Cargar(0),guardar(1) y borrar(2) un movimiento de bancos

Boolean CGB_MBA(Int16 it, Int8 op, MOV  *ApM ) {
UInt16  NReg;	

    if(!SacarNReg (7,ba->ncs,&NReg)) return false;
	switch(op) {
      case 0: // Cargar
              if(!LeerMov(ApM,NReg,it)) return false;
  		      break;
	case 1: // Guardar
	         if(it==-1) {
                if(!InsMov(ApM,NReg)) return false;
	            break;
	         } else {
	            if(!ModMov(ApM,NReg,it)) return false;
	            break;
	         }
    case 2: // Borrar
            if(!BorMov(NReg,it,false)) return false;
        break;
	}
	return true;
}
// Cargar(0),guardar(1) y borrar(2) una cuenta de bancos

Boolean CGB_CBA(Int16 it, Int8 op, INF  *ApR ) {
UInt16  NReg;	
	switch(op) {
      case 0: // Cargar
              if(!SacarNReg (7,it,&NReg)) return false;
              if(!LeerReg(ApR,NReg)) return false;
		break;
	case 1: // Guardar
	         if(it==-1) {
    	        ApR->TReg=7;
                if(!InsReg(ApR)) return false;
	            break;
	         } else {
                if(!SacarNReg (7,it,&NReg)) return false;
	            if(!ModReg(ApR,NReg)) return false;
	            break;
	         }
    case 2: // Borrar
               if(!SacarNReg (7,it,&NReg)) return false;
               if(!BorReg(NReg,true)) return false;
        break;
	}
	return true;
}

//  ***************************************************************

//  *****  Resumen de bancos

//  Inicio y término de Bancos

void IniciaBA(UInt8 *col, Int8 OpE, ID  * ids) {
ID     idl;	
Int16  i,t,tr;

	if(OpE==1) {
		mba1=MemHandleNew(sizeof(BA));
	    ba1=(BA *)MemHandleLock(mba1);
	    ba=ba1;
	} else {
		mbax=MemHandleNew(sizeof(BA));
	    bax=(BA *)MemHandleLock(mbax);
	    ba=bax;
	}	
	ba->col=col;
	ba->OpE=OpE;
	ba->cnva=false;
	ba->mnvo=false;
	ba->mtcs=false;
 	ba->cmb=false;
 	ba->gas=false;
 	ba->ayu=false;
 	ba->ins=false;
 	ba->ceb=false;
 	ba->pen=false;
    switch (OpE){                 // Caso resumen de bancos
    	case 1: FrmPopupForm(FResumenBA);
    	        break;
        case 2:                   // Agregar una nueva desde cuentas
        case 3:
        case 4: ba->cnva=true;
                ba->CDI=OpE-2;
                FrmPopupForm(FCuentaBA);
                break;
        case 5: t=-1;              // Ver informacion desde cuentas
                for(i=0;i<SacarTotReg();i++) {
	      	        if(!LeerTipo(i,&tr)) break;
	       	        if(tr!=7) continue;
	       	        t++;
	       	        SacarID(&idl);
	       	        if(idl.r!=ids->r) continue;
		            ba->ncs=t;
                  	if(!LeerReg((void *)&(ba->r),i)) break;
                    SacarID (&ba->idcs);
                    ba->CDI=ba->r.TipoCDI-1;
                    FrmPopupForm(FDatosBA);
                    return;
                }
            	 FrmUpdateForm(FSelecCuenta,60);
              	 FinalizaBA(false);
    		     FrmReturnToForm(0);
    		     break;
    }
    return;
}
Boolean FinalizaBA(Boolean home) {
BA     *baf;	
Boolean cmb;
    if(home) baf = ba1; else baf = bax;
	if (baf->ayu) FinAyuda(); if (baf->gas) FinalizaGA(); 
	if (baf->ins) FinalizaIN(); if(baf->ceb) FinalizaCuentas();
	if (baf->pen) FinalizaPendientes();
	cmb=baf->cmb; 
	if(home) {
		MemHandleUnlock(mba1); 
		MemHandleFree(mba1);
	} else {
		MemHandleUnlock(mbax); 
		MemHandleFree(mbax);
		ba=ba1;
	}
	return cmb;
}

//  Forma de resumen bancos

void FormaResumenBA(Boolean inicio) {
Int16 		x,y,w,h;
Char  		s[50];
FormType 	*f;
NumX        v[6];
Int8        aa;

         x=1; y=16; w=158; h=FntCharHeight(); f=FrmGetActiveForm(); 
   	     if(inicio)FrmDrawForm(f);
   	     EliminaMarco(f,110,(ListDrawDataFuncPtr)(PntLResBA),CntLBA(v),inicio,-1);
   	     
         PintaB(255,x,y,w,8+(h*3),6,9,1,2,true,ba->col);
	     x+=4; y+=4;
	     
   	     PasaNaA(&v[0],true,false,s); PonTexto(s,x+150,y,N,D,0,false,-1,ba->col[6],&aa);
  	     PasaNaA(&v[1],true,false,s); PonTexto(s,x+90,y,N,D,0,false,-1,ba->col[6],&aa);
         SacaTexto(s,2600,0,50); PonTexto(s,x,y,B,I,90-aa,false,-1,ba->col[6],&aa);  	     
   	     y+=h+1;
	     
  	     PasaNaA(&v[2],true,false,s); PonTexto(s,x+150,y,N,D,0,false,-1,ba->col[6],&aa);
  	     PasaNaA(&v[3],true,false,s); PonTexto(s,x+90,y,N,D,0,false,-1,ba->col[6],&aa);
         SacaTexto(s,2600,1,50); PonTexto(s,x,y,B,I,90-aa,false,-1,ba->col[6],&aa);  	     
   	     y+=h+1;  	     

	     PasaNaA(&v[4],true,false,s); PonTexto(s,x+150,y,N,D,0,false,-1,ba->col[6],&aa);
  	     PasaNaA(&v[5],true,false,s); PonTexto(s,x+90,y,N,D,0,false,-1,ba->col[6],&aa);
  	     SacaTexto(s,2600,2,50); PonTexto(s,x,y,B,I,90-aa,false,-1,ba->col[6],&aa); 
  	     return;
}

//  Control de resumen bancos

Boolean ResumenBA(EventType* pEvent) {
Int16 v;
	switch (pEvent->eType) {
		case frmUpdateEvent:  // Actualizar desde otra ventana      
		     switch(pEvent->data.frmUpdate.updateCode) {
			      case 90: ba->ayu=false; break;
			      case 99: break;
			      default: return false;
	         }
    		 FormaResumenBA(false);
		     return true;
		
		case frmOpenEvent:  // Inicio
		    FormaResumenBA(true);
			return true;
			
		case ctlSelectEvent: // Botones
		    switch(pEvent->data.ctlSelect.controlID) {
		   	    case BAce: if (FinalizaBA(true)) FrmUpdateForm(FPrincipal,99);
					       else FrmUpdateForm(FPrincipal,98);
					       FrmReturnToForm(0);
		   	 		       return true;
		   	    case BAyu: ba->ayu=Ayuda(2600,1,ba->col,FResumenBA); return true;
		   	    case BNue: v=LstPopupList((ListType*)GetObjPtr(FrmGetActiveForm(),100));
                		   if (v==noListSelection) return true;
                		   ba->cnva=true;
                		   ba->CDI=v;
    	   			       FrmPopupForm(FCuentaBA);
    	   			       return true;
		        }
		    break;
		    
        case lstSelectEvent: // Seleccion del cuenta
		    v=pEvent->data.lstSelect.selection;
		    if (v==noListSelection) break;
		    ba->ncs=v;
            CGB_CBA(ba->ncs,0,(void*)&(ba->r));
            SacarID (&ba->idcs);
            ba->CDI=ba->r.TipoCDI-1;
            FrmPopupForm(FListaMovBA);            
            return true;
		default: break;
	}
	return false;
}

//   Pintar lista resumen bancos

void PntLResBA(Int16 it, RectangleType *r,char **u, ListType *p) {
Int8 a,aa;
Char T[50];	
	CGB_CBA(it,0,(void*)(&ba->r));
	SacaTexto(T,2600,3+ba->r.TipoCDI,50);
    PonTexto (T,r->topLeft.x,r->topLeft.y,N,I,0,false,-1,-1,&a);
	switch (ba->r.TipoCDI) {
		  case 1:
	      case 2: PasaNaA(&ba->r.sp,true,false,T); 
                  PonTexto(T,r->topLeft.x+98,r->topLeft.y,N,D,0,false,-1,ba->col[2],&a);
                  PonTexto (ba->r.NumCta,r->topLeft.x+16,r->topLeft.y,N,I,82-a,false,-1,-1,&a);
                  PasaNaA(&ba->r.sa,true,false,T); 
                  PonTexto(T,r->topLeft.x+148,r->topLeft.y,N,D,0,false,-1,ba->col[2],&a);
	              break;
	      case 3: PasaNaA(&ba->r.sa,true,false,T); 
                  PonTexto(T,r->topLeft.x+98,r->topLeft.y,N,D,0,false,-1,ba->col[2],&aa);
                  if(ba->r.Vista || EsteMes(&ba->r.fv))
                     PonTexto(T,r->topLeft.x+148,r->topLeft.y,N,D,0,false,-1,ba->col[2],&a);
	              if(HayInf(ba->r.NumCta,sizeof(ba->r.NumCta))) 
   	                 PonTexto (ba->r.NumCta,r->topLeft.x+16,r->topLeft.y,N,I,82-aa,false,-1,-1,&a);
   	                 else
   	                 PonTexto (ba->r.Prod,r->topLeft.x+16,r->topLeft.y,N,I,82-aa,false,-1,-1,&a);
	              break;
	}
	return;
}

//  ***************************************************************

//  *****  Editar o nueva cuenta de cheques, debito o inversion

//  Forma de cuenta de cheques, debito o inversion

void FormaCuentaBA(Boolean inicio) {
FormType 	*f;
Char        T[50];	
Int16       i,j,k,y,h,xx,yy;	
Int8        af;

          j=ba->CDI*11;
          f=FrmGetActiveForm();    //  Poner titulo
          if(inicio) {
          	i=8+(ba->CDI)*2;
          	if(!ba->cnva) i++; 
            SacaTexto(T,2600,i,50); 
            FrmCopyTitle(f,T);
            FrmDrawForm(f); 
          }
          
          for (i=0;i<11;i++) {  // Ocultar objetos
          	FrmHideObject(f,FrmGetObjectIndex(f,i+100));
            if(i<9) FrmHideObject(f,FrmGetObjectIndex(f,i+200));
          }
          FrmHideObject(f,FrmGetObjectIndex(f,220));  
          
          h=FntCharHeight()+3; y=19; // Poner recuadros
          PintaB(255,1,y,158,(h*NO[ba->CDI])+10,CF[ba->CDI],0,0,9,true,ba->col); 
          PintaB(255,6,y+4,52,(h*NO[ba->CDI])+4,CF[ba->CDI],0,0,0,false,ba->col);
          PintaB(255,58,y+4,98,(h*NO[ba->CDI])+4,2,1,CF[ba->CDI],1,true,ba->col); 

           
          if(inicio) {  // Posiciones 
          	y=26;
            for (i=0;i<11;i++) {
          	  if(PO[i+j]!=0)FrmSetObjectPosition(f,FrmGetObjectIndex(f,i+100),7,y);
          	  if(PO[i+j]==1)FrmSetObjectPosition(f,FrmGetObjectIndex(f,i+200),62,y);          	
          	  if(PO[i+j]==2){ba->yi1=y;ba->yf1=y+h;}
          	  if(PO[i+j]==3){ba->yi2=y;ba->yf2=y+h;}          	  
          	  if(PO[i+j]!=0)y+=h;
            }
            FrmGetObjectPosition(f,FrmGetObjectIndex(f,200),&xx,&yy);	
            FrmSetObjectPosition(f,FrmGetObjectIndex(f,220),xx+8,yy);	          
	
	        k=IL[ba->CDI];       // Poner letreros 
            for (i=0;i<11;i++) {   
              if(PO[i+j]==0)continue;	
          	  SacaTexto(T,2600,k,50); 
              FrmCopyLabel(f,i+100,T);
              k++; 
            }

            if(ba->cnva) { // Iniciar campos o leerlos
               ba->r.DInst=false;
               StrCopy(ba->r.NumCta," ");
               StrCopy(ba->r.Clabe," ");
               StrCopy(ba->r.Titular," ");               
               StrCopy(ba->r.Prod," ");
               StrCopy(ba->r.NumTD," ");
               StrCopy(ba->r.Pin," ");               
               Pasa0aN(&ba->r.sa); 
               Pasa0aN(&ba->r.sp);                
               ba->r.Vista=true;
               FecHoy (&ba->r.fi);
               FecHoy (&ba->r.fv);               
               SumarDias(28,&ba->r.fv);
               Pasa0aN(&ba->r.UNumCh);
            } else {
               CGB_CBA(ba->ncs,0,(void*)&(ba->r));
          	   if(ba->r.Vista) {
                 FecHoy (&ba->r.fi);
                 FecHoy (&ba->r.fv);     
                 SumarDias(28,&ba->r.fv);                         
          	     }
             }
             ba->ModMo=false;                             
          }

          if (!ba->r.DInst)   // Pasar valores 
       	       Lista(GetObjPtr(f,200),GetObjPtr(f,220),0,true,0,NULL);
          else { LeerConID(&(ba->r.Inst_ID),&(ba->mi),false);
                 CtlSetLabel(GetObjPtr(f,200),ba->mi.Nom); }
          PSCuentaBA(true);      
           
          WinSetBackColor(ba->col[CF[ba->CDI]]); // Desplegar          
          for (i=0;i<11;i++) if(PO[i+j]!=0) FrmShowObject(f,FrmGetObjectIndex(f,i+100));
          WinSetBackColor(ba->col[2]);
          for (i=0;i<11;i++) if(PO[i+j]==1) FrmShowObject(f,FrmGetObjectIndex(f,i+200));
          FrmShowObject(f,FrmGetObjectIndex(f,220));   
          
          if(ba->CDI==2 && !ba->r.Vista) {  // Fechas
              PonFecCamp(62,ba->yi1,&ba->r.fi,-1,-1,false,&af);
              PonFecCamp(62,ba->yi2,&ba->r.fv,-1,-1,false,&af);          
          }
          
          return;
}

//  Sacar y poner informacion de la forma

void  PSCuentaBA(Boolean poner) {
FormType 	*f;	
Char      T[50];	

          f=FrmGetActiveForm();
          Texto(ba->r.NumCta,GetObjPtr(f,201),poner);
          Texto(ba->r.Titular,GetObjPtr(f,202),poner);
          Texto(ba->r.Clabe,GetObjPtr(f,203),poner);
          Texto(ba->r.Prod,GetObjPtr(f,204),poner);
          Texto(ba->r.NumTD,GetObjPtr(f,205),poner);
          Texto(ba->r.Pin,GetObjPtr(f,206),poner);
          if(poner){
            PasaNaA(&ba->r.sa,true,true,T); 
            Texto(T,GetObjPtr(f,207),true);           
            CtlSetValue(GetObjPtr(f,208),((ba->r.Vista)?1:0));
          } else {
          	 Texto(T,GetObjPtr(f,207),false);
          	 ba->NumErr=PasaAaN(T,true,false,&ba->r.sa);
          }
          return;
}

//  Control de cuentas de cheques

Boolean CuentaBA(EventType* pEvent) {
Int16 v;
FormType 	*f;
Char        t[50];
Boolean     hi;
    f=FrmGetActiveForm();
	switch (pEvent->eType) {
		case frmUpdateEvent:   // Actualizar desde otra ventana     
			switch(pEvent->data.frmUpdate.updateCode) {
			  case 70: break;	
			  case 80: ba->ins=false; ba->r.DInst=true; break;
              case 81: ba->ins=false; break;        	         
			  case 90: ba->ayu=false; break;
			  case 99: break;
			  default: return false;
			}
    	    FormaCuentaBA(false);
			return true;
			
		case frmOpenEvent:     // Inicio
		    FormaCuentaBA(true);
			PonBotonCT(&(ba->oc),0,0,NULL,NULL,f,0,2600,0);    
			return true;
			
        case fldEnterEvent:    // Campos
            switch(pEvent->data.fldEnter.fieldID) {
   		    case  201: PonBotonCT(&(ba->oc),2,201,NULL,ba->r.NumCta,f,sizeof(ba->r.NumCta),2600,44+ba->CDI); return false;
   		    case  202: PonBotonCT(&(ba->oc),2,202,NULL,ba->r.Titular,f,sizeof(ba->r.Titular),2600,47+ba->CDI); return false;   		    
   		    case  203: PonBotonCT(&(ba->oc),2,203,NULL,ba->r.Clabe,f,sizeof(ba->r.Clabe),2600,50+ba->CDI); return false;   		       		    
   		    case  204: PonBotonCT(&(ba->oc),2,204,NULL,ba->r.Prod,f,sizeof(ba->r.Prod),2600,53+ba->CDI); return false;   		       		    
   		    case  205: PonBotonCT(&(ba->oc),2,205,NULL,ba->r.NumTD,f,sizeof(ba->r.NumTD),2600,56+ba->CDI); return false;   		       		    
   		    case  206: PonBotonCT(&(ba->oc),2,206,NULL,ba->r.Pin,f,sizeof(ba->r.Pin),2600,59+ba->CDI); return false;   		       		    
   		    case  207: PonBotonCTN(&(ba->oc),1,207,&ba->r.sa,NULL,f,0,2600,62+ba->CDI); ba->ModMo=true;return false;   		       		    
           	default  : PonBotonCT(&(ba->oc),0,0,NULL,NULL,f,0,2600,0); return false;
            }
            break;
            
       case ctlEnterEvent:   //  Seleccion
            switch(pEvent->data.ctlEnter.controlID) {
            case  200: v=Lista(GetObjPtr(f,200),GetObjPtr(f,220),0,false,0,NULL);
        	           switch(v) {
        	           	case 0: ba->r.DInst=false; break;
        	           	case 1: PSCuentaBA(false);
        	           	        ba->ins=true;
        	           	        IniciaInst(2,FCuentaBA,&ba->r.Inst_ID,ba->r.DInst,ba->col);
        	           	        break;
        	           	case 2: FrmUpdateForm(FCuentaBA,99);
        	           	        break;
        	           }
        	           return true;
            }
			break;
			
		case penDownEvent:
		    if (ba->CDI!=2) return false;
		    if (ba->r.Vista) return false;
		    if (!(pEvent->screenX>62 && pEvent->screenX < 140)) return false;
            if (pEvent->screenY > ba->yi1 && pEvent->screenY < ba->yf1) {
            	PSCuentaBA(false);
   	          	SacaTexto(t,2600,70,50); 
		        SelFecha(t,&(ba->r.fi),false);
		        FrmUpdateForm(FCuentaBA,99);
                return true;   
            }
            if (pEvent->screenY > ba->yi2 && pEvent->screenY < ba->yf2) {
            	PSCuentaBA(false);
   	          	SacaTexto(t,2600,73,50); 
		        SelFecha(t,&(ba->r.fv),false);
		        FrmUpdateForm(FCuentaBA,99);
                return true;   
            }
            return false;
			
			
		case ctlSelectEvent: // Botones
		    switch(pEvent->data.ctlSelect.controlID) {
		    case 208:   PSCuentaBA(false);
		                if(CtlGetValue(GetObjPtr(f,208))==0) 
		                    ba->r.Vista=false; else ba->r.Vista=true; 	
                        FrmUpdateForm(FCuentaBA,99);		                    
                        return true;
		    	
            case BAyu: PSCuentaBA(false);
                       ba->ayu=Ayuda(2602+ba->CDI*2,1,ba->col,FCuentaBA); 
                       return true;
		    case BCal: PSCuentaBA(false);
		               OpBotonCT(&(ba->oc)); 
		               return true;		    	
		   	case BAce: ba->r.TipoCDI=ba->CDI+1;
		   	           PSCuentaBA(false);
		   	           if(!ba->NumErr) return false;
		   	           if(ba->CDI==2) hi=(HayInf(ba->r.NumCta,sizeof(ba->r.NumCta))|| HayInf(ba->r.Prod,sizeof(ba->r.Prod)));
		   	           else hi=HayInf(ba->r.NumCta,sizeof(ba->r.NumCta));
                       if(!hi){
		   	           	 if(ba->CDI==2) FrmAlert(2604); 
		   	           	 else FrmAlert(2603); 
 	   	           	     return false;
		   	           }	
   		   	           if(!ba->cnva) {
   		   	           	 if(ba->ModMo && CntMCBA(ba->ncs)>0){
   		   	           	 	 FrmAlert(2602);
   		   	           	 	 return false;
   		   	           	 }
   		   	           }
                       if(ba->cnva)CGB_CBA(-1,1,(void*)&(ba->r));
                       else CGB_CBA(ba->ncs,1,(void*)&(ba->r));
                       if(ba->OpE==1 || ba->OpE==5) {
                       	 if(ba->cnva) FrmUpdateForm(FResumenBA,99);
	   				     else FrmUpdateForm(FDatosBA,99);
                       } else {
                       	 FrmUpdateForm(FSelecCuenta,60);
                       	 FinalizaBA(false);
                       }
	   				   FrmReturnToForm(0); 
	   				   ba->cmb=true;
		   	           return true;
		   	case BCan: if(ba->OpE==1 || ba->OpE==5 ) {
		   		         if(ba->cnva) FrmUpdateForm(FResumenBA,98);
		   	             else { // Restaura valores por si se cambiaron
		   	           	      CGB_CBA(ba->ncs,0,(void*)&(ba->r));
		   	           	      FrmUpdateForm(FDatosBA,99);}
		   	           } else {
                       	 FrmUpdateForm(FSelecCuenta,60);
                       	 FinalizaBA(false);
                       }
		   	           FrmReturnToForm(0); 
		   	           return true;
		    }
        default: break;
	}
	return false;
}

//  ***************************************************************

//  *****  Listar movimientos de una cuenta

//  Forma la lista

void FormaListaMovBA(Boolean inicio) {
FormType 	*f;
Char        T[50];

         f=FrmGetActiveForm(); 
         SacaTexto(T,2600,ba->CDI+77,50); 
         FrmCopyTitle(f,T);
   	     if(inicio)FrmDrawForm(f);
         EncBA();   	     
         EliminaMarco(f,110,(ListDrawDataFuncPtr)(PntMovBA),CntMCBA(ba->ncs),inicio,-1);
         if (!HayPendientes())  FrmHideObject(f,FrmGetObjectIndex(f,BPen)); 
  	     return;
}

//    Poner el encabezado para listar movimientos, detalle, ...

void EncBA() {
Int16 	 nc,x,y,w,h;
Int8     aa;
Char     T[50];

         x=1; y=16; w=158; // numero de cuenta y banco
         h=FntCharHeight(); 
  	     nc=CF[ba->CDI];
         PintaB(255,x,y,w,8+(h*2),nc,9,1,2,true,ba->col);
	     x+=4; y+=4;
	     if(ba->CDI==2 && !HayInf(ba->r.NumCta,sizeof(ba->r.NumCta))) 
	     PonTexto(ba->r.Prod,x,y,B,I,0,false,-1,ba->col[nc],&aa);
         else PonTexto(ba->r.NumCta,x,y,B,I,0,false,-1,ba->col[nc],&aa);
   	     if(ba->r.DInst) {
   	     	LeerConID(&(ba->r.Inst_ID),&(ba->mi),false);
            PonTexto(ba->mi.Nom,w,y,B,D,w-aa-x,false,-1,ba->col[nc],&aa);
   	     }
   	     
   	     y+=h+1;      // Saldo por aplicar y saldo actual
   	     if(ba->CDI==2) {
   	     	PasaNaA(&ba->r.sa,false,true,T); 
            if(ba->r.Vista || EsteMes(&ba->r.fv))
   	            PonTexto(T,w,y,N,D,0,false,-1,ba->col[nc],&aa);  	     
   	        else
    	        PonTexto(T,w/2,y,N,D,0,false,-1,ba->col[nc],&aa);
   	     }else {
  	        PasaNaA(&ba->r.sp,false,true,T); 
  	        PonTexto(T,w/2-10,y,N,D,0,false,-1,ba->col[nc],&aa);
   	        SacaTexto(T,2600,144,50); 
   	        PonTexto(T,x,y,N,I,w/2-10-x-aa,false,-1,ba->col[nc],&aa);
  	        PasaNaA(&ba->r.sa,false,true,T); 
  	        PonTexto(T,w,y,N,D,0,false,-1,ba->col[nc],&aa);
  	        SacaTexto(T,2600,145,50); 
   	        PonTexto(T,w/2,y,N,I,w/2-aa,false,-1,ba->col[nc],&aa);  	     
   	     }
  	     return;
}

//    Texto a desplegar (Se llama por PintaListaCuentas)

void TextoLinBA (REGBA *rb,Int16 x,Int16 y,Int16 w) {
MOVIN   ri;
Char    t[50];
Int8    aa;
//                                Poner tipo de cuenta
        SacaTexto(t,2600,rb->TipoCDI+3,50); 
        PonTexto(t,x,y,B,I,0,false,-1,-1,&aa);
//                                Poner nombre        
        if(rb->TipoCDI==3 && !HayInf(rb->NumCta,sizeof(rb->NumCta))) 
	     PonTexto(rb->Prod,x+16,y,B,I,0,false,-1,-1,&aa);
         else PonTexto(rb->NumCta,x+16,y,B,I,0,false,-1,-1,&aa);
//                                Poner institucion         
        if(rb->DInst) {
   	     	LeerConID(&(rb->Inst_ID),&ri,false);
            PonTexto(ri.Nom,w,y,B,D,w-(x+16+aa),false,-1,-1,&aa);
        }
        return;
}
//    Texto a desplegar (Se llama por PonValorCuenta)

void TextoCtlBA (REGBA *rb,Char * s) {
//                                Poner tipo de cuenta
        SacaTexto(s,2600,rb->TipoCDI+3,50); 
        StrCat(s," ");
//                                Poner nombre        
        if(rb->TipoCDI==3 && !HayInf(rb->NumCta,sizeof(rb->NumCta))) 
        StrCat(s,rb->Prod); else StrCat(s,rb->NumCta); 
        return;
}

//  Pintar movimientos de cuentas

void PntMovBA(Int16 it, RectangleType *r,char **u, ListType *p) {
Char   t[50];	
Int8   a;
NumX   NV;
	CGB_MBA(it,0,(void*)&ba->m);
	ForFec(t,1,&ba->m.fm);
    PonTexto (t,r->topLeft.x,r->topLeft.y,N,I,0,false,-1,-1,&a);
    switch (ba->m.drcc) {
    	case 1:
    	case 3: PasaNaA(&ba->m.v,true,true,t); 
    	        PonTexto(t,r->topLeft.x+148,r->topLeft.y,N,D,0,false,-1,-1,&a);
    	        break;
    	case 2:
    	case 4: PasaNaNS(&ba->m.v,&NV);PasaNaA(&NV,true,true,t); 
    	        PonTexto(t,r->topLeft.x+148,r->topLeft.y,N,D,0,false,ba->col[5],-1,&a);
    	        break;
    }
    switch (ba->m.drcc) {
	     case 1:SacaTexto(t,2600,131+ba->m.forma,50);break; 
	     case 2:SacaTexto(t,2600,135+ba->m.forma,50);break; 	     
	     case 3:SacaTexto(t,2600,140,50);break; 	     
	     case 4:SacaTexto(t,2600,141,50);break; 	     	     
    }
    PonTexto (t,r->topLeft.x+30,r->topLeft.y,N,I,118-a,false,-1,-1,&a);
    return;
}


//  Control de movimientos de cuentas

Boolean ListaMovBA(EventType* pEvent) {
FormType 	*f;
Int16        v;
    f=FrmGetActiveForm();
	switch (pEvent->eType) {
		case frmUpdateEvent:   // Actualizar desde otra ventana     
			switch(pEvent->data.frmUpdate.updateCode) {
			  case 60: ba->pen=false; break;				
			  case 90: ba->ayu=false; break;
   	          case 98: FrmUpdateForm(FResumenBA,99);
	   				   FrmReturnToForm(0); 
		   	           return true;
			  case 99: break;
			  default: return false;
			}
    	    FormaListaMovBA(false);
			return true;
			
		case frmOpenEvent:     // Inicio
		    FormaListaMovBA(true);
		    return true;
		    
        case lstSelectEvent: // Seleccion de movimiento
		    v=pEvent->data.lstSelect.selection;
		    if (v==noListSelection) break;
		    ba->nms=v;
            CGB_MBA(ba->nms,0,(void*)&(ba->m));
            ba->mnvo=false;
            ba->mtcs=ba->m.dceb;
            MemMove(&ba->idco,&ba->m.idceb,sizeof(ID));
            switch (ba->m.drcc) {
            	case 1: FrmPopupForm(FDepositoBA);            
                        return true;
            	case 2: FrmPopupForm(FRetiroBA);            
                        return true;
            	case 3: ba->cargo=true;
                        FrmPopupForm(FCarCreBA);            
                        return true;
            	case 4: ba->cargo=false;
                        FrmPopupForm(FCarCreBA);            
                        return true;
            }
            return false;
            
		case ctlSelectEvent: // Botones
		    switch(pEvent->data.ctlSelect.controlID) {
            case BAyu: ba->ayu=Ayuda(2608+ba->CDI*2,1,ba->col,FListaMovBA); 
                       return true;
		   	case BAce: FrmUpdateForm(FResumenBA,99);
	   				   FrmReturnToForm(0); 
		   	           return true;
     	    case BNue: v=LstPopupList((ListType*)GetObjPtr(FrmGetActiveForm(),120));
               		   if (v==noListSelection) return true;
               		   ba->mnvo=true;
               		   ba->mtcs=false;
               		   switch(v) {
               		   	case 0:FrmPopupForm(FRetiroBA);
	   	   	   			       return true;
               		   	case 1:FrmPopupForm(FDepositoBA);
	   	   	   			       return true;
                        case 2:ba->cargo=true;
                               FrmPopupForm(FCarCreBA);
                               return true;
                        case 3:ba->cargo=false;
                               FrmPopupForm(FCarCreBA);
                               return true;
               		   }
   	   			       return false;
		   	case BDat: FrmPopupForm(FDatosBA);
		   	           return true;
		   	case BPen: ba->pen=Pendientes(f,&ba->idcs,ba->col); 
		   	           return true;		   	           
		    }
        default: break;
	}
	return false;
}

//  ***************************************************************

//  *****  Datos de una cuenta

//   Forma datos de un cuenta

void FormaDatosBA(Boolean inicio) {
FormType *f;
Char     T[50];

         f=FrmGetActiveForm(); 
         SacaTexto(T,2600,ba->CDI+80,50); 
         FrmCopyTitle(f,T);
   	     if(inicio)FrmDrawForm(f);
         EncBA();   	        	     
         EliminaMarco(f,110,(ListDrawDataFuncPtr)(PntDatosBA),NO[ba->CDI],inicio,-1);
         if(ba->OpE==5) FrmHideObject(f,FrmGetObjectIndex(f,BBor));   
  	     return;
}

//  Pintar datos de cuentas

void PntDatosBA(Int16 it, RectangleType *r,char **u, ListType *p) {
Char     Tl[50],Td[50];
Int8     a;

     SacarLD(false,it,Tl,Td);	
     PonTexto (Tl,r->topLeft.x+7,r->topLeft.y,N,I,0,false,-1,-1,&a);     
     PonTexto (Td,r->topLeft.x+62,r->topLeft.y,N,I,0,false,ba->col[1],-1,&a);     
     return;
}

//   Sacar letrero y dato de cada renglon de cuenta

void SacarLD(Boolean ext, Int16 it, Char * Tl, Char * Td) {
Int16     i,j,k;
Char      ts[4],tn[4];

          SacaTexto(ts,2600,83,4);  // Definir SI-NO
          SacaTexto(tn,2600,84,4); 
          
          j=ba->CDI*11;             // Sacar posicion en forma
          k=it+1;
          for (i=0;i<11;i++) {
          	if(PO[i+j]!=0) k--;
          	if(k==0) break;          	
          }
          
      	  if(ext) SacaTexto(Tl,2600,41+ba->CDI+i*3,50); // Letrero
      	  else SacaTexto(Tl,2600,IL[ba->CDI]+it,50);  
          
          
    	  switch(i) {     // Datos
    	  	case 0:if(ba->r.DInst){LeerConID(&(ba->r.Inst_ID),&(ba->mi),false);
    	  		   StrCopy(Td,ba->mi.Nom);break;}  
    	  		   else	{SacaTexto(Td,2600,85,50);break;}
    	  	case 1:StrCopy(Td,ba->r.NumCta);break;
     	  	case 2:StrCopy(Td,ba->r.Titular);break;
    	  	case 3:StrCopy(Td,ba->r.Clabe);break;     	  	
     	  	case 4:StrCopy(Td,ba->r.Prod);break;
    	  	case 5:StrCopy(Td,ba->r.NumTD);break;
    	  	case 6:StrCopy(Td,ba->r.Pin);break;
     	  	case 7:PasaNaA(&ba->r.sa,true,true,Td);break; 
     	  	case 8:if(ba->r.Vista) StrCopy(Td,ts);
     	  	       else StrCopy(Td,tn); break;
    	  	case 9:if(!ba->r.Vista)ForFec(Td,5,&ba->r.fi); else StrCopy(Td," ");break;
    	  	case 10:if(!ba->r.Vista)ForFec(Td,5,&ba->r.fv); else StrCopy(Td," ");break;
    	  }
    	  return;
}


//  Control de datos de cuentas

Boolean DatosBA(EventType* pEvent) {
FormType 	*f;
Int16       v;
    f=FrmGetActiveForm();
	switch (pEvent->eType) {
		case frmUpdateEvent:   // Actualizar desde otra ventana     
			switch(pEvent->data.frmUpdate.updateCode) {
			  case 90: ba->ayu=false; break;
			  case 99: break;
			  default: return false;
			}
    	    FormaDatosBA(false);
			return true;
			
		case frmOpenEvent:     // Inicio
		    FormaDatosBA(true);
            
		case ctlSelectEvent: // Botones
		    switch(pEvent->data.ctlSelect.controlID) {
            case BAyu: ba->ayu=Ayuda(2614,1,ba->col,FDatosBA); 
                       return true;
		   	case BAce: if(ba->OpE==1) {
		   		         FrmUpdateForm(FListaMovBA,99);
	   				     FrmReturnToForm(0); 
		   	           } else {
		   	           	 FrmUpdateForm(FSelecCuenta,60);
              	         FinalizaBA(false);
    		             FrmReturnToForm(0);
		   	           }
		   	           return true;
            case BEdi: ba->cnva=false;
                       FrmPopupForm(FCuentaBA);		   	           
                       return true;
            case BBor: if(CntMCBA(ba->ncs)==0) {
                          if(FrmAlert(104)==0) return true;
                          CGB_CBA(ba->ncs,2,(void*)&(ba->r));
                       } else {
                         if(FrmAlert(2605)==0)return true;
                         ba->r.TipoReg+=10;
                         CGB_CBA(ba->ncs,1,(void*)&(ba->r));
                       }
                       FrmUpdateForm(FListaMovBA,98);
	   				   FrmReturnToForm(0); 
		   	           return true;
		    }
		    break;
        case lstSelectEvent: // Seleccion del renglon
		    v=pEvent->data.lstSelect.selection;
		    if (v==noListSelection) break;
		    ba->nds=v;
            FrmPopupForm(FDetalleBA);            
            return true;
        default: break;

	}
	return false;
}

//   Control de detalles de cuentas

Boolean DetalleBA(EventType* pEvent) {
Char      Tl[50],Td[50];
Int8      a;
FormType  *f;
Int16     y;
    f=FrmGetActiveForm();
	switch (pEvent->eType) {
		case frmUpdateEvent:   // Actualizar desde otra ventana     
			switch(pEvent->data.frmUpdate.updateCode) {
			  default: return false;
			}
			return true;
		case frmOpenEvent:     // Inicio
		     FrmDrawForm(f);
             SacarLD(true,ba->nds,Tl,Td);	
             y=16;
             y+=PonTexto (Tl,80,y,N,C,0,false,-1,-1,&a);     
             PonTexto (Td,80,y,N,C,0,false,-1,-1,&a);     
             return true;
            
		case ctlSelectEvent: // Botones
		    switch(pEvent->data.ctlSelect.controlID) {
		   	case BAce: FrmUpdateForm(FListaMovBA,99);
	   				   FrmReturnToForm(0); 
		   	           return true;
		    }
		default: break;    
	}
	return false;
}

//  ************************************************************

//  *****  Deposito en una cuenta

//   Forma Deposito en un cuenta

void FormaDepositoBA(Boolean inicio) {
FormType *f;
Char     T[50];
Int8     af;
Int16    xx,h;

         h=FntCharHeight()+3;
         f=FrmGetActiveForm(); 
   	     if(inicio) {
         	 ba->Modfa=false;
             SacaTexto(T,2600,((ba->mnvo)?87:90)+ba->CDI,50); 
             FrmCopyTitle(f,T);
   	     	 FrmDrawForm(f);
             if(ba->mnvo){
               ba->m.drcc=1;
         	   Pasa0aN(&ba->m.v);
         	   FecHoy(&ba->m.fm);
         	   StrCopy(ba->m.d," " );
         	   ba->m.forma=0;
         	   FecHoy(&ba->m.fa);
         	   PasarFDL (4,2,&ba->m.fa);         	   
         	   ba->m.dgi=false;
         	   ba->m.dceb=false;
            } else {
            	CGB_MBA(ba->nms,0,(void*)&ba->m);
                FrmShowObject(f,FrmGetObjectIndex(f,BBor));
            }
            FrmGetObjectPosition(f,FrmGetObjectIndex(f,100),&xx,&ba->yi1);	
            ba->yf1=ba->yi1+h;
            FrmGetObjectPosition(f,FrmGetObjectIndex(f,103),&xx,&ba->yi2);	
            ba->yf2=ba->yi2+h;
   	     }

         EncBA();   	    // Encabezado inicial
       	 
       	 if (!( ba->m.dgi || ba->m.dceb ) )   // Poner cuenta de ingreso 
       	       Lista(GetObjPtr(FrmGetActiveForm(),200),GetObjPtr(FrmGetActiveForm(),201),0,true,0,NULL);
         if (ba->m.dgi) { LeerConID(&(ba->m.idgi),&(ba->ga),false);
                 CtlSetLabel(GetObjPtr(FrmGetActiveForm(),200),ba->ga.Nom); }
         if (ba->m.dceb) PonValorCuenta(f,200,&ba->m.idceb,true,ba->str[0]);                      
         
         if(ba->mnvo && !ba->Modfa) {
            ba->m.fa=ba->m.fm;
            if(ba->m.forma==0)PasarFDL (4,2,&ba->m.fa);        	   
         }
                 
                  // Poner forma del deposito 
       	 Lista(GetObjPtr(FrmGetActiveForm(),202),GetObjPtr(FrmGetActiveForm(),203),ba->m.forma,true,0,NULL);
       	 
       	 

       	 PSDepositoBA(true); // Poner demas valores       	 
         PonFecCamp(62,ba->yi1,&ba->m.fm,-1,-1,false,&af); 
         PonFecCamp(62,ba->yi2,&ba->m.fa,-1,-1,false,&af); 

  	     return;
}

//  Sacar y poner informacion de la forma

void  PSDepositoBA(Boolean poner) {
FormType 	*f;	
Char      T[50];	

          f=FrmGetActiveForm();
          Texto(ba->m.d,GetObjPtr(f,205),poner);
          if(poner){
            PasaNaA(&ba->m.v,true,true,T); 
            Texto(T,GetObjPtr(f,204),true);           
          } else {
          	 Texto(T,GetObjPtr(f,204),false);
          	 ba->NumErr=PasaAaN(T,true,true,&ba->m.v);
          }
          return;
}

//   Control de detalles de cuentas

Boolean DepositoBA(EventType* pEvent) {
FormType  *f;
Char       t[50];
Int16 v;
    f=FrmGetActiveForm();
	switch (pEvent->eType) {
		case frmUpdateEvent:   // Actualizar desde otra ventana     
			switch(pEvent->data.frmUpdate.updateCode) {
			    case 70: break;	
   			    case 90: ba->ayu=false; break;			    
   			    case 92: ba->ceb=false; break;
   			    case 93: ba->ceb=false; ba->m.dceb=true;break;
			    case 94: ba->gas=false; break;
	    		case 95: ba->gas=false; ba->m.dgi=true; break;
				case 99: break;
			    default: return false;
			}
			FormaDepositoBA(false);
			return true;
		case frmOpenEvent:     // Inicio
   		     FormaDepositoBA(true);
  			 PonBotonCT(&(ba->oc),0,0,NULL,NULL,f,0,2600,0);       		     
             return true;
             
		case penDownEvent:   // Fechas
		    if (!(pEvent->screenX>62 && pEvent->screenX < 140)) return false;
            if (pEvent->screenY > ba->yi1 && pEvent->screenY < ba->yf1) {
            	PSDepositoBA(false);
   	          	SacaTexto(t,2600,93,50); 
		        SelFecha(t,&(ba->m.fm),false);
		        FrmUpdateForm(FDepositoBA,99);
                return true; 
            }
            if (pEvent->screenY > ba->yi2 && pEvent->screenY < ba->yf2) {
            	PSDepositoBA(false);
   	          	SacaTexto(t,2600,94,50); 
		        SelFecha(t,&(ba->m.fa),false);
		        ba->Modfa=true;
		        FrmUpdateForm(FDepositoBA,99);
                return true; 
            }
            return false;  
            
        case fldEnterEvent:    // Campos
            switch(pEvent->data.fldEnter.fieldID) {
   		    case  204: PonBotonCTN(&(ba->oc),1,204,&ba->m.v,NULL,f,0,2600,95); return false;
   		    case  205: PonBotonCT(&(ba->oc),2,205,NULL,ba->m.d,f,sizeof(ba->m.d),2600,96); return false;   		    
           	default  : PonBotonCT(&(ba->oc),0,0,NULL,NULL,f,0,2600,0); return false;
            }
            break;
            
       case ctlEnterEvent:   //  Seleccion
            switch(pEvent->data.ctlEnter.controlID) {
            case  200: v=Lista(GetObjPtr(f,200),GetObjPtr(f,201),0,false,0,NULL);
        	           switch(v) {
        	           	case 0: ba->m.dgi=false; break;
        	           	case 1: PSDepositoBA(false);
        	           	        ba->gas=true;
         	           	        IniciaGastos(1,2,FDepositoBA,&(ba->m.idgi),!ba->mnvo,ba->col,0);
        	           	        break;
        	           	case 2: PSDepositoBA(false);
        	           	        ba->ceb=true;
        	           	        IniciaCuentas(FDepositoBA,&ba->idcs,&ba->m.idceb,ba->m.dceb,ba->col);
        	           	        break;
        	           	case 3: FrmUpdateForm(FDepositoBA,99); 
        	           	        break;
        	           }
        	           return true;
            case  202: v=Lista(GetObjPtr(f,202),GetObjPtr(f,203),0,false,0,NULL);
                       if(v!=4) ba->m.forma=v;                  
        	           FrmUpdateForm(FDepositoBA,99);        	        
        	           return true;
            }
			break;
            
		case ctlSelectEvent: // Botones
		    switch(pEvent->data.ctlSelect.controlID) {
	   	    case BAyu: ba->ayu=Ayuda(2616,1,ba->col,FDepositoBA); return true;		    	
		   	case BAce: PSDepositoBA(false);
		   			   if(!ba->NumErr) return false;
		   	           if(ba->m.dgi && ba->mnvo) { 
		   	           	 LeerConID(&(ba->m.idgi),&(ba->ga),false);
                         if(ba->ga.Per.op!=0) if(FrmAlert(2600)==0) return false;
                       } 
                       if(CompN0(&ba->m.v)<=0) {FrmAlert(2601);return false;} 
		   	           ActDepositoBA();
		   	           FrmUpdateForm(FListaMovBA,99);
	   				   FrmReturnToForm(0); 
		   	           return true;
		   	case BCan: FrmUpdateForm(FListaMovBA,99);
	   				   FrmReturnToForm(0); 
		   	           return true;
		    case BCal: PSDepositoBA(false);
		               OpBotonCT(&(ba->oc)); 
		               return true;		    	
		    case BBor: if(FrmAlert(104)==0) return true;
		               BorDepositoBA(true);
		   	           FrmUpdateForm(FListaMovBA,99);
	   				   FrmReturnToForm(0); 
		               return true;		    	
		    }
		default: break;    
	}
	return false;
}

//  Actualiza los depositos

void ActDepositoBA() {	
ID   id;	
//         Ya existe, quitar	 
	 if(!ba->mnvo) BorDepositoBA(false);
//         Ponerlo movimiento principal
     if(Futura(&ba->m.fa)) ba->m.aplicado=false; else ba->m.aplicado=true;
	 if(ba->mnvo)CGB_MBA(-1, 1,(void*)&ba->m); 
	 else CGB_MBA(ba->nms,1,(void*)&ba->m);
	 SacarID (&id);
//         Actualiza cuenta principal	 
     CGB_CBA(ba->ncs,0,(void*)&ba->r);	 
     if(ba->m.aplicado) NumSRN(&ba->r.sa,1,&ba->m.v); else NumSRN(&ba->r.sp,1,&ba->m.v);
     CGB_CBA(ba->ncs,1,(void*)&ba->r);
//         Actualiza cuenta-movimiento secundario     
     if(ba->m.dceb)ActualizaCuenta(1,&ba->m,7,&id,&ba->idco,ba->mtcs);
     else if(ba->mtcs) ActualizaCuenta(2,&ba->m,7,&id,&ba->idco,true);
	 return;
}

//   Borrar deposito

void BorDepositoBA(Boolean quitar) {
MOVBA   ma;
ID      id;
//                           lee el movimiento antes de cambiarlo
		CGB_MBA(ba->nms,0,(void*)&ma);
		SacarID(&id);
//                           actualiza el saldo		
        CGB_CBA(ba->ncs,0,(void*)&ba->r);
		if(ma.aplicado) NumSRN(&ba->r.sa,2,&ma.v); else NumSRN(&ba->r.sp,2,&ma.v);          
        CGB_CBA(ba->ncs,1,(void*)&ba->r);
		
//     borrar el movimiento		

        if(quitar){
            if(ma.dceb) ActualizaCuenta(2,&ma,7,&id,&ma.idceb,true);
            CGB_MBA(ba->nms,2,(void*)&ma);
        } 

}

//  ************************************************************

//  *****  Cargo y credito en una cuenta

//   Forma CarCre en un cuenta

void FormaCarCreBA(Boolean inicio) {
FormType *f;
Char     T[50];
Int8     af;
Int16    xx,h;

         h=FntCharHeight()+3;
         f=FrmGetActiveForm(); 
   	     if(inicio) {
             SacaTexto(T,2600,((ba->mnvo)?99:105)+ba->CDI+((ba->cargo)?0:3),50); 
             FrmCopyTitle(f,T);
   	     	 FrmDrawForm(f);
   	     	 FrmHideObject(f,FrmGetObjectIndex(f,101));
   	     	 FrmHideObject(f,FrmGetObjectIndex(f,102));   	     	 
   	     	 if(ba->cargo) FrmShowObject(f,FrmGetObjectIndex(f,102));
   	     	 else FrmShowObject(f,FrmGetObjectIndex(f,101));
   	     	 
             if(ba->mnvo){
               if(ba->cargo) ba->m.drcc=3; else ba->m.drcc=4;
         	   Pasa0aN(&ba->m.v);
         	   FecHoy(&ba->m.fm);
          	   FecHoy(&ba->m.fa);
         	   StrCopy(ba->m.d," " );
         	   ba->m.dgi=false;
          	   ba->m.forma=0;     // No se usan por cargo y credito
        	   ba->m.dceb=false;          	   
           	   Pasa0aN(&ba->m.NumChRef);
             } else {
               CGB_MBA(ba->nms,0,(void*)&ba->m);
               FrmShowObject(f,FrmGetObjectIndex(f,BBor));
             }
            FrmGetObjectPosition(f,FrmGetObjectIndex(f,100),&xx,&ba->yi1);	
            ba->yf1=ba->yi1+h;
   	     }

         EncBA();   	    // Encabezado inicial
       	 
       	 if (!ba->m.dgi)   // Poner cuenta de gasto o ingreso 
       	       Lista(GetObjPtr(FrmGetActiveForm(),200),GetObjPtr(FrmGetActiveForm(),201),0,true,0,NULL);
          else { LeerConID(&(ba->m.idgi),&(ba->ga),false);
                 CtlSetLabel(GetObjPtr(FrmGetActiveForm(),200),ba->ga.Nom); 
         }
         

       	 PSCarCreBA(true); // Poner demas valores       	 
         PonFecCamp(62,ba->yi1,&ba->m.fm,-1,-1,false,&af); 
         
  	     return;
}

//  Sacar y poner informacion de la forma

void  PSCarCreBA(Boolean poner) {
FormType 	*f;	
Char      T[50];	

          f=FrmGetActiveForm();
          Texto(ba->m.d,GetObjPtr(f,203),poner);
          if(poner){
            PasaNaA(&ba->m.v,false,true,T); 
            Texto(T,GetObjPtr(f,202),true);           
          } else {
          	 Texto(T,GetObjPtr(f,202),false);
          	 ba->NumErr=PasaAaN(T,true,false,&ba->m.v);
          }
          return;
}
//   Control de detalles de cuentas

Boolean CarCreBA(EventType* pEvent) {
FormType  *f;
Char       t[50];
Int16 v;
    f=FrmGetActiveForm();
	switch (pEvent->eType) {
		case frmUpdateEvent:   // Actualizar desde otra ventana     
			switch(pEvent->data.frmUpdate.updateCode) {
			    case 70: break;	
   			    case 90: ba->ayu=false; break;			    
			    case 94: ba->gas=false; break;
	    		case 95: ba->gas=false; ba->m.dgi=true; break;
				case 99: break;
			    default: return false;
			}
			FormaCarCreBA(false);
			return true;
		case frmOpenEvent:     // Inicio
   		     FormaCarCreBA(true);
  			 PonBotonCT(&(ba->oc),0,0,NULL,NULL,f,0,2600,0);       		     
             return true;
             
		case penDownEvent:   // Fechas
		    if (!(pEvent->screenX>62 && pEvent->screenX < 140)) return false;
            if (pEvent->screenY > ba->yi1 && pEvent->screenY < ba->yf1) {
            	PSCarCreBA(false);
   	          	SacaTexto(t,2600,111,50); 
		        SelFecha(t,&(ba->m.fm),false);
		        ba->m.fa=ba->m.fm;
		        FrmUpdateForm(FCarCreBA,99);
                return true; 
            }
            return false;  
            
        case fldEnterEvent:    // Campos
            switch(pEvent->data.fldEnter.fieldID) {
   		    case  202: PonBotonCTN(&(ba->oc),1,202,&ba->m.v,NULL,f,0,2600,((ba->cargo)?112:113)); return false;
   		    case  203: PonBotonCT(&(ba->oc),2,203,NULL,ba->m.d,f,sizeof(ba->m.d),2600,114); return false;   		    
           	default  : PonBotonCT(&(ba->oc),0,0,NULL,NULL,f,0,2600,0); return false;
            }
            break;
            
       case ctlEnterEvent:   //  Seleccion
            switch(pEvent->data.ctlEnter.controlID) {
            case  200: v=Lista(GetObjPtr(f,200),GetObjPtr(f,201),0,false,0,NULL);
        	           switch(v) {
        	           	case 0: ba->m.dgi=false; break;
        	           	case 1: PSCarCreBA(false);
        	           	        ba->gas=true;
         	           	        IniciaGastos(((ba->cargo)?0:1),2,FCarCreBA,&(ba->m.idgi),!ba->mnvo,ba->col,0);
        	           	        break;
        	           	case 2: FrmUpdateForm(FCarCreBA,99); 
        	           	        break;
        	           }
        	           return true;
            }
			break;
            
		case ctlSelectEvent: // Botones
		    switch(pEvent->data.ctlSelect.controlID) {
	   	    case BAyu: ba->ayu=Ayuda(((ba->cargo)?2618:2620),1,ba->col,FCarCreBA); return true;		    	
		   	case BAce: PSCarCreBA(false);
		   	           if(!ba->NumErr) return false;		   	
		   	           ActCarCreBA();
		   	           FrmUpdateForm(FListaMovBA,99);
	   				   FrmReturnToForm(0); 
		   	           return true;
		   	case BCan: FrmUpdateForm(FListaMovBA,99);
	   				   FrmReturnToForm(0); 
		   	           return true;
		    case BCal: PSCarCreBA(false);
		               OpBotonCT(&(ba->oc)); 
		               return true;
		    case BBor: if(FrmAlert(104)==0) return true;
		               BorCarCreBA(true);
		   	           FrmUpdateForm(FListaMovBA,99);
	   				   FrmReturnToForm(0); 
		               return true;		    	
		    }
		default: break;    
	}
	return false;
}

//  Actualiza los cargos y creditos
void ActCarCreBA() {	
//         Ya existe, quitar	 
	 if(!ba->mnvo) BorCarCreBA(false);
//        Ponerlo
     if(Futura(&ba->m.fa)) ba->m.aplicado=false; else ba->m.aplicado=true;
	 if(ba->mnvo)CGB_MBA(-1, 1,(void*)&ba->m); 
	 else CGB_MBA(ba->nms,1,(void*)&ba->m);
	 if(ba->m.aplicado) {
         CGB_CBA(ba->ncs,0,(void*)&ba->r);	 
         if(ba->cargo) NumSRN(&ba->r.sa,2,&ba->m.v); else  NumSRN(&ba->r.sa,1,&ba->m.v);     
         CGB_CBA(ba->ncs,1,(void*)&ba->r);
	 }
	 return;
}
//    Borrar cargo o credito
void BorCarCreBA(Boolean quitar) {
MOVBA  * ma;
	 	ma=SacarApMM();
		CGB_MBA(ba->nms,0,(void*)ma);
		if(ma->aplicado) {
            CGB_CBA(ba->ncs,0,(void*)&ba->r);
	    	if(ba->cargo) NumSRN(&ba->r.sa,1,&ma->v); else  NumSRN(&ba->r.sa,2,&ma->v);
            CGB_CBA(ba->ncs,1,(void*)&ba->r);
		}
        if(quitar) CGB_MBA(ba->nms,2,(void*)ma);
}

//  ************************************************************

//  *****  Retiro de una cuenta

//   Forma Retiro de un cuenta

void FormaRetiroBA(Boolean inicio) {
FormType *f;
Char     T[50];
Int8     af;
Int16    xx,h;
NumX     N1;

         h=FntCharHeight()+3;
         f=FrmGetActiveForm(); 
   	     if(inicio) {
             SacaTexto(T,2600,((ba->mnvo)?117:120)+ba->CDI,50); 
             FrmCopyTitle(f,T);
   	     	 FrmDrawForm(f);
	     	 FrmHideObject(f,FrmGetObjectIndex(f,103));
   	     	 FrmHideObject(f,FrmGetObjectIndex(f,104));   	     	 
   	     	 FrmHideObject(f,FrmGetObjectIndex(f,105));   	     	    	     	   
  	     	 FrmHideObject(f,FrmGetObjectIndex(f,202));   	     	    	     	   
  	     	 FrmHideObject(f,FrmGetObjectIndex(f,204));   	     	    	     	   
  	     	 FrmHideObject(f,FrmGetObjectIndex(f,206));   	     	    	     	   
  	     	 FrmHideObject(f,FrmGetObjectIndex(f,208));   	     	    	     	   
   	     	 if(ba->CDI==0) FrmShowObject(f,FrmGetObjectIndex(f,103));   	     	    	     	   
   	     	 if(ba->CDI==1) FrmShowObject(f,FrmGetObjectIndex(f,104));   	     	    	     	   
   	     	 if(ba->CDI==2) FrmShowObject(f,FrmGetObjectIndex(f,105));   	     	    	     	      	     	      	     	   
   	     	 if(ba->CDI==0) FrmShowObject(f,FrmGetObjectIndex(f,202));   	     	    	     	   
   	     	 if(ba->CDI==1) FrmShowObject(f,FrmGetObjectIndex(f,204));   	     	    	     	   
   	     	 if(ba->CDI==2) FrmShowObject(f,FrmGetObjectIndex(f,206));   	     	    	     	      	     	      	     	   
  	     	 if(ba->CDI!=2) FrmShowObject(f,FrmGetObjectIndex(f,208));   	     	    	     	      	     	      	     	   
  	     	 ba->ModCh=false;
  	     	 ba->ModMo=false;
             if(ba->mnvo){
               ba->m.drcc=2;
               Pasa0aN(&ba->m.NumChRef); 
         	   Pasa0aN(&ba->m.v);
         	   FecHoy(&ba->m.fm);
          	   FecHoy(&ba->m.fa);         	   
         	   StrCopy(ba->m.d," " );
         	   ba->m.forma=ba->CDI;
         	   ba->m.dgi=false;
         	   ba->m.dceb=false;         	   
            } else {
            	CGB_MBA(ba->nms,0,(void*)&ba->m);
                FrmShowObject(f,FrmGetObjectIndex(f,BBor));            	
            }
            FrmGetObjectPosition(f,FrmGetObjectIndex(f,100),&xx,&ba->yi1);	
            ba->yf1=ba->yi1+h;
            FrmGetObjectPosition(f,FrmGetObjectIndex(f,105),&xx,&ba->yi2);	
            ba->yf2=ba->yi2+h;
   	     }

         EncBA();   	    // Encabezado inicial
       	 
       	 if (!(ba->m.dgi || ba->m.dceb) )   // Poner cuenta de gasto 
       	       Lista(GetObjPtr(FrmGetActiveForm(),200),GetObjPtr(FrmGetActiveForm(),201),0,true,0,NULL);
         if (ba->m.dgi) { LeerConID(&(ba->m.idgi),&(ba->ga),false);
                 CtlSetLabel(GetObjPtr(FrmGetActiveForm(),200),ba->ga.Nom); }
         if (ba->m.dceb)PonValorCuenta(f,200,&ba->m.idceb,true,ba->str[1]);
         
         switch (ba->CDI) { // Poner forma del deposito 
         	case 0:Lista(GetObjPtr(FrmGetActiveForm(),202),GetObjPtr(FrmGetActiveForm(),203),ba->m.forma,true,0,NULL);
       	           break;
         	case 1:Lista(GetObjPtr(FrmGetActiveForm(),204),GetObjPtr(FrmGetActiveForm(),205),ba->m.forma-1,true,0,NULL);
       	           break;
         	case 2:Lista(GetObjPtr(FrmGetActiveForm(),206),GetObjPtr(FrmGetActiveForm(),207),ba->m.forma-1,true,0,NULL);
       	           break;
         }
       	 
         if(ba->mnvo && ba->CDI==0 &&  // Poner # cheque
            !ba->ModCh && CompN0(&ba->r.UNumCh) > 0) {
         	   if(ba->m.forma==0) {PasaNaN(&ba->r.UNumCh,&ba->m.NumChRef);Pasa1aN(&N1);NumSRN(&ba->m.NumChRef,1,&N1);}
         	   else Pasa0aN(&ba->m.NumChRef); 
         }
         	
       	 PSRetiroBA(true); // Poner demas valores       	 
         PonFecCamp(62,ba->yi1,&ba->m.fm,-1,-1,false,&af); 
         if(ba->CDI==2) PonFecCamp(62,ba->yi2,&ba->m.fa,-1,-1,false,&af); 
  	     return;
}

//  Sacar y poner informacion de la forma

void  PSRetiroBA(Boolean poner) {
FormType 	*f;	
Char      T[50];	

          f=FrmGetActiveForm();
          Texto(ba->m.d,GetObjPtr(f,210),poner);
          if(poner){
          	if(ba->CDI!=2) {
                 PasaNaA(&ba->m.NumChRef,false,false,T); 
                 Texto(T,GetObjPtr(f,208),true);           
          	}
            PasaNaA(&ba->m.v,true,true,T); 
            Texto(T,GetObjPtr(f,209),true);           
          } else {
             if(ba->CDI!=2) {
            	 Texto(T,GetObjPtr(f,208),false);
             	 PasaAaN(T,false,false,&ba->m.NumChRef);
             }
          	 Texto(T,GetObjPtr(f,209),false);
          	 ba->NumErr=PasaAaN(T,true,true,&ba->m.v);
          }
          return;
}

//   Control de retiros de cuentas

Boolean RetiroBA(EventType* pEvent) {
FormType  *f;
Char       t[50];
Int16 v;
    f=FrmGetActiveForm();
	switch (pEvent->eType) {
		case frmUpdateEvent:   // Actualizar desde otra ventana     
			switch(pEvent->data.frmUpdate.updateCode) {
			    case 70: break;	
   			    case 90: ba->ayu=false; break;			    
   			    case 92: ba->ceb=false; break;
   			    case 93: ba->ceb=false; ba->m.dceb=true;
   			             CGB_ID(&ba->m.idceb,5);
                         ba->cre=SacarApRM();if(ba->cre->TipoReg==1 && !ba->ModMo) PasaFaN(&ba->cre->sc,&ba->m.v);
   			             break;
			    case 94: ba->gas=false; break;
	    		case 95: ba->gas=false; ba->m.dgi=true; break;
				case 99: break;
			    default: return false;
			}
			FormaRetiroBA(false);
			return true;
		case frmOpenEvent:     // Inicio
   		     FormaRetiroBA(true);
  			 PonBotonCT(&(ba->oc),0,0,NULL,NULL,f,0,2600,0);       		     
             return true;
             
		case penDownEvent:   // Fecha
		    if (!(pEvent->screenX>62 && pEvent->screenX < 140)) return false;
            if (pEvent->screenY > ba->yi1 && pEvent->screenY < ba->yf1) {
            	PSRetiroBA(false);
   	          	SacaTexto(t,2600,123,50); 
		        SelFecha(t,&(ba->m.fm),false);
		        if(ba->CDI!=2) ba->m.fa=ba->m.fm;
		        FrmUpdateForm(FRetiroBA,99);
                return true; 
            }
            if (ba->CDI!=2) return false;
            if (pEvent->screenY > ba->yi2 && pEvent->screenY < ba->yf2) {
            	PSRetiroBA(false);
   	          	SacaTexto(t,2600,126,50); 
		        SelFecha(t,&(ba->m.fa),false);
		        FrmUpdateForm(FRetiroBA,99);
                return true; 
            }
            return false;  
            
        case fldEnterEvent:    // Campos
            switch(pEvent->data.fldEnter.fieldID) {
   		    case  208: PonBotonCTN(&(ba->oc),1,208,&ba->m.NumChRef,NULL,f,0,2600,((ba->CDI==0)?124:125)); ba->ModCh=true;return false;
  		    case  209: PonBotonCTN(&(ba->oc),1,209,&ba->m.v,NULL,f,0,2600,127); ba->ModMo=true;return false;
   		    case  210: PonBotonCT(&(ba->oc),2,210,NULL,ba->m.d,f,sizeof(ba->m.d),2600,128); return false;   		    
           	default  : PonBotonCT(&(ba->oc),0,0,NULL,NULL,f,0,2600,0); return false;
            }
            break;
            
       case ctlEnterEvent:   //  Seleccion
            switch(pEvent->data.ctlEnter.controlID) {
            case  200: v=Lista(GetObjPtr(f,200),GetObjPtr(f,201),0,false,0,NULL);
        	           switch(v) {
        	           	case 0: ba->m.dgi=false; break;
        	           	case 1: PSRetiroBA(false);
        	           	        ba->gas=true;
         	           	        IniciaGastos(0,2,FRetiroBA,&(ba->m.idgi),!ba->mnvo,ba->col,0);
        	           	        break;
        	           	case 2: PSRetiroBA(false);
        	           	        ba->ceb=true;
        	           	        IniciaCuentas(FRetiroBA,&ba->idcs,&ba->m.idceb,ba->m.dceb,ba->col);
        	           	        break;
        	           	case 3: FrmUpdateForm(FRetiroBA,99); 
        	           	        break;
        	           }
        	           return true;
            case  202: v=Lista(GetObjPtr(f,202),GetObjPtr(f,203),0,false,0,NULL);
                       if(v!=4) ba->m.forma=v;                  
        	           FrmUpdateForm(FRetiroBA,99);        	        
        	           return true;
            case  204: v=Lista(GetObjPtr(f,204),GetObjPtr(f,205),0,false,0,NULL);
                       if(v!=3) ba->m.forma=v+1;                  
        	           FrmUpdateForm(FRetiroBA,99);        	        
        	           return true;
            case  206: v=Lista(GetObjPtr(f,206),GetObjPtr(f,207),0,false,0,NULL);
                       if(v!=3) ba->m.forma=v+1;                  
        	           FrmUpdateForm(FRetiroBA,99);        	        
        	           return true;
            }
			break;
            
		case ctlSelectEvent: // Botones
		    switch(pEvent->data.ctlSelect.controlID) {
	   	    case BAyu: ba->ayu=Ayuda(2622,1,ba->col,FRetiroBA); return true;		    	
		   	case BAce: PSRetiroBA(false);
		   	           if(!ba->NumErr) return false;		   	
		   	           if(ba->m.dgi) { 
		   	           	  LeerConID(&(ba->m.idgi),&(ba->ga),false);
                          if(ba->ga.Per.op!=0) if(FrmAlert(2600)==0) return false;
                          } 
                       if(CompN0(&ba->m.v)<=0) {FrmAlert(2601);return false;}                           
		   	           ActRetiroBA();
		   	           FrmUpdateForm(FListaMovBA,99);
	   				   FrmReturnToForm(0); 
		   	           return true;
		   	case BCan: FrmUpdateForm(FListaMovBA,99);
	   				   FrmReturnToForm(0); 
		   	           return true;
		    case BCal: PSRetiroBA(false);
		               OpBotonCT(&(ba->oc)); 
		               return true;		    	
		    case BBor: if(FrmAlert(104)==0) return true;
		               BorRetiroBA(true);
		   	           FrmUpdateForm(FListaMovBA,99);
	   				   FrmReturnToForm(0); 
		               return true;		    	
		    }
		default: break;    
	}
	return false;
}

//  Revisa si cuenta es de credito para poner monto

void RevCR() {

}


//  Actualiza los retiros

void ActRetiroBA() {	
ID      id;
//         Actualiza cheque
     if(ba->mnvo && ba->CDI==0 && 
        ba->m.forma == 0 && CompNN(&ba->m.NumChRef,&ba->r.UNumCh)>0) {
     	PasaNaN(&ba->m.NumChRef,&ba->r.UNumCh);
     	CGB_CBA(ba->ncs,1,(void*)&ba->r);
     }
//         Ya existe, quitar	 
	 if(!ba->mnvo) BorRetiroBA(false);
//          Poner el movimiento
     if(Futura(&ba->m.fa)) ba->m.aplicado=false; else ba->m.aplicado=true;
	 if(ba->mnvo)CGB_MBA(-1, 1,(void*)&ba->m); 
	 else CGB_MBA(ba->nms,1,(void*)&ba->m);
	 SacarID(&id);
//          Actualiza cuenta principal
	 if(ba->m.aplicado) {
	 	CGB_CBA(ba->ncs,0,(void*)&ba->r);	 
        NumSRN(&ba->r.sa,2,&ba->m.v); 
        CGB_CBA(ba->ncs,1,(void*)&ba->r);
	 }
//          Actualiza cuenta-movimiento secundario	 
      if(ba->m.dceb) ActualizaCuenta(1,&ba->m,7,&id,&ba->idco,ba->mtcs);
      else if(ba->mtcs) ActualizaCuenta(2,&ba->m,7,&id,&ba->idco,true);
      return;
}

//    Borrar retiro actualizando saldos

void BorRetiroBA(Boolean quitar) {
MOVBA   ma;
ID      id;
//                           lee el movimiento antes de cambiarlo
	 	CGB_MBA(ba->nms,0,(void*)&ma);
		SacarID(&id);
//                           actualiza el saldo		
		if(ma.aplicado) {
          CGB_CBA(ba->ncs,0,(void*)&ba->r);
	      NumSRN(&ba->r.sa,1,&ma.v); 
          CGB_CBA(ba->ncs,1,(void*)&ba->r);
		}
		
//     borrar el movimiento		

        if(quitar){
            if(ma.dceb) ActualizaCuenta(2,&ma,7,&id,&ma.idceb,true);
            CGB_MBA(ba->nms,2,(void*)&ma);
        } 
        
}

//    Formar movimiento de bancos en ApMM, Afecta cuenta en ApRM

//    Op   1=Secundario 2=primario
//    Tipo 1=Deposito 2=retiro
//    Valor
//    Fecha del movimiento y de aplicacion
//    Forma del deposito o del retiro
//          0=cheque 1=efectivo/ATM 2=transferencia 3=otro
//    Memo
//    Para Op=1 ID de cuenta-movimiento principal 
//    Para Op=2 ID del gasto o ingreso 

void FormaMovBA(Int16 Op,Int16 tipo, NumX *v ,Fecha *f, Int16 forma, Char * d, ID *id,NumX * NumChRef) {
	
REGBA   *rb;	
MOVBA   *mb;

        rb=SacarApRM();
        mb=SacarApMM();        
//                                Formar movimiento        
        mb->drcc=tipo;
        if(Futura(f)) mb->aplicado=false; else mb->aplicado=true;
        PasaNaN(v,&mb->v);	
        MemMove(&mb->fa,f,sizeof(Fecha));
        MemMove(&mb->fm,f,sizeof(Fecha));
        StrCopy(mb->d,d);
        if(rb->TipoCDI != 1 && tipo == 2 && forma == 0) forma=3;
        if(forma < 0 || forma > 3) forma=3; 
        mb->forma=forma;
        if(Op==1){
        	mb->dgi=false;
            mb->dceb=true;
            MemMove(&mb->idceb,id,sizeof(ID));
        } else {
        	mb->dgi=true;
            mb->dceb=false;
            MemMove(&mb->idgi,id,sizeof(ID));
        }
        PasaNaN(NumChRef,&mb->NumChRef);
        
//         Actualiza cheque

        if(Op==2 && rb->TipoCDI==1 && mb->forma == 0 && 
           CompNN(&mb->NumChRef,&rb->UNumCh)>0) PasaNaN(&mb->NumChRef,&rb->UNumCh);
        
//      Afecta la cuenta        
        
        switch (tipo) {
            case 1: if(mb->aplicado) NumSRN(&rb->sa,1,v); else NumSRN(&rb->sp,1,v);
                    break;
            case 2: if(mb->aplicado) NumSRN(&rb->sa,2,v);         
                    break;
        }
        return;
}
