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

#define Inc		10

// Estructura de control
typedef struct DPEN {
	DPE         *prx;			// Manejo en memoria del control
	Int16       tpr,cn;		
	MemHandle 	mpr;
	UInt8 		*col;			// Colores
	FormType    *f;				// De donde se llamó
	ID          *id;			// De que cuenta se llama
	Int16       sel;			// Selección
	Int8        op;				// 0=Solo esta cuenta 1=+NoClasif 2=Todos
	Boolean     ayu;			// Hay ayuda ?
	MOVGA       niv;			// Mov. programado
	Int8        wf,hf;			// De fechas
	OCalc       oc;				// Para calculadora y teclado
	Char 		TipoReg;		// Tipo de registro a confirmar
	double      NumChRef;       // Cheque o referencia	
	Boolean     ModChRef;
	Char        str[2][150];	// Para menejo de strings
} PEN;
PEN			*pen;
MemHandle 	mpen;

void 	AgVecPen				(ID*,Char,Fecha*)						ES5;
Int16 	CPendientes				(void)									ES5;
void 	PntLPen					(Int16,RectangleType*,char**,ListType*) ES5;
void 	OrdenaListaPendientes	(void)									ES5;
void 	PintaPendientes			(FormType*,Boolean,Boolean,Boolean)		ES5;
void 	AnaCuenta				(Char,Int16,Fecha*)						ES5;
void 	AnaValorCuenta			(Char,Int16,Fecha*)						ES5;
void 	PintaConfPend			(FormType*,Boolean,Boolean) 			ES5;
Boolean BajaInfoProg			(MOVGA*,DPE*,double,double,ID*,Char,double)	ES5;

// **********************************************************************
//
// Inicio y termino, cuantos hay
//
// **********************************************************************
// Inicio y término de EFECTIVO
Boolean Pendientes(FormType *f, ID *id, UInt8 *col) {
	mpen=MemHandleNew(sizeof(PEN));	pen=MemHandleLock(mpen);
	pen->tpr=Inc;
	pen->mpr=MemHandleNew(sizeof(DPE)*pen->tpr); pen->prx=MemHandleLock(pen->mpr);
	pen->f=f; pen->id=id; pen->col=col; pen->sel=0; pen->op=1;
	pen->NumChRef=0;pen->ModChRef=false;
	pen->ayu=false;
 	FrmPopupForm(FPendientes);
    return true;
}
Boolean FinalizaPendientes(void) {
	if (pen->ayu) FinAyuda();
	MemHandleUnlock(pen->mpr); MemHandleFree(pen->mpr);
	MemHandleUnlock(mpen); MemHandleFree(mpen);
	return true;
}
Boolean HayPendientes(void) {
PROG p;
	CG_PR(0,(void*)&p);
	return (p.svi>0 || p.sve>0 || p.sfi>0 || p.sfe>0);
}
void OrdenaListaPendientes() {
DPE 	p;
Int16 	i;
Boolean c;
    do { c=false;
	     for (i=0;i<pen->cn-1;i++) if (Comp2Fec(&(pen->prx[i].f),&(pen->prx[i+1].f))==1) {
	     	MemMove(&p,&(pen->prx[i]),sizeof(DPE));
	     	MemMove(&(pen->prx[i]),&(pen->prx[i+1]),sizeof(DPE));
	     	MemMove(&(pen->prx[i+1]),&p,sizeof(DPE));
	     	c=true;
	     } 
    } while (c==true);
}
void AgVecPen(ID *id, Char tp, Fecha *q) {
	if (pen->cn==pen->tpr) {
		pen->tpr+=Inc;
		MemHandleUnlock(pen->mpr);
		MemHandleResize(pen->mpr,sizeof(DPE)*pen->tpr);
		pen->prx=MemHandleLock(pen->mpr);
	}
	MemMove(&(pen->prx[pen->cn].id),id,sizeof(ID));
	pen->prx[pen->cn].tipo=tp;
	MemMove(&(pen->prx[pen->cn].f),q,sizeof(Fecha));
	(pen->cn)++;
}
void AnaValorCuenta(Char tp, Int16 r, Fecha *h) {
MOVGA 	niv;
Fecha 	q;
ID    	id;
Boolean si;
	CBG_GA(tp,0,r,&niv,NULL);
	if (niv.Per.op!=0) {
		CopFec(&q,&(niv.Per.f)); ProxFPPer(&q,&(niv.Per),2);
		if (Comp2Fec(h,&q)==1) {
			si=false; SacarID(&id);
			switch(pen->op) {
			case 1: if (!niv.did) si=true;
			case 0: if (niv.did) if (niv.id.r==pen->id->r) si=true; break;
			case 2: si=true; break;
			}
			if (si) AgVecPen(&id,tp,&q);
		}
	}
}
void AnaCuenta(Char tp, Int16 id, Fecha *h) {
Int16 t,i,r;
	t=TotGA(tp,id);
	for (i=0;i<t;i++) {
		r=IdGA(tp,id,i); AnaValorCuenta(tp,r,h); AnaCuenta(tp,r,h);
	}
}
Int16 CPendientes() {
Fecha h;
	FecHoy(&h); h.d=1; SumarMeses(1,&h);
	pen->cn=0; AnaCuenta(0,0,&h); AnaCuenta(1,0,&h); 
	if (pen->cn) OrdenaListaPendientes();
	return pen->cn;
}
// **********************************************************************
//
// Confirmar
//
// **********************************************************************
Boolean EnFecPE(Int16 x, Int16 y) {
	return (x>=57 && x<=57+pen->wf && y>=35 && y<=35+pen->hf);
}
void PintaConfPend(FormType *f, Boolean ini, Boolean poner) {
Int8  aa;
Char  s[120];
Fecha fx;
NADA *n;
REGBA  *rb;
	if (poner) {
		if (ini) {
			LeerConID(&(pen->prx[pen->sel].id),(void*)&(pen->niv),false);
			MemMove(&(pen->niv.id),pen->id,sizeof(ID));
			pen->niv.did=true; pen->niv.tpp=2;
		}
		switch(pen->prx[pen->sel].tipo) {
		case 0: SacaTexto(s,2500,4,120); FrmCopyTitle(f,s);
				SacaTexto(s,2300,10,120); FrmCopyLabel(f,204,s);
				break;
		case 1: SacaTexto(s,2500,5,120); FrmCopyTitle(f,s);
				SacaTexto(s,2300,11,120); FrmCopyLabel(f,204,s);
				break;
		}
		if (ini) FrmDrawForm(f);
		StrCopy(s,pen->niv.Nom); PonTexto(s,80,15,B,C,156,false,-1,-1,&aa);
		AstrX(pen->niv.Per.v,s,false,false); Texto(s,GetObjPtr(f,113),true);
		CopFec(&fx,&(pen->prx[pen->sel].f)); ProxFPPer(&fx,&(pen->niv.Per),2);
		pen->hf=PonFecCamp(57,35,&fx,-1,-1,true,&pen->wf);
		FrmSetFocus(f,FrmGetObjectIndex(f,113)); 
		PonBotonCT(&(pen->oc),1,113,&(pen->niv.Per.v),NULL,f,0,2500,0);
		if (ini) { TextoCuenta(s,&(pen->niv.id),true); 
			       PonTexto(s,57,65,N,I,0,false,-1,-1,&aa); }
		n=SacarApRM(); LeerConID(&(pen->niv.id),n,true);
		pen->TipoReg=n->TipoReg;
		switch(n->TipoReg) {
		case 1: FrmHideObject(f,FrmGetObjectIndex(f,116));
				FrmShowObject(f,FrmGetObjectIndex(f,115));
				FrmShowObject(f,FrmGetObjectIndex(f,205));
				if(pen->niv.tpp < 0 || pen->niv.tpp > 1 ) pen->niv.tpp=0;				
				Lista(GetObjPtr(f,115),GetObjPtr(f,210),pen->niv.tpp,true,94,pen->str[0]);
				break;
		case 2: FrmHideObject(f,FrmGetObjectIndex(f,115));
				FrmHideObject(f,FrmGetObjectIndex(f,116));
				FrmHideObject(f,FrmGetObjectIndex(f,205));
				break;
		case 7: if(ini) { pen->NumChRef=0;
			              pen->ModChRef=false;
				          if(pen->niv.tpp < 0 || pen->niv.tpp > 1 ) pen->niv.tpp=0;							              
			              if(pen->prx[pen->sel].tipo==0) {
			                rb=SacarApRM();
		                    if(rb->TipoCDI==1 && pen->niv.tpp==0) pen->NumChRef=rb->UNumCh+1;
		                    FrmShowObject(f,FrmGetObjectIndex(f,116));
		                    } else FrmHideObject(f,FrmGetObjectIndex(f,116));
		                  pen->niv.tpp=0;
		                  FrmShowObject(f,FrmGetObjectIndex(f,115));
				          FrmShowObject(f,FrmGetObjectIndex(f,205));
		        }
        		AstrX(pen->NumChRef,s,false,false); Texto(s,GetObjPtr(f,116),true);		
				Lista(GetObjPtr(f,115),GetObjPtr(f,211),pen->niv.tpp,true,94,pen->str[0]);
				break;  
		}
	}
	else { Texto(s,GetObjPtr(f,113),false); pen->niv.Per.v=AdblX(s); 
	       Texto(s,GetObjPtr(f,116),false); pen->NumChRef=AdblX(s); }
}
Boolean RConfPend(EventType* pEvent) {
Char  s[50];
Int16 v;
	switch (pEvent->eType) {
		case frmUpdateEvent:
			switch(pEvent->data.frmUpdate.updateCode) {
		    case 70: break;					
			case 90: pen->ayu=false; break;
			case 99: break;
			default: return false;
			}
			PintaConfPend(FrmGetActiveForm(),false,true);
			return true;
		case frmOpenEvent:
			PintaConfPend(FrmGetActiveForm(),true,true);
			return true;
		case ctlSelectEvent:
		    switch(pEvent->data.ctlSelect.controlID) {
		   	case BAce: PintaConfPend(FrmGetActiveForm(),false,false);
		   			   if (!BajaInfoProg(&(pen->niv),&(pen->prx[pen->sel]),pen->niv.Per.v,pen->niv.Per.v,pen->id,pen->niv.tpp,pen->NumChRef)) return false;		   	
		   	           FrmUpdateForm(FPendientes,10); FrmReturnToForm(0); return true;
		   	case BCan: FrmUpdateForm(FPendientes,11); FrmReturnToForm(0); return true;
		   	case BAyu: PintaConfPend(FrmGetActiveForm(),false,false);
		   	           pen->ayu=Ayuda(1304,1,pen->col,FConfPend); return true;
		    case BCal: PintaConfPend(FrmGetActiveForm(),false,false);
	    	           OpBotonCT(&(pen->oc)); return true;
		    }
		    break;
        case ctlEnterEvent:
            switch(pEvent->data.ctlEnter.controlID) {
            case  115: switch(pen->TipoReg) {
            		   case 1: v=Lista(GetObjPtr(FrmGetActiveForm(),115),
        	                           GetObjPtr(FrmGetActiveForm(),210),pen->niv.tpp,false,94,pen->str[0]);
        	                   if (v!=-1) pen->niv.tpp=v;
        	                   break;
            	       case 7: v=Lista(GetObjPtr(FrmGetActiveForm(),115),
        	                           GetObjPtr(FrmGetActiveForm(),211),pen->niv.tpp,false,94,pen->str[0]);
        	                   if (v!=-1) {
        	                   	  pen->niv.tpp=v;
        	                   	  if(v!=0 && !pen->ModChRef){ pen->NumChRef=0;
                    	  		  FrmUpdateForm(FConfPend,99);}
        	                   }
        	                   break;
            		   } return true;
            }
            return false;
	    case fldEnterEvent:
            switch(pEvent->data.fldEnter.fieldID) {
   		    case  113: PonBotonCT(&(pen->oc),1,113,&(pen->niv.Per.v),NULL,FrmGetActiveForm(),0,2500,0); return false;
   		    case  116: PonBotonCT(&(pen->oc),1,116,&(pen->NumChRef),NULL,FrmGetActiveForm(),0,2500,0); pen->ModChRef=true;return false;   		    
           	default  : PonBotonCT(&(pen->oc),0,0,NULL,NULL,FrmGetActiveForm(),0,2500,0); return false;
            }
		    break;
        case penDownEvent:
            if (EnFecPE(pEvent->screenX,pEvent->screenY)) {
		        if (SelFecha(s,&(pen->niv.Per.f),false))
				   pen->hf=PonFecCamp(57,35,&(pen->niv.Per.f),-1,-1,true,&pen->wf);
            	return true;
            }
            break;
		default: break;
	}
	return false;
}
// **********************************************************************
//
// Pendientes
//
// **********************************************************************
// Pintar lista
void PntLPen(Int16 it, RectangleType *r,char **u, ListType *p) {
Boolean  		pn;
Int16    		bc,x,y;
RectangleType 	q;
MOVGA 			niv;
Char            s[150];
Int8            a;
double          v;
	pn=SelecLst(pen->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)?pen->col[6]:pen->col[2])); 
		WinEraseRectangle(&q,0);
    }
    x=r->topLeft.x; y=r->topLeft.y;
    LeerConID(&(pen->prx[it].id),(void*)&niv,false);
    ForFec(s,1,&(pen->prx[it].f)); PonTexto(s,x,y,N,I,26,false,-1,-1,&a); x+=28;
    StrCopy(s,niv.Nom); 
    PonTexto(s,x,y,N,I,70,false,-1,-1,&a);
    v=niv.Per.v; if (niv.Per.tpv==0) v*=(double)(-1);
	AstrX(v,s,false,true);
    PonTexto(s,150,y,N,D,50,false,(pn)?(v<0)?pen->col[5]:-1:-1,-1,&a);
	if (pn) WinSetBackColor(bc);
}
// Pintar forma
void PintaPendientes(FormType *f, Boolean poner, Boolean ini, Boolean inil) {
void 	*d;
CRE   	*cre;
EFE		*efe;
REGBA   *rb;
Char 	s[150];
double  v;
Int8    a;
Int16   bc;
	if (poner) {
		if (ini) FrmDrawForm(f);
		FrmHideObject(f,FrmGetObjectIndex(f,300)); 
		FrmHideObject(f,FrmGetObjectIndex(f,301)); 
		PintaB(255,1,16,158,26,8,9,1,2,true,pen->col);
		bc=WinSetBackColor(pen->col[8]); 
		FrmShowObject(f,FrmGetObjectIndex(f,300)); 
		FrmShowObject(f,FrmGetObjectIndex(f,301)); 
		WinSetBackColor(bc); 
		if (inil) CPendientes();
		Lista(GetObjPtr(f,101),GetObjPtr(f,102),pen->op,true,85,pen->str[1]);
		EliminaMarco(f,100,(ListDrawDataFuncPtr)PntLPen,pen->cn,true,pen->sel);
		d=SacarApRM(); LeerConID(pen->id,d,true); TextoCuenta(s,pen->id,true);
		PonTexto(s,60,17,N,I,0,false,-1,pen->col[8],&a);
		switch(SacarTpApRM()) {
		case 1: cre=SacarApRM(); v=cre->un.tc.lc+cre->sa; break;
		case 2: efe=SacarApRM(); v=efe->sa; break;
		case 7: rb=SacarApRM();  v=rb->sa; break;
		}
		AstrX(v,s,true,true); PonTexto(s,60,29,N,I,0,false,(v<0)?pen->col[5]:-1,pen->col[8],&a);
	}
}
// Principal
Boolean RPendientes(EventType* pEvent) {
Int16 v;
	switch (pEvent->eType) {
		case frmUpdateEvent:
			switch(pEvent->data.frmUpdate.updateCode) {
			case 10: PintaPendientes(FrmGetActiveForm(),true,false,true); return true;
			case 11: break;
			case 90: pen->ayu=false; break;
			default: return false;
			}
			PintaPendientes(FrmGetActiveForm(),true,false,false);
			return true;
		case frmOpenEvent:
			PintaPendientes(FrmGetActiveForm(),true,true,true);
			return true;
		case ctlSelectEvent:
		    switch(pEvent->data.ctlSelect.controlID) {
		   	case BAce: FrmUpdateForm(FrmGetFormId(pen->f),60);
		   			   FinalizaPendientes();  FrmReturnToForm(0);
		   	           return true;
		   	case  101: v=Lista(GetObjPtr(FrmGetActiveForm(),101),
        	                   GetObjPtr(FrmGetActiveForm(),102),pen->op,false,85,pen->str[1]);
        	           if (v!=-1) {         
        	           	if (pen->op!=(Char)v) {
        	           		pen->op=(Char)v;
        	           		PintaPendientes(FrmGetActiveForm(),true,false,true);
        	           	}
        	           	else pen->op=(Char)v;
        	           }
        	           return true;
		   	case BAyu: pen->ayu=Ayuda(1302,1,pen->col,FPendientes); return true;
		    }
		    break;
        case lstSelectEvent:
		    pen->sel=pEvent->data.lstSelect.selection;
		    if (pen->sel==noListSelection) break;
		    FrmPopupForm(FConfPend);
            return true;
		default: break;
	}
	return false;
}
