Autor Tema: Chequear Digito Validador de Contenedores (Marítimos)  (Leído 3483 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado laymont

  • Novato
  • *
  • Mensajes: 33
  • Puntuación: 1
  • Sexo: Masculino
    • Ver Perfil
    • True Connections
Chequear Digito Validador de Contenedores (Marítimos)
« : 29 de junio de 2011, 01:01:33 am »
Muchachos de PHP Venezuela, tengo tiempo trabajando en un proyecto para llevar el control de contenedores (Marítimos) y ahora lo estoy orientando a Objetos. Quiero dejarles una clase que hice para validar el numero de chequeo de contenedores; esto en vista de que busque por mucho tiempo algo parecido sin conseguir una solución oportuna, sin mas preámbulos acá les dejo la clase espero les sea de utilidad. Acepto sugerencias

Código: [Seleccionar]
<?php
//=======================================================================
// Archivo: digitoChequeo_class.php
// Descripción: Clase para validar el digito de chequeo de los contenedores maritimos
// Created:  2011-06-29
// Ver: 1.0
//
// Autor:  Laymont Arratia. Email: laymontarratia@hotmail.com
// Copyright : Laymont Arratia.
//========================================================================
/*
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/
//========================================================
// Nota: Esta clase puede ser usada libremente, solo
// agradesco dejar este comentario como un agradecimiento
//========================================================

//===============================================================
// CLASS CHECKDigit
// Se debe indicar el numero de contenedor de 10 o 11 caracteres.
//===============================================================
class CHECKDigit{
public $Equipo;
public $Dueno;
public $Serial;
public $Chequear_Digito;
public $Resultado_Digito;

private function tablasChequeo(){
//Valores del Texto
$this->tablaValores = array(10 =>"A",12 =>"B",13 =>"C",14 =>"D",15 =>"E",16 =>"F",17 =>"G",18 =>"H",19 =>"I",20 =>"J",21 =>"K",23 =>"L",24 =>"M",25 =>"N",26 =>"O",27 =>"P",28 =>"Q",29 =>"R",30 =>"S",31 =>"T",32 =>"U",34 =>"V",35 =>"W",36 =>"X",37 =>"Y",38=>"Z");
//Factores de multiplicacion
$this->tablaFactor = array (1,2,4,8,16,32,64,128,256,512);
return;
}

public function dameNumero($contenedor){
$str trim($contenedor);
$this->Equipo strtoupper($str);
if(strlen($this->Equipo) > 11){
return die("El numero indicado supera la cantidad de caracteres permitidos (11)");
}else {
if(substr($this->Equipo,3,1) != "U"){
return die("La 4ta Sigla del numero indicado es invalida");
}else {
return $this->Equipo;
}
}
}

private function descomponeNumero(){
//Dueño
$this->Dueno substr($this->Equipo,0,3);
$this->Serial substr($this->Equipo,4,6);
//Separar caracteres
$this->Chart = array();
$this->Chart[0] = substr($this->Equipo,0,1);
$this->Chart[1] = substr($this->Equipo,1,1);
$this->Chart[2] = substr($this->Equipo,2,1);
$this->Chart[3] = substr($this->Equipo,3,1);
$this->Chart[4] = substr($this->Equipo,4,1);
$this->Chart[5] = substr($this->Equipo,5,1);
$this->Chart[6] = substr($this->Equipo,6,1);
$this->Chart[7] = substr($this->Equipo,7,1);
$this->Chart[8] = substr($this->Equipo,8,1);
$this->Chart[9] = substr($this->Equipo,9,1);
$this->Chart[10] = substr($this->Equipo,10,1);
//Digito a validar
$this->Chequear_Digito $this->Chart[10];
return;
}

private function asignaValores(){
$this->tablasChequeo();
$this->descomponeNumero();
//Valores numericos Dueño
$this->Valores = array();
for($i=0;$i<=count($this->Chart)-8;$i++){
$this->Valores[] = array_search($this->Chart[$i],$this->tablaValores);
}
//Valores del numero de contenedor
for($n=4;$n<=9;$n++){
$this->Valores[] = $this->Chart[$n];
}
//Multiplica valores por factor
$this->Resultado = array();
for($r=0;$r<=9;$r++){
$this->Resultado[]= $this->Valores[$r] * $this->tablaFactor[$r];
}
return $this->Resultado;
}

public function DigitoChequeo(){
$this->asignaValores();
$this->Digito array_sum($this->Resultado) % 11;
if($this->Digito == 10){
$this->Resultado_Digito 0;
}else {
$this->Resultado_Digito $this->Digito;
}
return $this->Resultado_Digito;
}

public function comparaValida(){
$this->descomponeNumero();
if ($this->Chequear_Digito == $this->Resultado_Digito){
echo "El digito Validador es Correcto";
}else {
echo "El digito Validador es Incorrecto (".$this->Chequear_Digito.") el Digito correcto es (".$this->Resultado_Digito.")";
}
}
}
?>


También les coloco un ejemplo de uso:
Código: [Seleccionar]
<?php
$Equipo 
"MSKU1234565";//Numero de contenedor a chequear
$aChequear = new CHECKDigit();
$aChequear->dameNumero($Equipo);
$aChequear->DigitoChequeo();
$aChequear->Resultado_Digito;
echo 
"<h1>Numero de contenedor a chequear: ".substr($aChequear->Equipo,0,10)."-".substr($aChequear->Equipo,-1)." < Digito Validador</h1>";
echo 
"<h1>Numero de contenedor a validado: ".$aChequear->Dueno."U-".$aChequear->Serial."-".$aChequear->Resultado_Digito." < Digito Resultado</h1>";
$aChequear->comparaValida();//Opcional si quiere el mensaje
?>


Si necesitan la documentación de la Norma ISO-6346; norma que rige el dígito de chequeo aca les dejo el vinculo http://en.wikipedia.org/wiki/ISO_6346
« Última Modificación: 29 de junio de 2011, 01:06:02 am por laymont »
Se alcanza el éxito convirtiendo cada paso en una meta y cada meta en un paso.

Desconectado ashrey

  • Moderador Global
  • Fanático
  • *****
  • Mensajes: 471
  • Puntuación: 7
  • Sexo: Masculino
  • Wombat Team
    • Ver Perfil
    • Blog de ABerroteran
Re:Chequear Digito Validador de Contenedores (Marítimos)
« Respuesta #1 : 29 de junio de 2011, 06:32:44 pm »
Viendola así por encima, un return die()no es algo que yo llame "orientando a objetos" deberías lanzar una excepción o algo por el estilo

Desconectado laymont

  • Novato
  • *
  • Mensajes: 33
  • Puntuación: 1
  • Sexo: Masculino
    • Ver Perfil
    • True Connections
Re:Chequear Digito Validador de Contenedores (Marítimos)
« Respuesta #2 : 29 de junio de 2011, 10:30:23 pm »
Son bienvenidas las sugerencias, soy nuevo con la POO. Esta es una de mis primeras clases y para ser mas sincero tengo cerca de una semana metido con lo de las clases
Se alcanza el éxito convirtiendo cada paso en una meta y cada meta en un paso.