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

// Estructura de control
typedef struct DEF {
	ID          ide;			// ID de efectivo
	ID          ido;			// ID original de cuenta afectada
	ID          idm;			// ID del movimiento
	EFE         *arg;   		// Apuntador estructura mayor en disco
	UInt8 		*col;			// Colores
	EFE         efe;
	MOVEF   	mov;
	Boolean     cmb;			// Hubo cambios
	Boolean     edt;			// Está en edición
	Int16       op;				// Opción interna
	Int8        wf,hf;			// De fechas
	OCalc       oc;				// Calculadora y teclado
	Int16       ns;				// Selección (mov seleccionado)
	Int8		opb;			// Opción borrar
	MOVGA       ga;				// Para cuenta de gastos
	Boolean     ayu;			// Hay ayuda ?
	Boolean     gas;			// Hay gastos ?
	Boolean     pen;			// Hay pendientes ?
	Boolean     slc;			// Hay selección de cuentas ?
	UInt8		tpc;			// Tipo de cuenta
	double      vt;				// Temporal de valor
	Char        inicio;			// De dónde se inicia
	FormType    *f;				// De donde se llamó
	Char        str[2][150];	// Para manejo de strings
} EF;
EF 			*efe;
MemHandle 	mef;

Int16 	CntLEF			(void)											ES6;
Boolean CGB_EF			(Int16,Int8,void*)								ES6;
Boolean CG_EFG			(Int8,void*)									ES6;
void 	PntLResEF		(Int16,RectangleType*,char**,ListType*)			ES6;
void 	PFormaEF		(Char,FormType*,Boolean)						ES6;
void 	AceMovEF		(FormType*,Char,Boolean)						ES6;
void 	PonValoresEF	(FormType*,Boolean)								ES6;
void 	IniTipCtaEF		(FormType*)										ES6;

// **********************************************************************
//
// Disco
//
// **********************************************************************
// Afectar la cuenta de efectivo
Boolean CG_EFG(Int8 op, void *cta) {
	UInt16  NReg;
	switch(op) {
      case 0: // Cargar
              if(!SacarNReg (2,0,&NReg)) return false;
              if(!LeerReg(cta,NReg)) return false;
			  break;
	  case 1: // Guardar
              if(!SacarNReg (2,0,&NReg)) return false;
              if(ModReg(cta,NReg)) return false;
	          break;
	}
	return true;
}
// Sacar cantidad de movimientos de la cuenta
Int16 CntLEF() {
	Int16   t=0;
	UInt16  NReg;
            if(!SacarNReg (2,0,&NReg)) return 0;
            if(!TotMov(NReg,&t)) return 0;
            return t;
}
// Cargar(0), guardar(1) y borrar(2) una movimiento de efectivo
Boolean CGB_EF(Int16 it, Int8 op, void *mov) {
UInt16    NReg;
Boolean   IB;
    if(!SacarNReg (2,0,&NReg)) return false;
	switch(op) {
	case 0: // Cargar
            if(!LeerMov(mov,NReg,it,&IB)) return false;
			return true;
	case 1: // Guardar (it==-1 -> nuevo)
	        if(it==-1) {
               if(!InsMov(mov,NReg)) return false;
	           break;
	        } else {
               if(!ModMov(mov,NReg,it)) return false;
	           break;
	        }
			return true;
	case 2: // Borrar
            if(!BorMov(NReg,it,true)) return false;
			return true;
	}
	return false;
}
// **********************************************************************
//
// Inicio, termino, pintar formas y control borrar y home
//
// **********************************************************************
// Inicio y término de EFECTIVO
void IniciaEF(UInt8 *col, Char tp, FormType *f) {
	mef=MemHandleNew(sizeof(EF));
	efe=(EF *)MemHandleLock(mef);
	efe->arg=(EFE *)SacarApRM();
	efe->col=col;
 	efe->cmb=false;
 	efe->edt=false;
 	efe->ayu=false;
 	efe->gas=false;
 	efe->pen=false;
 	efe->slc=false;
 	efe->inicio=tp;
 	efe->f=f;
 	FrmPopupForm(FResumenEF);
}
Boolean FinalizaEF() {
Boolean cmb;
	if (efe->ayu) FinAyuda(); 
	if (efe->gas) FinalizaGA();
	if (efe->pen) FinalizaPendientes();
	if (efe->slc) FinalizaCuentas();
	cmb=efe->cmb; MemHandleUnlock(mef); MemHandleFree(mef);
	return cmb;
	return false;
}
void IniciaRegEfe() {
EFE *   ApI;
        ApI = SacarApRM();
        ApI->TipoReg=2;
        ApI->sa=0;
        InsReg((INF*)ApI);
        return;
}
// Pintar formas
// tp 1=Resumen 2=Movimiento
void PFormaEF(Char tp,FormType *f, Boolean ini) {
Int16 		x,y,w,h;
Char  		s[50],cg;
Int8        aa;
    x=1; y=16; w=158; h=FntCharHeight(); cg=PrefGen(1);
    switch(tp) {
   	case  1: if (ini) {
   				FrmDrawForm(f); 
   				if (!HayPendientes())  FrmHideObject(f,FrmGetObjectIndex(f,BPen)); 
   			 }
			 EliminaMarco(f,110,(ListDrawDataFuncPtr)PntLResEF,CntLEF(),ini,efe->ns);
			 if (efe->inicio==2) FrmHideObject(f,FrmGetObjectIndex(f,BNue));
    case 2:  CG_EFG(0,&(efe->efe)); SacarID(&(efe->ide));
       	     if (tp==2 && ini) FrmDrawForm(f); 
             PintaB(255,x,y,w,3+(h*2),8,9,1,2,true,efe->col);
	    	 x+=2; y+=2; PintaImagen(2200,x,y); y+=(h-2)/2;
		     SacaTexto(s,2100,0,50); PonTexto(s,x+34,y,B,I,0,false,-1,efe->col[8],&aa);
		     AstrX(efe->efe.sa,s,true,true); PonTexto(s,150,y,B,D,80,false,(efe->efe.sa<0)?efe->col[5]:-1,efe->col[8],&aa);
		     if (tp==2) {
		     	PonValoresEF(f,ini);
		    	if (efe->ns==-1) CtlHideControl(GetObjPtr(f,BBor));
				IniTipCtaEF(f);
				if (efe->oc.op==true) RefBotonCT(&(efe->oc));
		     }
	    	 break;
    }
}
// **********************************************************************
//
// Control de fechas
//
// **********************************************************************
Boolean EnFecEF(Int16 x, Int16 y) {
	return (x>=56 && x<=56+efe->wf && y>=45 && y<=45+efe->hf);
}
// **********************************************************************
//
// Editar / Registrar movimientos
//
// **********************************************************************
void PonValoresEF(FormType *f, Boolean inicio) {
Char s[150];
    switch(efe->mov.tp) {
    // Abono
    case 0: if (efe->edt==false && inicio) {
	            	FecHoy(&(efe->mov.f));
					efe->mov.didg=false;
					efe->mov.v=0; efe->mov.tp1=0;
					efe->mov.rev=false;
					StrCopy(efe->mov.dsc," ");
	    	}
    		efe->hf=PonFecCamp(65,45,&(efe->mov.f),-1,-1,true,&efe->wf);
    		AstrX(efe->mov.v,s,false,true); Texto(s,GetObjPtr(f,208),true);
    		Texto(efe->mov.dsc,GetObjPtr(f,209),true);
    		break;
    // Compra
    case 1: if (efe->edt==false && inicio) {
	            	FecHoy(&(efe->mov.f));
					efe->mov.didg=false;
					efe->mov.v=0;    
					efe->mov.rev=false;
					StrCopy(efe->mov.dsc," ");
	    	}
    		efe->hf=PonFecCamp(65,45,&(efe->mov.f),-1,-1,true,&efe->wf);
    		AstrX(efe->mov.v,s,false,true); Texto(s,GetObjPtr(f,208),true);
    		Texto(efe->mov.dsc,GetObjPtr(f,209),true);
    		if (!efe->mov.didg) Lista(GetObjPtr(f,203),GetObjPtr(f,204),0,true,82,efe->str[0]);
    		else { LeerConID(&(efe->mov.idg),&(efe->ga),false);
    			   AjustaSTR(efe->str[0],efe->ga.Nom,82);
    		       CtlSetLabel(GetObjPtr(f,203),efe->str[0]); }
	   		break;
    // Pago/Depósito
    case 2: if (efe->edt==false && inicio) {
	            	FecHoy(&(efe->mov.f));
					efe->mov.didg=false;
					efe->mov.v=0; efe->mov.tp1=0;
					efe->mov.rev=false;
					StrCopy(efe->mov.dsc," ");
	    	}
    		efe->hf=PonFecCamp(65,45,&(efe->mov.f),-1,-1,true,&efe->wf);
    		AstrX(efe->mov.v,s,false,true); Texto(s,GetObjPtr(f,208),true);
    		Texto(efe->mov.dsc,GetObjPtr(f,209),true);
    		break;
    // Abono general
    case 3: if (efe->edt==false && inicio) {
	            	FecHoy(&(efe->mov.f));
					efe->mov.didg=false;
					efe->mov.v=0; efe->mov.tp1=0;
					efe->mov.rev=false;
					StrCopy(efe->mov.dsc," ");
	    	}
    		efe->hf=PonFecCamp(65,45,&(efe->mov.f),-1,-1,true,&efe->wf);
    		AstrX(efe->mov.v,s,false,true); Texto(s,GetObjPtr(f,208),true);
    		Texto(efe->mov.dsc,GetObjPtr(f,209),true);
    		if (!efe->mov.didg) Lista(GetObjPtr(f,203),GetObjPtr(f,204),0,true,82,efe->str[0]);
    		else { LeerConID(&(efe->mov.idg),&(efe->ga),false);
    		       AjustaSTR(efe->str[0],efe->ga.Nom,82); 	           
           	       CtlSetLabel(GetObjPtr(f,203),efe->str[0]); }
    		break;
    // Ajuste de saldo
    case 9: if (efe->edt==false && inicio) {
					FecHoy(&(efe->mov.f));
					efe->mov.didg=false;
					efe->mov.v=efe->efe.sa;    
					efe->mov.rev=false;
					StrCopy(efe->mov.dsc," ");
	    	}
	    	else if (inicio) efe->mov.v=efe->efe.sa;
    		efe->hf=PonFecCamp(65,45,&(efe->mov.f),-1,-1,true,&efe->wf);
    		AstrX(efe->mov.v,s,false,true); Texto(s,GetObjPtr(f,208),true);
    		Texto(efe->mov.dsc,GetObjPtr(f,209),true);
    		if (!efe->mov.didg) Lista(GetObjPtr(f,203),GetObjPtr(f,204),0,true,82,efe->str[0]);
    		else { LeerConID(&(efe->mov.idg),&(efe->ga),false);
    			   AjustaSTR(efe->str[0],efe->ga.Nom,82);
        	       CtlSetLabel(GetObjPtr(f,203),efe->str[0]); }
	   		break;
    }
}
void AceMovEF(FormType *f, Char op, Boolean oper) { // op=1 -> editar/agregar otro->borrar
Char 	s[50];
double 	v;
	if (oper) if (op==1 && efe->ns==-1) 
		{ CGB_EF(efe->ns,1,(void *)&(efe->mov)); SacarID(&(efe->idm)); }
	switch(efe->mov.tp) {
	// Abono
	case 3:
	case 0: if (oper) if (efe->edt && efe->mov.rev) efe->efe.sa-=efe->vt;
			if (op==1) {
	          Texto(s,GetObjPtr(f,208),false); efe->mov.v=AdblX(s);
	          if (oper) {
	          	efe->mov.rev=!(Futura(&(efe->mov.f)));
	          	if (efe->mov.rev) efe->efe.sa+=efe->mov.v;
	          }
	          Texto(efe->mov.dsc,GetObjPtr(f,209),false);
			}
			if (oper && efe->mov.tp==0) ActualizaCuenta(op,&(efe->mov),2,&(efe->idm),&(efe->ido),efe->edt);
	        break;
	// Compra
	case 1: if (oper) if (efe->edt && efe->mov.rev) efe->efe.sa+=efe->vt;
	        if (op==1) {
	          Texto(s,GetObjPtr(f,208),false); efe->mov.v=AdblX(s);
	          if (oper) {
	          	efe->mov.rev=!(Futura(&(efe->mov.f)));
	          	if (efe->mov.rev) efe->efe.sa-=efe->mov.v;
	          }
	          Texto(efe->mov.dsc,GetObjPtr(f,209),false);
			}
	        break;
	// Traspaso
	case 2: if (oper) if (efe->edt && efe->mov.rev) efe->efe.sa+=efe->vt;
	        if (op==1) {
	          Texto(s,GetObjPtr(f,208),false); efe->mov.v=AdblX(s);
	          if (oper) {
	          	efe->mov.rev=!(Futura(&(efe->mov.f)));
	          	if (efe->mov.rev) efe->efe.sa-=efe->mov.v;
	          }
	          Texto(efe->mov.dsc,GetObjPtr(f,209),false);
			}
			if (oper) ActualizaCuenta(op,&(efe->mov),2,&(efe->idm),&(efe->ido),efe->edt);
	        break;
	// Ajuste de saldo
	case 9: if (oper) if (efe->edt) efe->efe.sa-=efe->vt;
	        if (op==1) {
	          Texto(s,GetObjPtr(f,208),false); 
	          if (!oper) efe->mov.v=AdblX(s);
	          else { v=AdblX(s); efe->mov.v=v-efe->efe.sa; efe->efe.sa=v; }
	          Texto(efe->mov.dsc,GetObjPtr(f,209),false);
			}
	        break;
	}
	if (oper) {
		if (op==1) GuardarConID(&(efe->idm),(void *)&(efe->mov));
		else CGB_EF(efe->ns,op,(void *)&(efe->mov));
		CG_EFG(1,&(efe->efe));
   		efe->cmb=true; FrmUpdateForm(FResumenEF,99); FrmReturnToForm(FResumenEF);
	}
}
void IniTipCtaEF(FormType *f) {
NADA *n;
	switch(efe->mov.tp) {
	case 0: // Abono
			PonValorCuenta(f,203,&(efe->mov.idg),efe->mov.didg,efe->str[1]);
			if (!efe->mov.didg) {
				FrmHideObject(f,FrmGetObjectIndex(f,205)); 
				FrmHideObject(f,FrmGetObjectIndex(f,207)); 
			}
			else {
				n=SacarApRM(); LeerConID(&(efe->mov.idg),n,true); efe->tpc=n->TipoReg;
				switch(efe->tpc) {
				case 1: FrmHideObject(f,FrmGetObjectIndex(f,207)); 
						FrmShowObject(f,FrmGetObjectIndex(f,205)); 
						Lista(GetObjPtr(f,205),GetObjPtr(f,210),efe->mov.tp1,true,0,NULL);
						break;
				case 2: FrmHideObject(f,FrmGetObjectIndex(f,205)); 
						FrmHideObject(f,FrmGetObjectIndex(f,207)); 
						break;
				}
			}
			break;
	case 2: // Traspaso
			PonValorCuenta(f,203,&(efe->mov.idg),efe->mov.didg,efe->str[1]);
			break;
	}
}
void CargaValorEF(FormType *f) {
CRE *cre;
	 CGB_ID(&(efe->mov.idg),0);
	 switch(SacarTpApRM()) {
	 case 1: cre=SacarApRM(); efe->mov.v=(cre->sc*(-1)); break;
	 }
}
Boolean EditarEF(EventType* pEvent) {
Int16 v;
Char s[150];
	switch (pEvent->eType) {
		case frmOpenEvent:
			MemMove(&(efe->ido),&(efe->mov.idg),sizeof(ID)); 
			efe->vt=efe->mov.v;
		    PonBotonCT(&(efe->oc),1,208,&(efe->mov.v),NULL,FrmGetActiveForm(),0,2200,0);
		    PFormaEF(2,FrmGetActiveForm(),true); 
			return true;
		case frmUpdateEvent:
			switch(pEvent->data.frmUpdate.updateCode) {
			case 70: break;
			case 90: efe->ayu=false; break;
			case 92: efe->slc=false; break;
			case 93: efe->slc=false; efe->mov.didg=true;
					 CargaValorEF(FrmGetActiveForm());
			         break;
			case 95: efe->gas=false; efe->mov.didg=true; break;
			case 94: efe->gas=false; break;
			default: return false;
			} 
		    PFormaEF(2,FrmGetActiveForm(),false);			
			return true;
		case ctlSelectEvent:
		    switch(pEvent->data.ctlSelect.controlID) {
			case BCal: AceMovEF(FrmGetActiveForm(),1,false);
			           OpBotonCT(&(efe->oc)); return true;
		   	case BAce: if ((efe->mov.tp==0 || efe->mov.tp==2) && !efe->mov.didg) 
		   			   { FrmAlert(2200); break; }
		   	           AceMovEF(FrmGetActiveForm(),1,true); return true;
		   	case BCan: FrmReturnToForm(0); return true;
		   	case BAyu: AceMovEF(FrmGetActiveForm(),1,false);
			           switch(efe->mov.tp) {
		   			     case 0: efe->ayu=Ayuda(2204,1,efe->col,FEditarEF_1); break;
		   			     case 1: efe->ayu=Ayuda(2202,1,efe->col,FEditarEF_2); break;
		   			     case 2: efe->ayu=Ayuda(2206,1,efe->col,FEditarEF_3); break;
		   			     case 3: efe->ayu=Ayuda(2210,1,efe->col,FEditarEF_4); break;
		   			     case 9: efe->ayu=Ayuda(2208,1,efe->col,FEditarEF); break;
		   			   } return true;
		   	case BBor: if (FrmAlert(104)==1) AceMovEF(FrmGetActiveForm(),2,true);
					   return true;
		    }
		    break;
        case ctlEnterEvent:
            switch(pEvent->data.ctlEnter.controlID) {
            case  203: AceMovEF(FrmGetActiveForm(),1,false);
                       if (efe->mov.tp==1 || efe->mov.tp==9 || efe->mov.tp==3) {
                       	v=Lista(GetObjPtr(FrmGetActiveForm(),203),
        	                    GetObjPtr(FrmGetActiveForm(),204),0,false,0,NULL);
        	           	switch(v) {
        	           	case 0: efe->mov.didg=false; break;
        	           	case 1: efe->gas=true;
        	           	        IniciaGastos((efe->mov.tp==3)?1:0,2,FrmGetFormId(FrmGetActiveForm()),&(efe->mov.idg),efe->mov.didg,efe->col,0);
        	           	        break;
        	           	case 2: if (!efe->mov.didg)
        	           			   Lista(GetObjPtr(FrmGetActiveForm(),203),GetObjPtr(FrmGetActiveForm(),204),0,true,82,efe->str[0]);
        	           			else {
        	           	           LeerConID(&(efe->mov.idg),&(efe->ga),false);
								   AjustaSTR(efe->str[0],efe->ga.Nom,82);
        	           	           CtlSetLabel(GetObjPtr(FrmGetActiveForm(),203),efe->str[0]);
        	           			}
        	           	        break;
        	           	}
            		   }
            		   else efe->slc=IniciaCuentas(((efe->mov.tp==0)?FEditarEF_1:FEditarEF_3),
            		                               &(efe->ide),&(efe->mov.idg),efe->mov.didg,efe->col);
        	           return true;
        	case  205: switch(efe->tpc) {
        			   case 1: v=LstPopupList(GetObjPtr(FrmGetActiveForm(),210)); 
        			           if (v==-1) return true;
        			           break;
        			   case 2: return true;
        			   }
        	           efe->mov.tp1=(Char)v;
        			   IniTipCtaEF(FrmGetActiveForm());
        	           return true;
            }
            break;
	    case fldEnterEvent:
            switch(pEvent->data.fldEnter.fieldID) {
   		    //case  207: PonBotonCT(&(efe->oc),1,207,FrmGetActiveForm(),0,0); return false;
   		    case  208: PonBotonCT(&(efe->oc),1,208,&(efe->mov.v),NULL,FrmGetActiveForm(),0,2200,0); return false;
   		    case  209: PonBotonCT(&(efe->oc),2,209,NULL,efe->mov.dsc,FrmGetActiveForm(),sizeof(efe->mov.dsc),2200,4); return false;
           	default  : PonBotonCT(&(efe->oc),0,0,NULL,NULL,FrmGetActiveForm(),0,2200,0); return false;
            }
            break;
        case penDownEvent:
        	if (FrmGetFormId(FrmGetActiveForm())==FEditarEF) return false;
            if (EnFecEF(pEvent->screenX,pEvent->screenY)) {
            	AceMovEF(FrmGetActiveForm(),1,false);
		        SelFecha(s,&(efe->mov.f),false);
				FrmUpdateForm(FEditarEF,70);
                return true;
            }
            break;
		default: break;
	}
	return false;
}
// **********************************************************************
//
// RESUMEN GENERAL
//
// **********************************************************************
// Pintar lista resumen
void PntLResEF(Int16 it, RectangleType *r,char **u, ListType *p) {
Boolean  		pn;
Int16    		bc,x,y;
RectangleType 	q;
Char            s[51],t[120];
Int8            a;
	/*
    q.topLeft.x=0; q.topLeft.y=r->topLeft.y; 
    q.extent.y=r->extent.y; q.extent.x=160;
    bc=WinSetBackColor(efe->col[2]);
    WinEraseRectangle(&q,0);
    WinSetBackColor(bc);
    */
	pn=SelecLst(efe->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)?efe->col[6]:efe->col[2])); 
		WinEraseRectangle(&q,0);
    }
    CGB_EF(it,0,&efe->mov); x=r->topLeft.x; y=r->topLeft.y;
    ForFec(s,1,&(efe->mov.f));
    PonTexto(s,x,y,N,I,26,false,-1,-1,&a); x+=28;
    StrCopy(t,efe->mov.dsc);
    switch(efe->mov.tp) {
    case 0: if (StrLen(efe->mov.dsc)<=1) SacaTexto(t,2200,4,50);
    		else StrCopy(t,efe->mov.dsc);
    		AstrX(efe->mov.v,s,false,true);
    		break;
    case 1: if (efe->mov.didg) {
    			LeerConID(&(efe->mov.idg),&(efe->ga),false);
    			StrCopy(t,efe->ga.Nom); 
    		}
    		else if (StrLen(efe->mov.dsc)<=1) SacaTexto(t,2200,5,50);
    		     else StrCopy(t,efe->mov.dsc);
    		AstrX(efe->mov.v*-1,s,false,true);
    		break;
    case 2: if (StrLen(efe->mov.dsc)<=1) SacaTexto(t,2200,6,50);
    		else StrCopy(t,efe->mov.dsc);
    		AstrX(efe->mov.v*-1,s,false,true);
    		break;
    case 3: if (efe->mov.didg) {
	    		LeerConID(&(efe->mov.idg),&(efe->ga),false);
	    		SacaTexto(t,2200,4,50); StrCat(t," ("); StrCat(t,efe->ga.Nom); StrCat(t,")");
	    	}
    		else if (StrLen(efe->mov.dsc)<=1) SacaTexto(t,2200,4,50);
    		     else StrCopy(t,efe->mov.dsc);
    		AstrX(efe->mov.v,s,false,true);
    		break;
    case 9: if (StrLen(efe->mov.dsc)<=1) SacaTexto(t,2200,7,50);
    		else StrCopy(t,efe->mov.dsc);
    		AstrX(efe->mov.v,s,false,true);
            break;
    }
    PonTexto(t,x,y,N,I,60,false,-1,-1,&a);
    PonTexto(s,150,y,N,D,60,false,(efe->mov.tp==2)?efe->col[5]:-1,-1,&a);
	if (pn) WinSetBackColor(bc);
}
// Principal
Boolean ResumenEF(EventType* pEvent) {
	switch (pEvent->eType) {
		case frmUpdateEvent:
			switch(pEvent->data.frmUpdate.updateCode) {
			case 60: efe->pen=false; break;
			case 90: efe->ayu=false; break;
			case 99: break;
			default: return false;
			}
			PFormaEF(1,FrmGetActiveForm(),false);
			return true;
		case frmOpenEvent:
		    PFormaEF(1,FrmGetActiveForm(),true);
			return true;
		case ctlSelectEvent:
		    switch(pEvent->data.ctlSelect.controlID) {
		   	case BAce: FrmUpdateForm(FrmGetFormId(efe->f),(efe->cmb)?99:98);
		   			   FinalizaEF();
					   FrmReturnToForm(0);
		   	 		   return true;
		   	case BNue: efe->mov.tp=(Int8)LstPopupList((ListType*)GetObjPtr(FrmGetActiveForm(),100));
		   			   efe->edt=false; efe->ns=-1;
		   			   if (efe->mov.tp==0) efe->mov.tp=3; else efe->mov.tp--;
		   			   switch(efe->mov.tp) {
		   			   case 0: FrmPopupForm(FEditarEF_1); break;
		   			   case 1: FrmPopupForm(FEditarEF_2); break;
		   			   case 2: FrmPopupForm(FEditarEF_3); break;
		   			   case 3: FrmPopupForm(FEditarEF_4); break;
		   			   }
		   			   return true;
		    case BEdi: efe->mov.tp=9; efe->edt=false; efe->ns=-1; FrmPopupForm(FEditarEF); break;
		   	case BAyu: efe->ayu=Ayuda(2200,1,efe->col,FResumenEF); return true;
		   	case BPen: efe->pen=Pendientes(FrmGetActiveForm(),&(efe->ide),efe->col); return true;
		    }
		    break;
        case lstSelectEvent:
		    efe->ns=pEvent->data.lstSelect.selection;
		    if (efe->ns==noListSelection) break;
		    efe->edt=true; CGB_EF(efe->ns,0,(void *)&(efe->mov));
		    SacarID(&efe->idm);
		    switch(efe->mov.tp) {
		   	   case 0: FrmPopupForm(FEditarEF_1); break;
		   	   case 1: FrmPopupForm(FEditarEF_2); break;
		   	   case 2: FrmPopupForm(FEditarEF_3); break;
		   	   case 3: FrmPopupForm(FEditarEF_4); break;
		   	   case 9: FrmPopupForm(FEditarEF); break;
		   	}
            return true;
		default: break;
	}
	return false;
}
void ActualizaSaldosEF() {
Int16 	i;
MOVEF 	mov;
EFE   	efe;
Boolean c;
	c=false; CG_EFG(0,&efe);
	for (i=0;i<CntLEF();i++) {
		CGB_EF(i,0,&mov); if (!mov.rev && !Futura(&(mov.f))) {
			switch(mov.tp) {
				case 0: efe.sa+=mov.v; break;
				case 1: efe.sa-=mov.v; break;
				case 2: efe.sa-=mov.v; break;
				case 3: efe.sa+=mov.v; break;
			}
			c=true; mov.rev=true; CGB_EF(i,1,&mov);
		}
	}
	if (c) CG_EFG(1,&efe);
}