Skip to content

Commit

Permalink
Merge pull request #10 from celli33/main
Browse files Browse the repository at this point in the history
fix: para algunas csfs que traen localidad en lugar de colonia
  • Loading branch information
celli33 authored Jan 10, 2024
2 parents 2cac3fe + 8184139 commit 26f41a1
Show file tree
Hide file tree
Showing 16 changed files with 535 additions and 101 deletions.
10 changes: 5 additions & 5 deletions .phive/phars.xml
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<phive xmlns="https://phar.io/phive">
<phar name="phpstan" version="^1.10.19" installed="1.10.19" location="./tools/phpstan" copy="false"/>
<phar name="phpcs" version="^3.7.2" installed="3.7.2" location="./tools/phpcs" copy="false"/>
<phar name="phpcbf" version="^3.7.2" installed="3.7.2" location="./tools/phpcbf" copy="false"/>
<phar name="php-cs-fixer" version="^3.17.0" installed="3.17.0" location="./tools/php-cs-fixer" copy="false"/>
<phar name="composer-require-checker" version="^4.6.0" installed="4.6.0" location="./tools/composer-require-checker" copy="false"/>
<phar name="phpstan" version="^1.10.55" installed="1.10.55" location="./tools/phpstan" copy="false"/>
<phar name="phpcs" version="^3.7.2" installed="3.8.0" location="./tools/phpcs" copy="false"/>
<phar name="phpcbf" version="^3.7.2" installed="3.8.0" location="./tools/phpcbf" copy="false"/>
<phar name="php-cs-fixer" version="^3.46.0" installed="3.46.0" location="./tools/php-cs-fixer" copy="false"/>
<phar name="composer-require-checker" version="^4.6.0" installed="4.8.0" location="./tools/composer-require-checker" copy="false"/>
</phive>
2 changes: 1 addition & 1 deletion .php-cs-fixer.dist.php
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
'whitespace_after_comma_in_array' => true,
'no_empty_statement' => true,
'no_extra_blank_lines' => true,
'function_typehint_space' => true,
'type_declaration_spaces' => true,
'trailing_comma_in_multiline' => ['after_heredoc' => true, 'elements' => ['arrays']],
'no_blank_lines_after_phpdoc' => true,
'object_operator_without_whitespace' => true,
Expand Down
2 changes: 1 addition & 1 deletion CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ Considera las siguientes directrices:
* No mezcles dos diferentes funcionalidades en una misma rama o *Pull Request*.
* Describe claramente y en detalle los cambios que hiciste.
* **Escribe pruebas** para la funcionalidad que deseas agregar.
* Asegúrate que **las pruebas pasan** antes de enviar tu contribución.
* Asegúrate que **las pruebas pasan** antes de enviar tu contribución.
Usamos integración continua donde se hace esta verificación, pero es mucho mejor si lo pruebas localmente.
* Intenta enviar una historia coherente, entenderemos cómo cambia el código si los *commits* tienen significado.
* La documentación es parte del proyecto.
Expand Down
2 changes: 1 addition & 1 deletion LICENCE
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
The MIT License (MIT)

Copyright (c) 2022 - 2023 PhpCfdi https://www.phpcfdi.com/
Copyright (c) 2022 - 2024 PhpCfdi https://www.phpcfdi.com/

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ $rfc = Rfc::parse('YOUR_RFC');
$person = $scraper->obtainFromRfcAndCif(rfc: $rfc, idCIF: 'ID_CIF');

// También puedes obtener los datos de la persona directamente del archivo local PDF
// (Ten en cuenta que esta funcionalidad requiere de tener instalado popper-utils en tu servidor).
// (Ten en cuenta que esta funcionalidad requiere de tener instalado poppler-utils en tu servidor).
$person = $scraper->obtainFromPdfPath('LOCAl_PDF_FILE_PATH');

// puedes acceder a los datos de la persona (moral o física) usando los métodos incluidos:
Expand Down
8 changes: 8 additions & 0 deletions docs/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,14 @@ versión, aunque sí su incorporación en la rama principal de trabajo, generalm

## Listado de cambios

### Versión 0.1.7 2024-01-10

- Se arregla el problema para CSF que traen localidad en lugar de colonia. Agradecimientos a @luffynando, @blacktrue y @eclipxe13 por sus aportes.
- Se actualiza la licencia. Feliz año 2024.
- Se arreglan algunos typos en el README.md
- Se actualizan las herramientas de desarrollo.
- Se consigue el 100% de cobertura de código.

### Versión 0.1.6 2023-06-17

- Se agrega el método `Scraper::getClient()` para obtener el cliente con el que fue construido el objeto.
Expand Down
32 changes: 20 additions & 12 deletions src/DataExtractor.php
Original file line number Diff line number Diff line change
Expand Up @@ -28,26 +28,34 @@ public function extract(bool $isFisica): PersonaMoral|PersonaFisica
if (1 === $errorElement->count()) {
throw new CifNotFoundException('Failed to found CIF info.');
}
$elements = $crawler->filter('td[role="gridcell"]');

$elements->each(function (Crawler $elem, int $index) use ($person): void {
if ($index >= 40) {
return;
}
if (0 === $elem->filter('span')->count()) {
$property = $person->getKeyNameByIndex($index);
if (null !== $property) {
$person->{$property} = trim($elem->text());
}
}
});
$titles = $person->getTdTitlesTextToSearch();
foreach ($titles as $property => $text) {
$person->{$property} = $this->getValueByTdTitleText($crawler, $text);
}
$regimenes = $this->getRegimenes($crawler);
if ([] !== $regimenes) {
$person->addRegimenes(...$regimenes);
}

return $person;
}

private function getValueByTdTitleText(Crawler $crawler, string $valueToSearch): string
{
$element = $crawler->filterXPath("//td[@role='gridcell']/span[contains(normalize-space(.), '{$valueToSearch}')]");
$node = $element->getNode(0);
if (null === $node) {
return '';
}
return trim(str_replace($valueToSearch, ' ', $this->normalizeWhiteSpaces($node->parentNode?->parentNode?->textContent ?? '')));

Check failure on line 51 in src/DataExtractor.php

View workflow job for this annotation

GitHub Actions / Code analysis (phpstan)

Using nullsafe property access "?->textContent" on left side of ?? is unnecessary. Use -> instead.
}

private function normalizeWhiteSpaces(string $str): string
{
return (string) preg_replace('/\s+/', ' ', trim($str));
}

private function clearHtml(string $html): string
{
return str_replace('<?xml version="1.0" encoding="UTF-8" ?>', '', $html);
Expand Down
8 changes: 7 additions & 1 deletion src/Persona.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
use DateTimeImmutable;
use JsonSerializable;

class Persona implements JsonSerializable
abstract class Persona implements JsonSerializable
{
private ?DateTimeImmutable $fechaInicioOperaciones = null;

Expand Down Expand Up @@ -211,6 +211,12 @@ public function addRegimenes(Regimen ...$regimenes): void
$this->regimenes->addRegimen(...$regimenes);
}

/**
* The values must be a simple text to search using xpath as in contains(normalize-space(.), {value})'
* @return array<string, string>
*/
abstract public function getTdTitlesTextToSearch(): array;

public function __set(string $name, mixed $value): void
{
$method = "set$name";
Expand Down
48 changes: 26 additions & 22 deletions src/PersonaFisica.php
Original file line number Diff line number Diff line change
Expand Up @@ -69,29 +69,33 @@ public function setFechaNacimiento(string $fechaNacimiento): void
$this->fechaNacimiento = false !== $date ? $date : null;
}

public function getKeyNameByIndex(int $index): ?string
/**
*
* @return array<string, string>
*/
public function getTdTitlesTextToSearch(): array
{
return match ($index) {
2 => 'Curp',
4 => 'Nombre',
6 => 'ApellidoPaterno',
8 => 'ApellidoMaterno',
10 => 'FechaNacimiento',
12 => 'FechaInicioOperaciones',
14 => 'SituacionContribuyente',
16 => 'FechaUltimoCambioSituacion',
21 => 'EntidadFederativa',
23 => 'MunicipioDelegacion',
25 => 'Colonia',
27 => 'TipoVialidad',
29 => 'NombreVialidad',
31 => 'NumeroExterior',
33 => 'NumeroInterior',
35 => 'CodigoPostal',
37 => 'CorreoElectronico',
39 => 'Al',
default => null
};
return [
'Curp' => 'CURP:',
'Nombre' => 'Nombre:',
'ApellidoPaterno' => 'Apellido Paterno:',
'ApellidoMaterno' => 'Apellido Materno:',
'FechaNacimiento' => 'Fecha Nacimiento:',
'FechaInicioOperaciones' => 'Fecha de Inicio de operaciones:',
'SituacionContribuyente' => 'Situación del contribuyente:',
'FechaUltimoCambioSituacion' => 'Fecha del último cambio de situación:',
'EntidadFederativa' => 'Entidad Federativa:',
'MunicipioDelegacion' => 'Municipio o delegación:',
'Colonia' => 'Colonia:',
'Localidad' => 'Localidad:',
'TipoVialidad' => 'Tipo de vialidad:',
'NombreVialidad' => 'Nombre de la vialidad:',
'NumeroExterior' => 'Número exterior:',
'NumeroInterior' => 'Número interior:',
'CodigoPostal' => 'CP:',
'CorreoElectronico' => 'Correo electrónico:',
'Al' => 'AL:',
];
}

public function toArray(): array
Expand Down
44 changes: 24 additions & 20 deletions src/PersonaMoral.php
Original file line number Diff line number Diff line change
Expand Up @@ -45,27 +45,31 @@ public function setFechaConstitucion(string $fechaConstitucion): void
$this->fechaConstitucion = false !== $date ? $date : null;
}

public function getKeyNameByIndex(int $index): ?string
/**
*
* @return array<string, string>
*/
public function getTdTitlesTextToSearch(): array
{
return match ($index) {
2 => 'RazonSocial',
4 => 'RegimenDeCapital',
6 => 'FechaConstitucion',
8 => 'FechaInicioOperaciones',
10 => 'SituacionContribuyente',
12 => 'FechaUltimoCambioSituacion',
17 => 'EntidadFederativa',
19 => 'MunicipioDelegacion',
21 => 'Colonia',
23 => 'TipoVialidad',
25 => 'NombreVialidad',
27 => 'NumeroExterior',
29 => 'NumeroInterior',
31 => 'CodigoPostal',
33 => 'CorreoElectronico',
35 => 'Al',
default => null
};
return [
'RazonSocial' => 'Denominación o Razón Social:',
'RegimenDeCapital' => 'Régimen de capital:',
'FechaConstitucion' => 'Fecha de constitución:',
'FechaInicioOperaciones' => 'Fecha de Inicio de operaciones:',
'SituacionContribuyente' => 'Situación del contribuyente:',
'FechaUltimoCambioSituacion' => 'Fecha del último cambio de situación:',
'EntidadFederativa' => 'Entidad Federativa:',
'MunicipioDelegacion' => 'Municipio o delegación:',
'Colonia' => 'Colonia:',
'Localidad' => 'Localidad:',
'TipoVialidad' => 'Tipo de vialidad:',
'NombreVialidad' => 'Nombre de la vialidad:',
'NumeroExterior' => 'Número exterior:',
'NumeroInterior' => 'Número interior:',
'CodigoPostal' => 'CP:',
'CorreoElectronico' => 'Correo electrónico:',
'Al' => 'AL:',
];
}

public function toArray(): array
Expand Down
53 changes: 50 additions & 3 deletions tests/Integration/ScrapCsfFromRfcAndCifTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,9 @@ public function test_scrap_from_idcif_and_rfc_by_moral(): void
'regimen_id' => '601',
],
],
'extra_data' => [],
'extra_data' => [
'Localidad' => '',
],
];

$data = $csfScrap->obtainFromRfcAndCif(Rfc::parse($rfc), $idcif)->toArray();
Expand Down Expand Up @@ -104,7 +106,9 @@ public function test_scrap_from_idcif_and_rfc_by_fisica(): void
'regimen_id' => '621',
],
],
'extra_data' => [],
'extra_data' => [
'Localidad' => '',
],
];

$data = $csfScrap->obtainFromRfcAndCif(Rfc::parse($rfc), $idcif)->toArray();
Expand Down Expand Up @@ -150,7 +154,50 @@ public function test_scrap_from_idcif_and_rfc_multiple_regimen(): void
'regimen_id' => '626',
],
],
'extra_data' => [],
'extra_data' => [
'Localidad' => '',
],
];

$data = $csfScrap->obtainFromRfcAndCif(Rfc::parse($rfc), $idcif)->toArray();

$this->assertEquals($expectedData, $data);
}

public function test_scrap_from_idcif_and_rfc_localidad_instead_of_colonia(): void
{
$csfScrap = $this->prepareScraper('scrap_moral_without_colonia.html');
$rfc = 'DIM8701081LA';
$idcif = '1904014102123';
$expectedData = [
'rfc' => 'DIM8701081LA',
'id_cif' => '1904014102123',
'razon_social' => 'MI RAZON',
'regimen_de_capital' => 'SA DE CV',
'fecha_constitucion' => DateTimeImmutable::createFromFormat('!d-m-Y', '29-12-1997'),
'fecha_inicio_operaciones' => DateTimeImmutable::createFromFormat('!d-m-Y', '16-01-1999'),
'situacion_contribuyente' => 'ACTIVO',
'fecha_ultimo_cambio_situacion' => DateTimeImmutable::createFromFormat('!d-m-Y', '16-01-1999'),
'entidad_federativa' => 'CHIAPAS',
'municipio_delegacion' => 'Mi Municipio',
'colonia' => '',
'tipo_vialidad' => 'CALLE',
'nombre_vialidad' => 'CONOCIDO',
'numero_exterior' => 'SIN NUMERO',
'numero_interior' => 'SIN NUMERO',
'codigo_postal' => '72030',
'correo_electronico' => 'email@example.com',
'al' => 'CHIAPAS 1',
'regimenes' => [
[
'regimen' => 'Régimen General de Ley Personas Morales',
'fecha_alta' => DateTimeImmutable::createFromFormat('!d-m-Y', '31-03-2001'),
'regimen_id' => '601',
],
],
'extra_data' => [
'Localidad' => '30210010',
],
];

$data = $csfScrap->obtainFromRfcAndCif(Rfc::parse($rfc), $idcif)->toArray();
Expand Down
4 changes: 3 additions & 1 deletion tests/Integration/ScrapFromCsfFileTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,9 @@ public function test_scrap_from_idcif_and_rfc_by_moral(): void
'fecha_alta' => DateTimeImmutable::createFromFormat('!d-m-Y', '21-02-2019'),
],
],
'extra_data' => [],
'extra_data' => [
'Localidad' => '',
],
];

$data = $csfScrap->obtainFromPdfPath('my-path')->toArray();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,20 +5,20 @@
namespace PhpCfdi\CsfScraper\Tests\Unit\Persona;

use DateTimeImmutable;
use PhpCfdi\CsfScraper\Persona;
use PhpCfdi\CsfScraper\PersonaMoral;
use PhpCfdi\CsfScraper\Tests\TestCase;
use PhpCfdi\CsfScraper\Tests\Unit\Persona\Traits\PersonaTrait;

class PersonaPropertiesTest extends TestCase
class CommonPersonaPropertiesTest extends TestCase
{
use PersonaTrait;

private Persona $person;
private PersonaMoral $person;

public function setUp(): void
{
parent::setUp();
$this->person = new Persona();
$this->person = new PersonaMoral();
}

/**
Expand Down
29 changes: 0 additions & 29 deletions tests/Unit/Persona/PersonaJsonSerializeTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,41 +4,12 @@

namespace PhpCfdi\CsfScraper\Tests\Unit\Persona;

use PhpCfdi\CsfScraper\Persona;
use PhpCfdi\CsfScraper\PersonaFisica;
use PhpCfdi\CsfScraper\PersonaMoral;
use PhpCfdi\CsfScraper\Tests\TestCase;

class PersonaJsonSerializeTest extends TestCase
{
public function test_serialize_default_person(): void
{
$person = new Persona();

/** @var string $json */
$json = json_encode($person);

$this->assertSame([
'rfc' => '',
'id_cif' => '',
'fecha_inicio_operaciones' => null,
'situacion_contribuyente' => '',
'fecha_ultimo_cambio_situacion' => null,
'entidad_federativa' => '',
'municipio_delegacion' => '',
'colonia' => '',
'tipo_vialidad' => '',
'nombre_vialidad' => '',
'numero_exterior' => '',
'numero_interior' => '',
'codigo_postal' => '',
'correo_electronico' => '',
'al' => '',
'regimenes' => [],
'extra_data' => [],
], json_decode($json, associative: true));
}

public function test_serialize_default_person_moral(): void
{
$person = new PersonaMoral();
Expand Down
Loading

0 comments on commit 26f41a1

Please sign in to comment.