Inicio > JavaScript, PHP > Laboratorio JavaScript PHP II [DAI4501]

Laboratorio JavaScript PHP II [DAI4501]

Segunda parte del laboratorio de DAI

Enunciado:

Continuando con el ejercicio del laboratorio anterior se pide que
usted modifique su aplicación, generando una versión 2.0, de forma
de considerar los siguientes nuevos requerimientos:
R01 – Agregar un ID a cada empleado, ID que NO PODRÁ repetirse
entre el grupo de empleados.
R02 – Cuando se registra un nuevo empleado deberá aparecer un
indicador del total de empleados que ya están registrados.
R03 – Manejar el departamento (nombre) al cual pertenece el
empleado
R04 – Obtener un informe, por departamento, con el total de
sueldos líquidos a pagar en cada departamento.
R05 – Obtener un informe, por departamento, que responda al
siguiente esquema:
——————————–
| EMPLEADOS |
——————————————————————
| DEPARTAMENTO |TOTAL EMPLEADOS | MAYOR SUELDO | MENOR SUELDO |
——————————————————————
| XXXXXXXXXXXXX | 999 | XXXXXXXXXXXX | XXXXXXXXXXXXX |
——————————————————————
TOTAL DEPARTAMENTOS

Resolución:

<?PHP
#
#	Empleado
#
class Empleado {
	var $nombre 	='';
	var $rut		='';
	var $sueldoBase	= 0;
	var $descuentos = null;
	var $departamento= null;
	public function __construct($rut,$nom,$sueldo,$dept) {
		if($dept != "-1") {
			$this->departamento = $dept;
		}
		if(strlen($rut) > 10 && strlen($rut) < 5)
			throw new Exception("El Rut del Empleado Esta Mal Ingresado");
		$this->rut = $rut;
		if(strlen($nom) < 1)
			throw new Exception("El Nombre del Empleado Debe tener mas de 1 caracter");
		$this->nombre = $nom;
		if($sueldo < 1)
			throw new Exception("El Sueldo del Empleado Debe ser mayor a 0");
		$this->sueldoBase = $sueldo;
		$this->descuentos = new Descuentos();
	}
	public function getSueldoLiquido() {
		#SUELDO_LIQUIDO = SUELDO_BASE – DESCUENTOS_LEGALES – DESCUENTOS_INTERNOS
		return ($this->sueldoBase - ((is_object($this->descuentos->descuentoLegal)) ? $this->descuentos->descuentoLegal->getDescuento($this->sueldoBase) : $this->descuentos->descuentoLegal) - ((is_object($this->descuentos->descuentoInterno)) ? $this->descuentos->descuentoInterno->getDescuento($this->sueldoBase) : $this->descuentos->descuentoInterno));
	}
}

class Descuentos {
	var $descuentoLegal = 0;
	var $descuentoInterno = 0;
}
class DescuentoLegal {
	var $afp 	= 0;
	var $salud	= 0;
	//var $seguro	=	0;
	public function __construct($afp=null,$salud=null) {
		$this->afp 		= $afp;
		$this->salud 	= $salud;
	}
	public function getDescuento($sueldo) {
		return (((is_object($this->afp)) ? $this->afp->getDescuento($sueldo) : $this->afp) + ((is_object( $this->salud)) ?  $this->salud->getDescuento($sueldo) :  $this->salud));
	}
}
class DescuentoInterno {
	var $sindicato 	= 0;
	var $cuotas		= 0;
	public function __construct($sin=null,$cuo=null) {
		$this->sindicato 		= $sin;
		$this->cuotas 			= $cuo;
	}
	public function getDescuento($sueldo) {
		if($this->sindicato != null) {
			return (($sueldo * $this->sindicato) / 100);
		} else if($this->cuotas != null) {
			return $this->cuotas;
		}
		return 0;
	}
}
class AFP {
	var $porcentaje	= 12.9;
	var $seguro		= 0;
	public function __construct($seguro=0) {
		$this->seguro = $seguro;
	}
	public function getDescuento($sueldo) {
		if($sueldo > 0) {
				return	(($sueldo * $this->porcentaje) /100) + $this->seguro;
		}
		return 0;
	}
}
#
#	Salud
#
class Isapre {
	var $valor_plan	= 0;
	var $valor_uf	= 0;
	public function __construct($vp=0,$vu=0) {
		$this->valor_plan 	= $vp;
		$this->valor_uf 	= $vu;
	}
	public function getDescuento($sueldo) {
		return ($this->valor_plan * $this->valor_uf);
	}
}
class Fonasa {
	var $porcentaje	= 7;
	public function getDescuento($sueldo) {
		if($sueldo > 0) {
				return	(($sueldo * $this->porcentaje) /100);
		}
		return 0;
	}
}



	$listaOrdenada = null;
	
	if (isset($_POST['listaDepartamentos'])){
		$listaDepartamentos = unserialize($_POST["listaDepartamentos"]);
	}
	else{
		$listaDepartamentos=array();
	}
	
	if (isset($_POST['listaEmpleados'])){
		$lista = unserialize($_POST["listaEmpleados"]);
	}
	else{
		$lista=array();
	}
	
	
	#
	#	Agregar Departamento
	#
	if(isset($_POST['addDepto'])) {
		try {
			$depto  = $_POST['n_dept_0'];
			if(strlen($depto) < 1)
				throw new Exception("El Nombre del Departamento debe ser mayor a 1 caracter");
			foreach($listaDepartamentos as $dept) {
				if($dept == $depto)
					throw new Exception("El Departamento Ya Existe");
			}
			$listaDepartamentos[] = $depto;	
		} catch(Exception $e) {
			echo 'ERROR: '. $e->getMessage();
		}
	}
	#
	#	Agregar Empleado
	#
	if(isset($_POST['enviar'])) {
		try {
			/*
				Datos Empleado
			*/
			$nombre = $_POST['nombre'];
			$rut 	= $_POST['rut'];
			$dv 	= $_POST['dv'];
			$sueldo = $_POST['sueldoBase'];
			$depto 	= $_POST['depto'];
			foreach($lista as $empleado) {
				if($empleado->rut == ($rut.'-'.$dv)) {
					throw new Exception("El Empleado Ya existe");
				}
			}
			$nuevo_empleado = new Empleado($rut.'-'.$dv,$nombre,$sueldo,$depto);
			/*
				Datos Descuentos Legales
			*/
			$nuevo_empleado->descuentos->descuentoLegal = new DescuentoLegal(null,null);
			$nuevo_empleado->descuentos->descuentoInterno = new DescuentoInterno(null,null);
			if(isset($_POST['chk_afp'])) {
				//12.9% del sueldo
				$nuevo_empleado->descuentos->descuentoLegal->afp = new AFP(0);
				if(isset($_POST['chk_seguro'])) {
					$valor_adicional	= $_POST['valor_seguro'];
					//12.9% del sueldo + $valor_adicional
					$nuevo_empleado->descuentos->descuentoLegal->afp->seguro = $valor_adicional;
				}
			} 

			$desc_salud	= $_POST['salud'];
			if($desc_salud == 1) {
				//Isapre
				$monto_uf 	= $_POST['monto_uf'];
				$valor_plan	= $_POST['valor_plan'];
				$nuevo_empleado->descuentos->descuentoLegal->salud = new Isapre($valor_plan,$monto_uf);
			} else if($desc_salud == 0) {
				//FONASA, Descuento del 7% del sueldo
				$nuevo_empleado->descuentos->descuentoLegal->salud = new Fonasa();
			}

			$desc_interno	= $_POST['group1'];
			if($desc_interno == "1") {
				$desc_internos	= $_POST['internos'];
				if($desc_internos == 0) {
					//Sindicato
					$perc_descuento = $_POST['per_desc'];
					echo $perc_descuento;
					$nuevo_empleado->descuentos->descuentoInterno->sindicato = $perc_descuento;
				} else if($desc_internos == 1) {
					//Cuotas
					$valor_cuota = $_POST['val_cuota'];
					$nuevo_empleado->descuentos->descuentoInterno->cuotas = $valor_cuota;
				}
			} else {
				//Sin descuentos internos
			}
			$lista[] = $nuevo_empleado;	
		} catch(Exception $e) {
			echo 'ERROR: '. $e->getMessage();
		}
	}
	if(isset($_POST['informeA'])) {
		$listaOrdenada = getEmpleadosByDepartamentos($listaDepartamentos,$lista);
	}

	function getEmpleadosByDepartamentos($listaDepartamentos,$lista) {
		foreach($listaDepartamentos as $departamento) {
			foreach($lista as $empleado) {
				
				if($departamento == $empleado->departamento) {
					$listaOrdenada[$departamento][$empleado->rut] = $empleado;
				}
			}
		}
		return $listaOrdenada;
	}
	function objSort(&$objArray,$sort_flags=0) {
		$indices = array();
		foreach($objArray as $obj) {
			$indeces[] = $obj->getSueldoLiquido();
		}
		return array_multisort($indeces,$objArray,$sort_flags);
	}
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Laboratorio JS-PHP Parte II</title>
        <style type="text/css">
		.error {
			background-color: #FFEBE8;
			border-color: #CC0000;
		}
		html {
			font-size:13px;
		}
		h1 {
			font-size:13px;
			font-weight:bold;
		}
		input {
			-moz-background-clip:border;
			-moz-background-inline-policy:continuous;
			-moz-background-origin:padding;
			background:#FBFBFB none repeat scroll 0 0;
			border:1px solid #E5E5E5;
			font-size:13px;
			margin-right:6px;
			padding:3px;
		}
		table.empleados {
			width: 580px;
			background-color: #fafafa;
			border: 1px #000000 solid;
			border-collapse: collapse;
			border-spacing: 0px;
		}
		table thead {
			background-color: #99CCCC;
			border: 1px #000000 solid;
			font-family: Verdana;
			font-weight: bold;
			font-size: 12px;
			color: #404040;
		}
		table td {
			border-bottom: 1px #6699CC dotted;
			text-align: left;
			font-family: Verdana, sans-serif, Arial;
			font-weight: normal;
			font-size: .7em;
			color: #404040;
			background-color: #fafafa;
			padding-top: 4px;
			padding-bottom: 4px;
			text-align: center;
		}
		</style>
		<script type="text/javascript">
			function showHide(obj) {
				if(document.getElementById(obj).style.display == 'none') { mostrar(obj); }
				else { ocultar(obj); }
			}
			function mostrar(obj) { document.getElementById(obj).style.display = 'block'; }
			function ocultar(obj) {
				document.getElementById(obj).style.display = 'none';
				document.getElementById(obj).value = '';
			}
			function crearElemento(prop) {
				elem = document.createElement(prop.elemento);
				for (var key in prop.atributos) { eval("elem."+key+" = '"+prop.atributos[key]+"';"); }
				return elem;
			}
			function isLegal(obj) {
				if(document.getElementById(obj).innerHTML.length == 0) {
					p = crearElemento({elemento: 'p',atributos: { innerHTML: '% de Descuento Adicional: '}});
					input = crearElemento({elemento: 'input',atributos: { type: 'text',name: 'valor_seguro',id: 'valor_seguro',size: 2, maxlength: 3 }});
					input.onkeypress = 	function(e) { return isNumberKey((window.event || e),'46'); };
					p.appendChild(input);
					document.getElementById(obj).appendChild(p);
				} else {
					document.getElementById(obj).innerHTML = '';
				}
			}
			function isIsapre(numero) {
				if(numero == 1) {
					p = crearElemento({elemento: 'p',atributos: { innerHTML: 'Monto de la UF: '}});
					input = crearElemento({elemento: 'input',atributos: { type: 'text',name: 'monto_uf',id: 'monto_uf'}});
					input.onkeypress = 	function(e) { return isNumberKey((window.event || e),null); };
					p.appendChild(input);
					document.getElementById('valor_isapre').appendChild(p);

					p = crearElemento({elemento: 'p',atributos: { innerHTML: 'Valor en UF del plan: '}});
					input = crearElemento({elemento: 'input',atributos: { type: 'text',name: 'valor_plan',id: 'valor_plan'}});
					input.onkeypress = 	function(e) { return isNumberKey((window.event || e),null) ; };
					p.appendChild(input);
					document.getElementById('valor_isapre').appendChild(p);
				} else {
					document.getElementById('valor_isapre').innerHTML = '';
				}
			}
			function isNumberKey(evt,chr) {
				var charCode = (evt.which) ? evt.which : event.keyCode;
				if(chr != null) { if(charCode == chr) return true; }
				if (charCode > 31 && (charCode < 48 || charCode > 57)) return false;
				return true;
			}
			function isDescuentoAdicional(numero) {
				document.getElementById('internos').innerHTML = '';
				if(numero == 1) {
					select = crearElemento({elemento: 'select',atributos: { name: 'internos',id: 'internos'}});
					option = crearElemento({elemento: 'option',atributos: { value: '-1',innerHTML: 'Selecciona el Descuento Adicional'}});
					select.appendChild(option);
					option = crearElemento({elemento: 'option',atributos: { value: '0',innerHTML: 'Sindicato'}});
					select.appendChild(option);
					option = crearElemento({elemento: 'option',atributos: { value: '1',innerHTML: 'Cuotas'}});
					select.appendChild(option);
					document.getElementById('internos').appendChild(select);
					div = crearElemento({elemento: 'div',atributos: { id: 'valoresAdicionales'}});
					document.getElementById('internos').appendChild(div);
					select.onchange = 	function(){
										document.getElementById('valoresAdicionales').innerHTML = '';
											switch(this.value) {
												case ('0' || 0) :
													p = crearElemento({elemento: 'p',atributos: { innerHTML: 'Porcentaje de Descuento: '}});
													input = crearElemento({elemento: 'input',atributos: { type: 'text',name: 'per_desc',id: 'per_desc'}});
													input.onkeypress = 	function(e) { return isNumberKey((window.event || e),'46'); };
													p.appendChild(input);
													document.getElementById('valoresAdicionales').appendChild(p);
													break;
												case ('1' || 1) :
													p = crearElemento({elemento: 'p',atributos: { innerHTML: 'Valor Cuota: $'}});
													input = crearElemento({elemento: 'input',atributos: { type: 'text',name: 'val_cuota',id: 'val_cuota'}});
													input.onkeypress = 	function(e) { return isNumberKey((window.event || e),null); };
													p.appendChild(input);
													document.getElementById('valoresAdicionales').appendChild(p);
													break;
											}
										};
				} else {
					document.getElementById('internos').innerHTML = '';
				}
			}
			function validarRut(numero,dv) {
				if(!isNaN(numero) || numero.length == 0 || numero.length > 8 )  {
					return false;
				} else {
					if(getDV(numero) == dv) return true;
				}
				return false;
			}
			function getDV(numero) {
				nuevo_numero = numero.toString().split("").reverse().join("");
				for(i=0,j=2,suma=0; i < nuevo_numero.length; i++, ((j==7) ? j=2 : j++)) {
					suma += (parseInt(nuevo_numero.charAt(i)) * j);
				}
				n_dv = 11 - (suma % 11);
				return ((n_dv == 11) ? 0 : ((n_dv == 10) ? "K" : n_dv));
			}
			function isVacio(q) {
				for ( i = 0; i < q.length; i++ ) {
					if (q.charAt(i) != " ") return false;
				}
				return true;
			}
			function isNumeric(valor) {
				return (isNaN(valor)) ? false : true;
			}
			function cleanClass(form) {
				for(i=0; i <form.length; i++) { form[i].className = ""; }
			}
			function validarTodo(form) {
				cleanClass(form);
				var malos = new Array();
				j=0;
				var inputs = form.getElementsByTagName("input");
				for(i=0; i < inputs.length; i++) {
					if(inputs[i].type == "text") { if(inputs[i].value.length == 0) { malos[j++] = inputs[i].id; } }
				}
				var selects = form.getElementsByTagName("select");
				for(i=0; i < selects.length; i++) {
					if(selects[i].value == "-1") { malos[j++] = selects[i].id; }
				}
				return ((malos.length > 0) ? malos : true);
			}
			function send(obj) {
				isValid = validarTodo(obj);
				if(isValid == true) {
					return true;
				} else {
					for(i=0; i < isValid.length; i++) { eval("obj."+isValid[i]+".className='error';"); }
				}
				return false;
			}
			function enableSeguro(obj) {
				if(obj.checked) {
					document.getElementById('chk_seguro').disabled = false;
				} else {
					//Deshabilita
					document.getElementById('chk_seguro').disabled = true;
					document.getElementById('chk_seguro').checked = false;
					document.getElementById('descuento_legal').innerHTML = '';
				}
			}
			/*function addDeptos(o) {
				nuevoDepto = prompt('Introduce el nombre del Departamento','[ nombre del departamento ]');
				option = option = crearElemento({elemento: 'option',atributos: { value: nuevoDepto,innerHTML: nuevoDepto}});
				document.getElementById('nuevoDepto').value = nuevoDepto;
			}*/

        </script>
    </head>
    <body>
		<div style="float: left; width: 300px;">
			
			<form id="formularioAgregarDepto" name="formularioAgregarDepto" method="POST">
				<?php
					# Guarda la lista en un campo 'oculto'
					echo "<input name='listaDepartamentos' type='hidden' value='" . serialize($listaDepartamentos) . "'/>";
					echo "<input name='listaEmpleados' type='hidden' value='" . serialize($lista) . "'/>";
				?>
				<div id="departamentos">
					<h1>Agrega Departamento</h1>
					<input id="n_dept_0" name='n_dept_0' type='text' />
					<input type="submit" id="addDepto" name="addDepto" value="+" />
				</div>
			</form>
			<br />
			<br />
			<h1>Ingresar Empleados</h1>
			<form id="formularioAgregar" method="POST" onsubmit="return send(this);">
				<?php
					# Guarda la lista en un campo 'oculto'
					echo "<input name='listaDepartamentos' type='hidden' value='" . serialize($listaDepartamentos) . "'/>";
					echo "<input name='listaEmpleados' type='hidden' value='" . serialize($lista) . "'/>";
				?>
				Rut: <input type="text" id="rut" name="rut" onkeypress="return isNumberKey(event,null);" maxlength="8" size="8" />-<input type="text" name="dv" id="dv" size="1" maxlength="1"/><br />
				Nombre: <input type="text" id="nombre" name="nombre" /><br />
				Sueldo Base: $<input type="text" id="sueldoBase" name="sueldoBase" onkeypress="return isNumberKey(event,null);" /><br />
				<h1>Descuentos Legales</h1>
				<input type="checkbox" id="chk_afp" name="chk_afp" onclick="enableSeguro(this);">AFP<br />
				<input type="checkbox" id="chk_seguro" name="chk_seguro" onclick="isLegal('descuento_legal');"  disabled/>Seguro
				<div id="descuento_legal"></div>
				<div id="descuento_salud">
					<h1>Descuentos de Salud</h1>
					<select id="salud" name="salud" onchange="isIsapre(this.value);">
						<option value="-1">Selecciona el Descuento de Salud</option>
						<option value="2">Sin Prevision</option>
						<option value="0">Fonasa</option>
						<option value="1">Isapre</option>
					</select>
					<br />
					<div id="valor_isapre"></div>
				</div>
				<div id="descuento_interno">
					<h1>Descuentos Internos</h1>
					<input type="radio" name="group1" value="1" onclick="isDescuentoAdicional(this.value);"> Si<br>
					<input type="radio" name="group1" value="0" onclick="isDescuentoAdicional(this.value);" checked> No<br>
					<div id="internos"></div>
				</div>
				<div id="departamentos">
					<h1>Departamento</h1>
					<select id="depto" name="depto">
						<option value="-1">Selecciona el Departamento</option>
						<?PHP
							foreach($listaDepartamentos as $departamento) {
								echo '<option value="'.$departamento.'">'.$departamento.'</option>';
							}
						?>	
					</select>
				</div>
				<input type="submit" id="enviar" name="enviar" value="Agregar" />
			</form>
			<form method="POST">
				<?php
					# Guarda la lista en un campo 'oculto'
					echo "<input name='listaDepartamentos' type='hidden' value='" . serialize($listaDepartamentos) . "'/>";
					echo "<input name='listaEmpleados' type='hidden' value='" . serialize($lista) . "'/>";
				?>
				<input type="submit" id="informeA" name="informeA" value="Informes" />
			</form>
		</div>
		<div id="contenido" style="float: left;">
			<h1>Total Empleados: <?PHP echo count($lista); ?></h1>
			<?PHP
			if(count($lista) > 0) {
				echo '<table class="empleados" cellspacing="0"><thead><tr><th>Rut</th><th>Nombre</th><th>Sueldo Base</th><th>Sueldo Liquido</th><th>Departamento</th></tr></thead><tbody>';
				for($i=count($lista)-1; $i >= 0; $i--) {
					echo '<tr><td>'.$lista[$i]->rut.'</td><td>'.$lista[$i]->nombre.'</td><td>'.$lista[$i]->sueldoBase.'</td><td>'.$lista[$i]->getSueldoLiquido().'</td><td>'.(($lista[$i]->departamento != null) ? $lista[$i]->departamento : "Sin Depto").'</td></tr>';
				}
				echo '</tbody></table>';
			}
			if(count($listaDepartamentos ) > 0 && count($listaOrdenada) > 0) {
				foreach($listaOrdenada as $k => $v) {
					$sueldos[$k] = '';
					foreach($v as $empleado) {
						$sueldos[$k] += $empleado->getSueldoLiquido();
					}
				}
				foreach($sueldos as $k => $sueldo) {
					echo 'Departamento: <b>'.$k.'</b> Sueldos a Pagar: <b>$'.$sueldo.'</b><br />';
				}
				
				echo '<table class="empleados" cellspacing="0"><thead><tr><th> </th><th> </th><th>Empleados: <b>'.count($lista).'</b></th><th> </th></tr></thead><tbody>';
				$empByDepto = array();
				echo '<tr><td>Departamento</td><td>Total Empleados</td><td>Mayor Sueldo</td><td>Menor Sueldo</td></tr>';
				foreach($listaOrdenada as $k => $v) {
					$sueldos[$k] = '';
					$empleados=array();
					foreach($v as $empleado) {
						$sueldos[$k] += $empleado->getSueldoLiquido();
						$empleados[] = $empleado;
					}
					objSort($empleados);
					echo '<tr><td>'.$k.'</td><td>'.count($empleados).'</td><td>'.$empleados[count($empleados)-1]->getSueldoLiquido().'</td><td>'.$empleados[0]->getSueldoLiquido().'</td></tr>';
				}
				echo '<tr><td>Total Departamentos: '.count($listaDepartamentos).'</td></tr>';
				echo '</tbody></table>';
			}
			?>
		</div>
		
		
    </body>
</html>

Saludos!.

  1. Aún no hay comentarios.
  1. octubre 2, 2009 a las 10:10 pm

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: