Skip to content

Commit

Permalink
Merge pull request #8 from g4g0/ccp
Browse files Browse the repository at this point in the history
Carta Porte v20 Catalogs, thanks @G4g0
  • Loading branch information
eclipxe13 authored Mar 7, 2022
2 parents e5cdcfa + 91c4320 commit 8113ff5
Show file tree
Hide file tree
Showing 86 changed files with 6,112 additions and 78 deletions.
7 changes: 7 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,13 @@ php bin/sat-catalogos-update update-database catalogs/ catalogs/catalogos.sqlite

Read the file [*Catálogos SAT*](docs/Catalogos.md) for more information about the catalogs included (in spanish).

- Catálogos de CFDI 3.3.
- Catálogos de CFDI 4.0.
- Catálogos de Complemento de Comercio Exterior 1.1.
- Catálogos de Complemento de Nóminas 1.2.
- Catálogos de Complemento de Carta Porte 2.0.
- Catálogos de Complemento de Recepción de Pagos 1.0.

## PHP Support

This tool is compatible with last [PHP supported version](https://www.php.net/supported-versions.php).
Expand Down
10 changes: 10 additions & 0 deletions docs/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,15 @@
# phpcfdi/sat-catalogos-populate Changelog

## Version 2.4.0 2022-03-07

Add CCP (*Complemento de Carta Porte*) 2.0 catalogs.

- Add *Origin* as a constant source, saving the file as `CatalogosCartaPorte20.xls`.
- Add *Source importer* from `CatalogosCartaPorte20.xls`. It includes 25 catalogs.
- Importers create tables with prefix `ccp_20_*`.
- Update `docs/Catalogos.md` with CCP 2.0 catalogs.
- Refactor export XLST to CSV, rename all exported files to remove spaces from name.

## Version 2.3.0 2022-03-05

Add CFDI 4.0 catalogs.
Expand Down
188 changes: 114 additions & 74 deletions docs/Catalogos.md

Large diffs are not rendered by default.

4 changes: 4 additions & 0 deletions docs/Pruebas.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ estos archivos y correr los tests. De esta forma podremos notar un cambio import
- `tests/_files/cfdi40/*.csv`: Archivos que salen de los catálogos de CFDI 4.0
- `tests/_files/nomina/*.csv`: Archivos que salen de los catálogos de Nómina 1.2
- `tests/_files/rep/*.csv`: Archivos que salen de los catálogos de recibo electrónico de pagos
- `tests/_files/ccp20/*.csv`: Archivos que salen de los catálogos de carta porte 2.0

## Actualizar los archivos de pruebas

Expand All @@ -47,13 +48,15 @@ rm -rf tests/_files/cfdi40
rm -rf tests/_files/nomina
rm -rf tests/_files/rep
rm -rf tests/_files/cce
rm -rf tests/_files/ccp20

mkdir -p tests/_files/sources
mkdir -p tests/_files/cfdi
mkdir -p tests/_files/cfdi40
mkdir -p tests/_files/nomina
mkdir -p tests/_files/rep
mkdir -p tests/_files/cce
mkdir -p tests/_files/ccp20

cp build/temp/*.xls tests/_files/sources

Expand All @@ -71,6 +74,7 @@ php tests/convert-xls-to-csv-folder.php tests/_files/sources/c_MotivoTraslado.xl
php tests/convert-xls-to-csv-folder.php tests/_files/sources/c_Municipio.xls tests/_files/cce
php tests/convert-xls-to-csv-folder.php tests/_files/sources/c_TipoOperacion.xls tests/_files/cce
php tests/convert-xls-to-csv-folder.php tests/_files/sources/c_UnidadAduana.xls tests/_files/cce
php tests/convert-xls-to-csv-folder.php tests/_files/sources/CatalogosCartaPorte20.xls tests/_files/ccp20
```

Ten en cuenta que estas operaciones generarán archivos que antes no existían porque el catálogo en
Expand Down
5 changes: 3 additions & 2 deletions src/Commands/DumpOrigins.php
Original file line number Diff line number Diff line change
Expand Up @@ -17,13 +17,13 @@ public function run(): int
$common = 'http://omawww.sat.gob.mx/tramitesyservicios/Paginas/documentos';
$origins = new Origins([
new ScrapingOrigin(
'CFDI',
'CFDI 3.3',
'http://omawww.sat.gob.mx/tramitesyservicios/Paginas/anexo_20_version3-3.htm',
'catCFDI.xls',
'Catálogos CFDI Versión 3.3*',
),
new ScrapingOrigin(
'CFDI',
'CFDI 4.0',
'http://omawww.sat.gob.mx/tramitesyservicios/Paginas/anexo_20_version3-3.htm',
'cfdi_40.xls',
'Catálogos CFDI Versión 4.0*',
Expand All @@ -47,6 +47,7 @@ public function run(): int
new ConstantOrigin('CCE - Tipos de operaciones', "{$common}/c_TipoOperacion.xls"),
new ConstantOrigin('CCE - Unidades de medida', "{$common}/c_UnidadAduana.xls"),
new ConstantOrigin('REP', "{$common}/catPagos.xls"),
new ConstantOrigin('CCP 2.0 - Carta Porte', "{$common}/CatalogosCartaPorte20.xls"),
]);

echo (new OriginsIO())->originsToString($origins) . PHP_EOL;
Expand Down
11 changes: 10 additions & 1 deletion src/Converters/XlsxToCsvFolderConverter.php
Original file line number Diff line number Diff line change
Expand Up @@ -50,8 +50,17 @@ public function convert(string $source, string $destination): void
$execution = ShellExec::run($command);
if (0 !== $execution->exitStatus()) {
throw new RuntimeException(
"Execution of xlsx2csv convertion return a non zero status code [{$execution->exitStatus()}]"
"Execution of xlsx2csv conversion return a non zero status code [{$execution->exitStatus()}]"
);
}

// remove spaces on exported file name
$csvFiles = glob($destination . '/*.csv') ?: [];
foreach ($csvFiles as $csvFile) {
$renamed = $destination . '/' . preg_replace('/\s*(.*?)\s*\.csv+/', '$1.csv', basename($csvFile));
if (! file_exists($renamed) && $csvFile !== $renamed) {
rename($csvFile, $renamed);
}
}
}
}
41 changes: 41 additions & 0 deletions src/Importers/Ccp20/Injectors/AutorizacionesNaviero.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
<?php

declare(strict_types=1);

namespace PhpCfdi\SatCatalogosPopulate\Importers\Ccp20\Injectors;

use PhpCfdi\SatCatalogosPopulate\AbstractCsvInjector;
use PhpCfdi\SatCatalogosPopulate\Database\DataFields;
use PhpCfdi\SatCatalogosPopulate\Database\DataTable;
use PhpCfdi\SatCatalogosPopulate\Database\DateDataField;
use PhpCfdi\SatCatalogosPopulate\Database\TextDataField;
use PhpCfdi\SatCatalogosPopulate\Utils\CsvFile;
use RuntimeException;

class AutorizacionesNaviero extends AbstractCsvInjector
{
public function checkHeaders(CsvFile $csv): void
{
$csv->move(3);
$expected = [
'Número de autorización',
'Inicio de vigencia',
'Fin de vigencia',
];
$headers = $csv->readLine();
if ($expected !== $headers) {
throw new RuntimeException("The headers did not match on file {$this->sourceFile()}");
}

$csv->next();
}

public function dataTable(): DataTable
{
return new DataTable('ccp_20_autorizaciones_naviero', new DataFields([
new TextDataField('id'),
new DateDataField('vigencia_desde'),
new DateDataField('vigencia_hasta'),
]));
}
}
52 changes: 52 additions & 0 deletions src/Importers/Ccp20/Injectors/ClavesUnidades.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
<?php

declare(strict_types=1);

namespace PhpCfdi\SatCatalogosPopulate\Importers\Ccp20\Injectors;

use PhpCfdi\SatCatalogosPopulate\AbstractCsvInjector;
use PhpCfdi\SatCatalogosPopulate\Database\DataFields;
use PhpCfdi\SatCatalogosPopulate\Database\DataTable;
use PhpCfdi\SatCatalogosPopulate\Database\DateDataField;
use PhpCfdi\SatCatalogosPopulate\Database\TextDataField;
use PhpCfdi\SatCatalogosPopulate\Utils\CsvFile;
use RuntimeException;

class ClavesUnidades extends AbstractCsvInjector
{
public function checkHeaders(CsvFile $csv): void
{
$csv->move(3);
$expected = [
'Clave unidad',
'Nombre',
'Descripción',
'Nota',
'Fecha de inicio de vigencia',
'Fecha de fin de vigencia',
'Símbolo',
'Bandera',
];
$headers = $csv->readLine();

if ($expected !== $headers) {
throw new RuntimeException("The headers did not match on file {$this->sourceFile()}");
}

$csv->next();
}

public function dataTable(): DataTable
{
return new DataTable('ccp_20_claves_unidades', new DataFields([
new TextDataField('id'),
new TextDataField('texto'),
new TextDataField('descripcion'),
new TextDataField('nota'),
new DateDataField('vigencia_desde'),
new DateDataField('vigencia_hasta'),
new TextDataField('simbolo'),
new TextDataField('bandera'),
]));
}
}
48 changes: 48 additions & 0 deletions src/Importers/Ccp20/Injectors/CodigosTransporteAereo.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
<?php

declare(strict_types=1);

namespace PhpCfdi\SatCatalogosPopulate\Importers\Ccp20\Injectors;

use PhpCfdi\SatCatalogosPopulate\AbstractCsvInjector;
use PhpCfdi\SatCatalogosPopulate\Database\DataFields;
use PhpCfdi\SatCatalogosPopulate\Database\DataTable;
use PhpCfdi\SatCatalogosPopulate\Database\DateDataField;
use PhpCfdi\SatCatalogosPopulate\Database\TextDataField;
use PhpCfdi\SatCatalogosPopulate\Utils\CsvFile;
use RuntimeException;

class CodigosTransporteAereo extends AbstractCsvInjector
{
public function checkHeaders(CsvFile $csv): void
{
$csv->move(3);
$expected = [
'Clave identificación',
'Nacionalidad',
'Nombre de la aerolínea',
'Designador OACI',
'Fecha de inicio de vigencia',
'Fecha de fin de vigencia',
];
$headers = $csv->readLine();

if ($expected !== $headers) {
throw new RuntimeException("The headers did not match on file {$this->sourceFile()}");
}

$csv->next();
}

public function dataTable(): DataTable
{
return new DataTable('ccp_20_codigos_transporte_aereo', new DataFields([
new TextDataField('id'),
new TextDataField('nacionalidad'),
new TextDataField('texto'),
new TextDataField('designador_oaci'),
new DateDataField('vigencia_desde'),
new DateDataField('vigencia_hasta'),
]));
}
}
38 changes: 38 additions & 0 deletions src/Importers/Ccp20/Injectors/Colonias.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
<?php

declare(strict_types=1);

namespace PhpCfdi\SatCatalogosPopulate\Importers\Ccp20\Injectors;

use PhpCfdi\SatCatalogosPopulate\AbstractCsvInjector;
use PhpCfdi\SatCatalogosPopulate\Database\DataFields;
use PhpCfdi\SatCatalogosPopulate\Database\DataTable;
use PhpCfdi\SatCatalogosPopulate\Database\PaddingDataField;
use PhpCfdi\SatCatalogosPopulate\Database\TextDataField;
use PhpCfdi\SatCatalogosPopulate\Utils\CsvFile;
use RuntimeException;

class Colonias extends AbstractCsvInjector
{
public function checkHeaders(CsvFile $csv): void
{
$csv->move(3);
$expected = ['c_Colonia', 'c_CodigoPostal', 'Nombre del asentamiento'];
$headers = $csv->readLine();

if ($expected !== $headers) {
throw new RuntimeException("The headers did not match on file {$this->sourceFile()}");
}

$csv->next();
}

public function dataTable(): DataTable
{
return new DataTable('ccp_20_colonias', new DataFields([
new PaddingDataField('colonia', '0', 4),
new PaddingDataField('codigo_postal', '0', 5),
new TextDataField('texto'),
]), ['colonia', 'codigo_postal']);
}
}
51 changes: 51 additions & 0 deletions src/Importers/Ccp20/Injectors/ConfiguracionesAutotransporte.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
<?php

declare(strict_types=1);

namespace PhpCfdi\SatCatalogosPopulate\Importers\Ccp20\Injectors;

use PhpCfdi\SatCatalogosPopulate\AbstractCsvInjector;
use PhpCfdi\SatCatalogosPopulate\Database\DataFields;
use PhpCfdi\SatCatalogosPopulate\Database\DataTable;
use PhpCfdi\SatCatalogosPopulate\Database\DateDataField;
use PhpCfdi\SatCatalogosPopulate\Database\IntegerDataField;
use PhpCfdi\SatCatalogosPopulate\Database\TextDataField;
use PhpCfdi\SatCatalogosPopulate\Utils\CsvFile;
use RuntimeException;

class ConfiguracionesAutotransporte extends AbstractCsvInjector
{
public function checkHeaders(CsvFile $csv): void
{
$csv->move(3);
$expected = [
'Clave nomenclatura',
'Descripción',
'Número de ejes',
'Número de llantas',
'Remolque',
'Fecha de inicio de vigencia',
'Fecha de fin de vigencia',
];
$headers = $csv->readLine();

if ($expected !== $headers) {
throw new RuntimeException("The headers did not match on file {$this->sourceFile()}");
}

$csv->next();
}

public function dataTable(): DataTable
{
return new DataTable('ccp_20_configuraciones_autotransporte', new DataFields([
new TextDataField('id'),
new TextDataField('texto'),
new IntegerDataField('numero_de_ejes'),
new IntegerDataField('numero_de_llantas'),
new TextDataField('remolque'), // 1 | 1,0 | 0
new DateDataField('vigencia_desde'),
new DateDataField('vigencia_hasta'),
]));
}
}
44 changes: 44 additions & 0 deletions src/Importers/Ccp20/Injectors/ConfiguracionesMaritimas.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
<?php

declare(strict_types=1);

namespace PhpCfdi\SatCatalogosPopulate\Importers\Ccp20\Injectors;

use PhpCfdi\SatCatalogosPopulate\AbstractCsvInjector;
use PhpCfdi\SatCatalogosPopulate\Database\DataFields;
use PhpCfdi\SatCatalogosPopulate\Database\DataTable;
use PhpCfdi\SatCatalogosPopulate\Database\DateDataField;
use PhpCfdi\SatCatalogosPopulate\Database\TextDataField;
use PhpCfdi\SatCatalogosPopulate\Utils\CsvFile;
use RuntimeException;

class ConfiguracionesMaritimas extends AbstractCsvInjector
{
public function checkHeaders(CsvFile $csv): void
{
$csv->move(3);
$expected = [
'Clave configuración marítima',
'Descripción',
'Fecha de inicio de vigencia',
'Fecha de fin de vigencia',
];
$headers = $csv->readLine();

if ($expected !== $headers) {
throw new RuntimeException("The headers did not match on file {$this->sourceFile()}");
}

$csv->next();
}

public function dataTable(): DataTable
{
return new DataTable('ccp_20_configuraciones_maritimas', new DataFields([
new TextDataField('id'),
new TextDataField('texto'),
new DateDataField('vigencia_desde'),
new DateDataField('vigencia_hasta'),
]));
}
}
Loading

0 comments on commit 8113ff5

Please sign in to comment.