<?
////////////////////////////////////////////////////
// Conciliación: gestión de conciliación de activos
// Version: 1.0
//
// Copyright (C) 2014  Eustotem Multimedia, S.L.
//
// License: MIT, see LICENSE
////////////////////////////////////////////////////


class Activos{
	public $resId=NULL;				
	public $old_recordset=NULL;		
	public $recordset=NULL;			
	public $mail=NULL;				
	public $prefs=NULL;				
	
	private function recalc($id){
		$f=mysql_fetch_assoc(mysql_query("SELECT * FROM smk_conciliacion WHERE id=$id"));
		$sql="SELECT AMORT_ACUMULADA({$f['val_adq']}, {$f['val_resid']}, {$f['annos_amort']}, YEAR(NOW())-{$f['anno_capit']}, {$f['tipo_amort']}) AS yuyu";
		$r=mysql_fetch_assoc(mysql_query($sql));
		$q=mysql_query("UPDATE smk_conciliacion SET amort_acum={$r['yuyu']}, val_cont=val_adq-{$r['yuyu']} WHERE id={$f['id']}");
	}
	private function resuma($grupo){
		if($grupo==NULL) return;
		$sql="SELECT * FROM smk_conciliacion WHERE grupo={$grupo}";
		$q=mysql_query($sql) or die($sql);
		if(mysql_num_rows($q)>0){
			$r=mysql_fetch_assoc($q);
			$sql="UPDATE smk_conciliacion SET 
				val_adq=VALOR_ADQUISICION({$r['id']}, {$r['grupo']}, {$r['af_id_activo']}, {$r['val_adq']})
				-- , val_cont=VALOR_CONTABLE({$r['id']}, {$r['grupo']}, {$r['af_id_activo']}, {$r['val_adq']})
			WHERE id={$r['id']}
			";
			$qq=mysql_query($sql);
			$this->recalc($r['id']);	
		}
	}
	
	public function nuevoActivo(){
		$cadena=""; 
		$r=mysql_fetch_assoc(mysql_query("SELECT *, MAX(id)+1 AS maxid FROM smk_conciliacion"));
		$nid=$r['maxid'];
		$q=mysql_query("UPDATE smk_conciliacion SET id={$r['maxid']} WHERE id=0");
		$f=mysql_fetch_assoc(mysql_query("SELECT * FROM smk_conciliacion WHERE id={$nid}"));
		if($f['grupo']=="0"){
			$f0=mysql_fetch_assoc(mysql_query("select max(grupo)+1 as grupo, max(af_id_activo)+1 as af_id_activo, max(af_num_activo)+1 as af_num_activo, max(id_galtier)+1 as id_galtier from smk_conciliacion"));	
			$sql="UPDATE smk_conciliacion SET 
				grupo={$f0['grupo']},
				af_id_activo={$f0['af_id_activo']},
				af_num_activo={$f0['af_num_activo']},
				id_galtier={$f0['id_galtier']}
			WHERE id={$nid}";
			$q=mysql_query($sql);
		}else{
			$qpadre=mysql_query("SELECT * FROM smk_conciliacion WHERE af_id_activo IS NOT NULL AND grupo={$f['grupo']}") or die(mysql_error());
			$padre=mysql_fetch_assoc($qpadre);
			$id_padre=$padre['id'];
			$no=mysql_fetch_assoc(mysql_query("SELECT MAX(orden)+1 AS no FROM smk_conciliacion WHERE af_id_activo IS NULL AND grupo={$f['grupo']}"));
			$orden=$no['no'];
			$q=mysql_query("UPDATE smk_conciliacion SET orden=$orden, id_padre=$id_padre WHERE id={$f['id']}");
			$this->recalc($nid);
			$this->resuma($f['grupo']);
		}
	}
	public function cambioActivo(){
		$f=$this->recordset; $o=$this->old_recordset;
		if($o==NULL) return;
		
		
		if($f['porcent_anual']>0){
			$f['tipo_amort']=4;
		}
		if($f['tipo_amort']==4){
			$f['mes_inicio']=1; 			
			if($f['porcent_anual']==0){
				$f['annos_amort']=0;
			}else{
				$f['annos_amort']=ceil(100/$f['porcent_anual']);
			}
			mysql_query("UPDATE smk_conciliacion SET mes_inicio=1, tipo_amort=4, annos_amort={$f['annos_amort']} WHERE id={$f['id']}");			
			if($f['af_id_activo']!=NULL){
				$this->cambiaDescendientes($f['id'], array('porcent_anual'=>$f['porcent_anual'], 'anno_capit'=>$f['anno_capit']));
			}
		}
		
		if($f['anno_capit']!=$o['anno_capit'] || $f['val_adq']!=$o['val_adq'] || $f['val_resid']!=$o['val_resid'] || $f['annos_amort']!=$o['annos_amort'] || $f['tipo_amort']!=$o['tipo_amort']){
			$this->recalc($f['id']);
			$this->resuma($f['grupo']);
		}
		
		$fid=mysql_fetch_assoc(mysql_query("SELECT forzar_baja FROM smk_denominaciones WHERE id={$f['id_denominacion']}"));
		if($fid['forzar_baja']!=1){
			$q=mysql_query("UPDATE smk_conciliacion SET fecha_baja=NULL WHERE id={$f['id']}");
		}

		if($f['grupo']!=$o['grupo']){
			$this->resuma($o['grupo']);
			$this->resuma($f['grupo']);
		}
	}
	public function cambiaDescendientes($id_padre, $campos){
		include_once("../sanmarko/Amortizacion.class.php");
		$sql="SELECT * FROM smk_conciliacion WHERE id_padre={$id_padre}";
		$q=mysql_query($sql);
		while($o=mysql_fetch_assoc($q)){
			$f=$o;
			$cadena=array();
			foreach($campos as $clave=>$valor){
				$f[$clave]=$valor;
				$cadena[]="{$clave}='{$valor}'";
			}
			$sql="UPDATE smk_conciliacion SET " . implode(", ",$cadena) . " WHERE id={$f['id']}";
			mysql_query($sql);
			
			$activos=new Activos();			$historial=new Amortizacion();
			$activos->old_recordset=$o;		$historial->old_recordset=o;
			$activos->recordset=$f;			$historial->recordset=$f;
			$activos->resId=$this->resId;	$historial->resId=$this->resId;
			$activos->cambioActivo();		$historial->initHistorial();
		}
	}
	public function borradoActivo(){
		$f=$this->recordset; $o=$this->old_recordset;
		if($o['af_id_activo']!=NULL && $o['af_id_activo']!=''){
			$sql="UPDATE smk_conciliacion SET grupo=NULL WHERE grupo={$o['grupo']}";
			$q=mysql_query($sql) or die(mysql_error());
		}else{
		}
	}
	
	public function sln($cost, $salvage, $life, $per=NULL, $factor=NULL){
		$f=$this->recordset;
		$retonno=($cost - $salvage) / $life;
		return $retonno;
	}
	public function syd($cost, $salvage, $life, $per, $factor=NULL){
		return (($cost - $salvage) * ($life - $per + 0) * 2) / ($life * (1 + $life));
	}
	public function ddb($cost, $salvage, $life, $per, $factor=2){
		$f=$this->recordset;
		$x=0;
		$n=0;
		while($per>=$n){
			$x = $factor * $cost / $life;
			if(($cost-$x)<$salvage){
				$x=$cost-$salvage;
			}
			if($x<0) $x=0;
			$cost=$cost-$x;
			$n++;
		}
		return $x;
	}
	public function dum(){
		return 0;
	}
	public function getAmort2(){
		$f=$this->recordset;
		$metodo=array("dum","sln","syd","ddb");
		$q=mysql_query("DELETE FROM smk_valores WHERE idActivo={$f['id']} AND tipo=1") or die(mysql_error());
		$cuota=0;
		$contable=$f['val_adq'];
		$acumulada=0;
		if($f['mensual']!=1){
			$periodos=(int)$f['annos_amort'];
		}else{
			$periodos=(int)$f['annos_amort']*12;
		}
		for($contador=0; $contador<=$periodos; $contador++){
			$periodonombre=$this->getPeriodName($f, $contador);
			$cuota=$this->$metodo[$f['tipo_amort']]($f['val_adq'], $f['val_resid'], $periodos, $contador);
			$sql="INSERT INTO smk_valores(idActivo, periodo, tipo, valor, periodonombre, comentarios, idAdjunto, acumulada, contable) VALUES({$f['id']}, $contador, 1, $cuota, '$periodonombre', '', NULL, $acumulada, $contable)";
			$q=mysql_query($sql) or die($sql);
			$acumulada=$acumulada + $cuota;
			$contable=(float)$f['val_adq']-$acumulada;
		}
	}
	public function getAmort($skip_fechabaja=FALSE){
		$f=$this->recordset; $o=$this->old_recordset;
		if(!$this->permitirAmort($f)) return;
		$metodo=array("dum","sln","syd","ddb");
		$cuota=0;
		$contable=$f['val_adq'];
		$acumulada=0;
		$offset=0;
		$especiales=array();
		$incremento=0;
		
		if($f['mensual']!=1){
			$periodos=(int)$f['annos_amort'];
		}else{
			$periodos=(int)$f['annos_amort']*12;
		}
		
		if($f['fecha_baja']!=$o['fecha_baja'] && $skip_fechabaja==FALSE){
			if($f['fecha_baja']!=$o['fecha_baja']){
				$sql="UPDATE smk_valores SET tipo=1 WHERE tipo=3 AND idActivo={$f['id']}";
				$q=mysql_query($sql);
				if(strtotime($f['fecha_baja'])!==FALSE){
					if($f['mensual']!=1){
						$yuyu=date("Y", strtotime($f['fecha_baja']));
					}else{
						$yuyu=date("Y-d", strtotime($f['fecha_baja']));
					}
					$q=mysql_query("UPDATE smk_valores SET tipo=3, contable=0, acumulada={$f['val_adq']} WHERE idActivo={$f['id']} AND periodonombre='{$yuyu}'");
				}else{
					
				}
			}
		}
		
		$q=mysql_query("DELETE FROM smk_valores WHERE idActivo={$f['id']} AND tipo=1") or die(mysql_error());
		
		$q=mysql_query("SELECT * FROM smk_valores WHERE idActivo={$f['id']}") or die(mysql_error());
		while($e=mysql_fetch_assoc($q)) $especiales[]=$e;
		
		$xperiodos=$periodos;
		for($contador=0; $contador<$periodos; $contador++){
			$insert=TRUE;
			$modosql="INSERT";
			$recalculacontable=FALSE;
			
			foreach($especiales as $item){
				if($item['periodo']==$contador){
					if($item['tipo']==3 || $item['tipo']==2){
						$incremento=$item['incremento'];
						if($item['tipo']==3){
							$incremento=-$contable;
							$break=true;
						}
						$contable+=$incremento;			
						$f['val_adq']=$contable;
						$f['annos_amort']-=$contador;			
						$xperiodos=$f['annos_amort'];
						$idReg=$item['id'];
						$offset=$contador;
						$insert=FALSE;
						$modosql="UPDATE";
						break;								
						
					}else if($item['tipo']==4){
						$periodos=$item['variac_vida'];
						$f['val_adq']=$contable;	
						$offset=$contador;
						$f['annos_amort']=$item['variac_vida']-$contador++;			
						$idReg=$item['id'];
						$recalculacontable=TRUE;
						$insert=TRUE;
						$modosql="UPDATEINSERT";
						$sql="UPDATE smk_conciliacion SET annos_amort=$periodos WHERE id={$item['idActivo']}";
						mysql_query($sql);
						break;								
					}
				}
			}
			
			$cuota=$this->$metodo[$f['tipo_amort']]($f['val_adq'], $f['val_resid'], $xperiodos, $contador-$offset);
			$xcuota=$contador==-1 ? 0 : $cuota;	
			if($debugging==true) debug("cuota: $xcuota");
			if($recalculacontable==TRUE){$contable-=$xcuota;$recalculacontable==FALSE;}
			$acumulada=$acumulada + $cuota;
			$contable=$contable - $cuota;
			$periodonombre=$this->getPeriodName($f, $contador);
			
			if($modosql=="INSERT"){
				$sql="INSERT INTO smk_valores(idActivo, periodo, tipo, valor, periodonombre, comentarios, idAdjunto, acumulada, contable) VALUES({$f['id']}, $contador, 1, $xcuota, '$periodonombre', '$comentarios', NULL, $acumulada, $contable)";
			}else if($modosql=="UPDATE"){
				if($break!=true){
					$sql="UPDATE smk_valores SET valor=$xcuota, contable=$contable WHERE id={$idReg}";
				}else{
					$sql="UPDATE smk_valores SET valor=acumulada-$acumulada, contable=$contable WHERE id={$idReg}";
				}
			}else if($modosql=="UPDATEINSERT"){
				$sql="UPDATE smk_valores SET valor=$xcuota, contable=$contable, acumulada=$acumulada, comentarios='$comentarios' WHERE id={$idReg}";
				$modosql="INSERT";
			}
			
			$q=mysql_query($sql) or die($sql);
			if($break==true) break;
		}
	}
	
	public function getAmort0($force=FALSE){
		$f=$this->recordset;
		if(!$this->permitirAmort($f, $force)) return;
		$sql="SELECT * FROM smk_conciliacion WHERE id={$f['idActivo']}";
		$q=mysql_query($sql);
		$activo=mysql_fetch_assoc($q);
		
		if($f['tipo']==3){
			$acumulada=$f['contable'] + $f['acumulada'];
			$amortizacion=$f['contable'] + $f['valor'];
			$sql="UPDATE smk_valores SET valor=$amortizacion, acumulada=$acumulada, contable=0 WHERE id=".$f['id'];
			$q=mysql_query($sql);
			
			$fbaja=$f['periodonombre'];
			if(strlen($fbaja)==4){
				$fechabaja=$fbaja."-01-01";	
			}else if(strlen($fbaja)==7){
				$fechabaja=$fbaja."-01";	
			}
			$sql="UPDATE smk_conciliacion SET fecha_baja='$fechabaja', id_denominacion=(SELECT id FROM smk_denominaciones WHERE denominacion='Baja' OR forzar_baja=1 ORDER BY id LIMIT 0,1) WHERE id={$activo['id']}";
			$q=mysql_query($sql);
		}
		$this->recordset=$activo;
	}
	public function borradoAmort(){
		$f=$this->recordset; $o=$this->old_recordset;	
		if(isset($f['id'])){
				$sql="DELETE FROM smk_valores WHERE idActivo={$f['id']}";
				$q=mysql_query($sql) or die(mysql_error()."<br />$sql");
		}else{
			foreach($f as $ff){
				$sql="DELETE FROM smk_valores WHERE idActivo={$ff['id']}";
				$q=mysql_query($sql) or die(mysql_error()."<br />$sql");
			}
		}
	}
	private function getPeriodName($f, $period){
		if($f['mensual']!=1){
			$retonno=(int)$f['anno_capit']+$period;
		}else{
			if($f['mes_inicio']=="0") $f['mes_inicio']="01";
			$date=$f['anno_capit']."-".$f['mes_inicio']."-"."01";
			$str=strtotime("$date +$period months");
			$retonno=date("Y-m", $str);
		}
		return (string)$retonno;
	}
	private function permitirAmort($f, $force=FALSE){
		if($force==TRUE) return TRUE;
		$sql="SELECT COUNT(id) AS hijos FROM smk_conciliacion WHERE id_padre={$f['id']}";
		$q=mysql_query($sql);
		$ff=mysql_fetch_assoc($q);
		if($ff['hijos']>0 && $f['orden']==0){	
			return false;
		}
		return true;
	}
}
?>