'Ingeniería', 'ARC' => 'Arquitectura', 'CIV' => 'Civil', 'MEC' => 'Mecánica', 'ELC' => 'Eléctrica', 'INS' => 'Instrumentación', 'PIP' => 'Piping', 'STR' => 'Estructural' ]; private $tiposDocumentoValidos = [ 'DRW' => 'Dibujo', 'ESP' => 'Especificación', 'LST' => 'Lista de materiales', 'PRO' => 'Procedimiento', 'INF' => 'Informe', 'MAN' => 'Manual', 'CAL' => 'Cálculo', 'REP' => 'Reporte' ]; public function analizarDocumento($codigoCompleto) { // Validar formato básico if (strpos($codigoCompleto, ' - ') === false) { return $this->crearResultadoError("Formato inválido: falta separador ' - '"); } list($codigo, $nombre) = explode(' - ', $codigoCompleto, 2); $segmentos = explode('-', $codigo); // Validar número de segmentos if (count($segmentos) != 5) { return $this->crearResultadoError("Número incorrecto de segmentos"); } // Extraer y validar cada parte $codigoProyecto = $segmentos[0]; $codigoMaker = $segmentos[1]; $disciplina = $segmentos[2]; $tipoDocumento = $segmentos[3]; $revisionCompleta = $segmentos[4]; // Validar formato de revisión if (strpos($revisionCompleta, 'REV.') !== 0) { return $this->crearResultadoError("Formato de revisión inválido"); } $numeroRevision = substr($revisionCompleta, 4); // Remover "REV." // Validar número de revisión if (!ctype_digit($numeroRevision) || strlen($numeroRevision) != 2) { return $this->crearResultadoError("Número de revisión inválido"); } // Validar disciplinas y tipos $disciplinaValida = $this->validarDisciplina($disciplina); $tipoValido = $this->validarTipoDocumento($tipoDocumento); return [ 'codigo_completo' => $codigoCompleto, 'codigo_proyecto' => $codigoProyecto, 'codigo_maker' => $codigoMaker, 'disciplina' => $disciplina, 'disciplina_desc' => $disciplinaValida, 'tipo_documento' => $tipoDocumento, 'tipo_documento_desc' => $tipoValido, 'revision' => $numeroRevision, 'nombre_documento' => $nombre, 'estructura_valida' => true, 'errores' => [] ]; } private function validarDisciplina($codigo) { return isset($this->disciplinasValidas[$codigo]) ? $this->disciplinasValidas[$codigo] : "Desconocida"; } private function validarTipoDocumento($codigo) { return isset($this->tiposDocumentoValidos[$codigo]) ? $this->tiposDocumentoValidos[$codigo] : "Desconocido"; } private function crearResultadoError($mensaje) { return [ 'estructura_valida' => false, 'errores' => [$mensaje] ]; } // Método para generar un nuevo código public function generarCodigo($proyecto, $maker, $disciplina, $tipo, $revision, $nombre = '') { $revisionFormateada = str_pad($revision, 2, '0', STR_PAD_LEFT); $codigo = "{$proyecto}-{$maker}-{$disciplina}-{$tipo}-REV.{$revisionFormateada}"; if (!empty($nombre)) { $codigo .= " - {$nombre}"; } return $codigo; } } // EJEMPLOS DE USO /* $analizador = new DocumentIdentifier(); // Analizar un código existente $codigo1 = "MP00002-SOGOS-ENG-DRW-REV.01 - Plano principal"; $resultado1 = $analizador->analizarDocumento($codigo1); echo "Análisis del documento:\n"; print_r($resultado1); // Generar un nuevo código $nuevoCodigo = $analizador->generarCodigo( 'MP00002', 'SOGOS', 'CIV', 'ESP', '03', 'Especificación técnica de cimientos' ); echo "\nNuevo código generado: " . $nuevoCodigo . "\n";*/ ?>