From 3877033e1cd7d4f1721b9c6355e21fb21edfb92a Mon Sep 17 00:00:00 2001 From: David Date: Thu, 9 Nov 2017 12:30:56 -0600 Subject: [PATCH 1/5] Added CONCEPIMPC02 to ConceptoImpuestos Los traslados de los impuestos de un concepto deben tener una base y ser mayor a cero (CFDI33154) --- .../Cfdi33/Standard/ConceptoImpuestos.php | 56 +++++++++++++---- .../Cfdi33/Standard/ConceptoImpuestosTest.php | 62 ++++++++++++++++++- 2 files changed, 104 insertions(+), 14 deletions(-) diff --git a/src/CfdiUtils/Validate/Cfdi33/Standard/ConceptoImpuestos.php b/src/CfdiUtils/Validate/Cfdi33/Standard/ConceptoImpuestos.php index ba199ec8..fb302993 100644 --- a/src/CfdiUtils/Validate/Cfdi33/Standard/ConceptoImpuestos.php +++ b/src/CfdiUtils/Validate/Cfdi33/Standard/ConceptoImpuestos.php @@ -10,7 +10,8 @@ * ConceptoImpuestos.php * * Valida que: - * - CONCEPIMPC01: Si se utiliza el nodo impuestos en un concepto entonces se deben incluir traslados o retenciones + * - CONCEPIMPC01: El nodo impuestos de un concepto debe incluir traslados y/o retenciones (CFDI33152) + * - CONCEPIMPC02: Los traslados de los impuestos de un concepto deben tener una base y ser mayor a cero (CFDI33154) */ class ConceptoImpuestos extends AbstractDiscoverableVersion33 { @@ -18,22 +19,53 @@ public function validate(NodeInterface $comprobante, Asserts $asserts) { $asserts->put( 'CONCEPIMPC01', - 'Si se utiliza el nodo impuestos en un concepto entonces se deben incluir traslados y retenciones', - Status::when($this->allConceptosImpuestosHasTrasladosOrRetenciones($comprobante)) + 'El nodo impuestos de un concepto debe incluir traslados y/o retenciones (CFDI33152)' + ); + $asserts->put( + 'CONCEPIMPC02', + 'Los traslados de los impuestos de un concepto deben tener una base y ser mayor a cero (CFDI33154)' ); - } - public function allConceptosImpuestosHasTrasladosOrRetenciones(NodeInterface $comprobante): bool - { + $allConceptoImpuestosHasTrasladosOrRetenciones = true; + $allTrasladosHasBaseGreaterThanZero = true; + foreach ($comprobante->searchNodes('cfdi:Conceptos', 'cfdi:Concepto') as $concepto) { - $impuestos = $concepto->searchNode('cfdi:Impuestos'); - if (null === $impuestos) { - continue; + if (! $this->conceptoImpuestosHasTrasladosOrRetenciones($concepto)) { + $allConceptoImpuestosHasTrasladosOrRetenciones = false; } - if ($impuestos->searchNodes('cfdi:Traslados', 'cfdi:Traslado')->count() - || $impuestos->searchNodes('cfdi:Retenciones', 'cfdi:Retencion')->count()) { - continue; + foreach ($concepto->searchNodes('cfdi:Impuestos', 'cfdi:Traslados', 'cfdi:Traslado') as $traslado) { + if (! $this->trasladoHasBaseGreaterThanZero($traslado)) { + $allTrasladosHasBaseGreaterThanZero = false; + } } + } + + $asserts->putStatus('CONCEPIMPC01', Status::when($allConceptoImpuestosHasTrasladosOrRetenciones)); + $asserts->putStatus('CONCEPIMPC02', Status::when($allTrasladosHasBaseGreaterThanZero)); + } + + private function conceptoImpuestosHasTrasladosOrRetenciones(NodeInterface $concepto): bool + { + $impuestos = $concepto->searchNode('cfdi:Impuestos'); + if (null === $impuestos) { + return true; + } + if ($impuestos->searchNodes('cfdi:Traslados', 'cfdi:Traslado')->count() + || $impuestos->searchNodes('cfdi:Retenciones', 'cfdi:Retencion')->count()) { + return true; + } + return false; + } + + private function trasladoHasBaseGreaterThanZero(NodeInterface $traslado): bool + { + if (! isset($traslado['Base'])) { + return $allTrasladosHasBaseGreaterThanZero = false; + } + if (! is_numeric($traslado['Base'])) { + return false; + } + if ((float) $traslado['Base'] < 0.000001) { return false; } return true; diff --git a/tests/CfdiUtilsTests/Validate/Cfdi33/Standard/ConceptoImpuestosTest.php b/tests/CfdiUtilsTests/Validate/Cfdi33/Standard/ConceptoImpuestosTest.php index 297f0443..52f5064f 100644 --- a/tests/CfdiUtilsTests/Validate/Cfdi33/Standard/ConceptoImpuestosTest.php +++ b/tests/CfdiUtilsTests/Validate/Cfdi33/Standard/ConceptoImpuestosTest.php @@ -17,7 +17,7 @@ protected function setUp() $this->validator = new ConceptoImpuestos(); } - public function testValidCase() + public function testValidCaseNoRetencionOrTraslado() { $this->comprobante->addChild( new Node('cfdi:Conceptos', [], [ @@ -25,7 +25,7 @@ public function testValidCase() new Node('cfdi:Concepto', [], [ new Node('cfdi:Impuestos', [], [ new Node('cfdi:Traslados', [], [ - new Node('cfdi:Traslado'), + new Node('cfdi:Traslado', ['Base' => '1']), ]), new Node('cfdi:Retenciones', [], [ new Node('cfdi:Retencion'), @@ -54,4 +54,62 @@ public function testInvalidCaseNoRetencionOrTraslado() $this->runValidate(); $this->assertStatusEqualsCode(Status::error(), 'CONCEPIMPC01'); } + + public function testTrasladosValidCase() + { + $this->comprobante->addChild( + new Node('cfdi:Conceptos', [], [ + new Node('cfdi:Concepto'), + new Node('cfdi:Concepto', [], [ + new Node('cfdi:Impuestos', [], [ + new Node('cfdi:Traslados', [], [ + new Node('cfdi:Traslado', ['Base' => '0.000001']), + ]), + ]), + ]), + new Node('cfdi:Concepto', [], [ + new Node('cfdi:Impuestos', [], [ + new Node('cfdi:Traslados', [], [ + new Node('cfdi:Traslado', ['Base' => '1']), + ]), + ]), + ]), + ]) + ); + $this->runValidate(); + $this->assertStatusEqualsCode(Status::ok(), 'CONCEPIMPC02'); + } + + public function providerInvalidTraslado() + { + return[ + ['0'], + ['0.0000001'], + ['-1'], + ['foo'], + ['0.0.0.0'], + ]; + } + + /** + * @param $base + * @dataProvider providerInvalidTraslado + */ + public function testInvalidTraslado($base) + { + $this->comprobante->addChild( + new Node('cfdi:Conceptos', [], [ + new Node('cfdi:Concepto'), + new Node('cfdi:Concepto', [], [ + new Node('cfdi:Impuestos', [], [ + new Node('cfdi:Traslados', [], [ + new Node('cfdi:Traslado', ['Base' => $base]), + ]), + ]), + ]), + ]) + ); + $this->runValidate(); + $this->assertStatusEqualsCode(Status::error(), 'CONCEPIMPC02'); + } } From 3143b7b3ffa53eaf261ed8e11d5467e6d9ffd224 Mon Sep 17 00:00:00 2001 From: David Date: Fri, 10 Nov 2017 11:23:09 -0600 Subject: [PATCH 2/5] Completed ConceptoImpuestos and Tests --- .../Cfdi33/Standard/ConceptoImpuestos.php | 122 ++++++++++--- .../Cfdi33/Standard/ConceptoImpuestosTest.php | 169 +++++++++++------- 2 files changed, 203 insertions(+), 88 deletions(-) diff --git a/src/CfdiUtils/Validate/Cfdi33/Standard/ConceptoImpuestos.php b/src/CfdiUtils/Validate/Cfdi33/Standard/ConceptoImpuestos.php index fb302993..7a0ac2f4 100644 --- a/src/CfdiUtils/Validate/Cfdi33/Standard/ConceptoImpuestos.php +++ b/src/CfdiUtils/Validate/Cfdi33/Standard/ConceptoImpuestos.php @@ -12,36 +12,88 @@ * Valida que: * - CONCEPIMPC01: El nodo impuestos de un concepto debe incluir traslados y/o retenciones (CFDI33152) * - CONCEPIMPC02: Los traslados de los impuestos de un concepto deben tener una base y ser mayor a cero (CFDI33154) + * - CONCEPIMPC03: No se debe registrar la tasa o cuota ni el importe cuando + * el tipo de factor de traslado es exento (CFDI33157) + * - CONCEPIMPC04: Se debe registrar la tasa o cuota y el importe cuando + * el tipo de factor de traslado es tasa o cuota (CFDI33158) + * - CONCEPIMPC05: Las retenciones de los impuestos de un concepto deben tener una base y ser mayor a cero (CFDI33154) + * - CONCEPIMPC06: Las retenciones de los impuestos de un concepto deben tener + * un tipo de factor diferente de exento (CFDI33166) */ class ConceptoImpuestos extends AbstractDiscoverableVersion33 { + private function registerAsserts(Asserts $asserts) + { + $assertDescriptions = [ + 'CONCEPIMPC01' => 'El nodo impuestos de un concepto debe incluir traslados y/o retenciones (CFDI33152)', + 'CONCEPIMPC02' => 'Los traslados de los impuestos de un concepto deben tener una base y ser mayor a cero' + . ' (CFDI33154)', + 'CONCEPIMPC03' => 'No se debe registrar la tasa o cuota ni el importe cuando el tipo de factor de traslado' + . ' es exento (CFDI33157)', + 'CONCEPIMPC04' => 'Se debe registrar la tasa o cuota y el importe cuando el tipo de factor de traslado' + . ' es tasa o cuota (CFDI33158)', + 'CONCEPIMPC05' => 'Las retenciones de los impuestos de un concepto deben tener una base y ser mayor a cero' + . '(CFDI33154)', + 'CONCEPIMPC06' => ' Las retenciones de los impuestos de un concepto deben tener un tipo de factor diferente' + . ' de exento (CFDI33166)', + ]; + foreach ($assertDescriptions as $code => $title) { + $asserts->put($code, $title); + } + } + public function validate(NodeInterface $comprobante, Asserts $asserts) { - $asserts->put( - 'CONCEPIMPC01', - 'El nodo impuestos de un concepto debe incluir traslados y/o retenciones (CFDI33152)' - ); - $asserts->put( - 'CONCEPIMPC02', - 'Los traslados de los impuestos de un concepto deben tener una base y ser mayor a cero (CFDI33154)' - ); + $this->registerAsserts($asserts); - $allConceptoImpuestosHasTrasladosOrRetenciones = true; - $allTrasladosHasBaseGreaterThanZero = true; + $status01 = Status::ok(); + $status02 = Status::ok(); + $status03 = Status::ok(); + $status04 = Status::ok(); + $status05 = Status::ok(); + $status06 = Status::ok(); - foreach ($comprobante->searchNodes('cfdi:Conceptos', 'cfdi:Concepto') as $concepto) { - if (! $this->conceptoImpuestosHasTrasladosOrRetenciones($concepto)) { - $allConceptoImpuestosHasTrasladosOrRetenciones = false; + foreach ($comprobante->searchNodes('cfdi:Conceptos', 'cfdi:Concepto') as $i => $concepto) { + if ($status01->isOk() && ! $this->conceptoImpuestosHasTrasladosOrRetenciones($concepto)) { + $status01 = Status::error(); + $asserts->get('CONCEPIMPC01')->setExplanation(sprintf('Concepto #%d', $i)); } - foreach ($concepto->searchNodes('cfdi:Impuestos', 'cfdi:Traslados', 'cfdi:Traslado') as $traslado) { - if (! $this->trasladoHasBaseGreaterThanZero($traslado)) { - $allTrasladosHasBaseGreaterThanZero = false; + + $traslados = $concepto->searchNodes('cfdi:Impuestos', 'cfdi:Traslados', 'cfdi:Traslado'); + foreach ($traslados as $k => $traslado) { + if ($status02->isOk() && ! $this->impuestoHasBaseGreaterThanZero($traslado)) { + $status02 = Status::error(); + $asserts->get('CONCEPIMPC02')->setExplanation(sprintf('Concepto #%d, Traslado #%d', $i, $k)); + } + if ($status03->isOk() && ! $this->trasladoHasTipoFactorExento($traslado)) { + $status03 = Status::error(); + $asserts->get('CONCEPIMPC03')->setExplanation(sprintf('Concepto #%d, Traslado #%d', $i, $k)); + } + if ($status04->isOk() && ! $this->trasladoHasTipoFactorTasaOCuota($traslado)) { + $status04 = Status::error(); + $asserts->get('CONCEPIMPC04')->setExplanation(sprintf('Concepto #%d, Traslado #%d', $i, $k)); + } + } + + $retenciones = $concepto->searchNodes('cfdi:Impuestos', 'cfdi:Retenciones', 'cfdi:Retencion'); + foreach ($retenciones as $k => $retencion) { + if ($status05->isOk() && ! $this->impuestoHasBaseGreaterThanZero($retencion)) { + $status05 = Status::error(); + $asserts->get('CONCEPIMPC05')->setExplanation(sprintf('Concepto #%d, RetenciĆ³n #%d', $i, $k)); + } + if ($status06->isOk() && 'Exento' === $retencion['TipoFactor']) { + $status06 = Status::error(); + $asserts->get('CONCEPIMPC06')->setExplanation(sprintf('Concepto #%d, RetenciĆ³n #%d', $i, $k)); } } } - $asserts->putStatus('CONCEPIMPC01', Status::when($allConceptoImpuestosHasTrasladosOrRetenciones)); - $asserts->putStatus('CONCEPIMPC02', Status::when($allTrasladosHasBaseGreaterThanZero)); + $asserts->putStatus('CONCEPIMPC01', $status01); + $asserts->putStatus('CONCEPIMPC02', $status02); + $asserts->putStatus('CONCEPIMPC03', $status03); + $asserts->putStatus('CONCEPIMPC04', $status04); + $asserts->putStatus('CONCEPIMPC05', $status05); + $asserts->putStatus('CONCEPIMPC06', $status06); } private function conceptoImpuestosHasTrasladosOrRetenciones(NodeInterface $concepto): bool @@ -57,17 +109,43 @@ private function conceptoImpuestosHasTrasladosOrRetenciones(NodeInterface $conce return false; } - private function trasladoHasBaseGreaterThanZero(NodeInterface $traslado): bool + private function impuestoHasBaseGreaterThanZero(NodeInterface $impuesto): bool { - if (! isset($traslado['Base'])) { + if (! isset($impuesto['Base'])) { return $allTrasladosHasBaseGreaterThanZero = false; } - if (! is_numeric($traslado['Base'])) { + if (! is_numeric($impuesto['Base'])) { return false; } - if ((float) $traslado['Base'] < 0.000001) { + if ((float) $impuesto['Base'] < 0.000001) { return false; } return true; } + + private function trasladoHasTipoFactorExento(NodeInterface $traslado): bool + { + if ('Exento' === $traslado['TipoFactor']) { + if (isset($traslado['TasaOCuota'])) { + return false; + } + if (isset($traslado['Importe'])) { + return false; + } + } + return true; + } + + private function trasladoHasTipoFactorTasaOCuota(NodeInterface $traslado): bool + { + if ('Tasa' === $traslado['TipoFactor'] || 'Cuota' === $traslado['TipoFactor']) { + if ('' === $traslado['TasaOCuota']) { + return false; + } + if ('' === $traslado['Importe']) { + return false; + } + } + return true; + } } diff --git a/tests/CfdiUtilsTests/Validate/Cfdi33/Standard/ConceptoImpuestosTest.php b/tests/CfdiUtilsTests/Validate/Cfdi33/Standard/ConceptoImpuestosTest.php index 52f5064f..1c17e634 100644 --- a/tests/CfdiUtilsTests/Validate/Cfdi33/Standard/ConceptoImpuestosTest.php +++ b/tests/CfdiUtilsTests/Validate/Cfdi33/Standard/ConceptoImpuestosTest.php @@ -1,6 +1,7 @@ validator = new ConceptoImpuestos(); } - public function testValidCaseNoRetencionOrTraslado() + public function testInvalidCaseNoRetencionOrTraslado() { - $this->comprobante->addChild( - new Node('cfdi:Conceptos', [], [ - new Node('cfdi:Concepto'), - new Node('cfdi:Concepto', [], [ - new Node('cfdi:Impuestos', [], [ - new Node('cfdi:Traslados', [], [ - new Node('cfdi:Traslado', ['Base' => '1']), - ]), - new Node('cfdi:Retenciones', [], [ - new Node('cfdi:Retencion'), - ]), - ]), - ]), - ]) - ); + $comprobante = $this->validComprobante(); + $comprobante->addConcepto()->addChild(new Node('cfdi:Impuestos')); $this->runValidate(); - $this->assertStatusEqualsCode(Status::ok(), 'CONCEPIMPC01'); + $this->assertStatusEqualsCode(Status::error(), 'CONCEPIMPC01'); } - public function testInvalidCaseNoRetencionOrTraslado() + public function providerInvalidBaseTraslado() { - $this->comprobante->addChild( - new Node('cfdi:Conceptos', [], [ - new Node('cfdi:Concepto'), - new Node('cfdi:Concepto', [], [ - new Node('cfdi:Impuestos', [], [ - new Node('cfdi:Traslados', [], []), - new Node('cfdi:Retenciones', [], []), - ]), - ]), - ]) - ); + return[ + ['0'], + ['0.0000001'], + ['-1'], + ['foo'], + ['0.0.0.0'], + ]; + } + + /** + * @param $base + * @dataProvider providerInvalidBaseTraslado + */ + public function testTrasladoHasBaseGreaterThanZeroInvalidCase($base) + { + $comprobante = $this->validComprobante(); + $comprobante->addConcepto()->addTraslado(['Base' => $base]); $this->runValidate(); - $this->assertStatusEqualsCode(Status::error(), 'CONCEPIMPC01'); + $this->assertStatusEqualsCode(Status::error(), 'CONCEPIMPC02'); + } + + public function testTrasladosTipoFactorInvalidCase() + { + $comprobante = $this->validComprobante(); + $comprobante->addConcepto()->addTraslado([ + 'TipoFactor' => 'Exento', + 'TasaOCuota' => '1', + ]); + $this->runValidate(); + $this->assertStatusEqualsCode(Status::error(), 'CONCEPIMPC03'); } - public function testTrasladosValidCase() + public function providerTrasladosTipoFactorTasaOCuotaInvalidCase() { - $this->comprobante->addChild( - new Node('cfdi:Conceptos', [], [ - new Node('cfdi:Concepto'), - new Node('cfdi:Concepto', [], [ - new Node('cfdi:Impuestos', [], [ - new Node('cfdi:Traslados', [], [ - new Node('cfdi:Traslado', ['Base' => '0.000001']), - ]), - ]), - ]), - new Node('cfdi:Concepto', [], [ - new Node('cfdi:Impuestos', [], [ - new Node('cfdi:Traslados', [], [ - new Node('cfdi:Traslado', ['Base' => '1']), - ]), - ]), - ]), - ]) + return $this->providerFullJoin( + [['Tasa'], ['Cuota']], + [[''], [null]], + [[''], [null]] ); + } + + /** + * @param $tipoFactor + * @param $tasaOCuota + * @param $importe + * @dataProvider providerTrasladosTipoFactorTasaOCuotaInvalidCase + */ + public function testTrasladosTipoFactorTasaOCuotaInvalidCase($tipoFactor, $tasaOCuota, $importe) + { + $comprobante = $this->validComprobante(); + $comprobante->addConcepto()->addTraslado([ + 'TipoFactor' => $tipoFactor, + 'TasaOCuota' => $tasaOCuota, + 'Importe' => $importe, + ]); $this->runValidate(); - $this->assertStatusEqualsCode(Status::ok(), 'CONCEPIMPC02'); + $this->assertStatusEqualsCode(Status::error(), 'CONCEPIMPC04'); } - public function providerInvalidTraslado() + public function providerInvalidBaseRetencion() { return[ ['0'], @@ -93,23 +100,53 @@ public function providerInvalidTraslado() /** * @param $base - * @dataProvider providerInvalidTraslado + * @dataProvider providerInvalidBaseTraslado */ - public function testInvalidTraslado($base) + public function testRetencionesHasBaseGreaterThanZeroInvalidCase($base) { - $this->comprobante->addChild( - new Node('cfdi:Conceptos', [], [ - new Node('cfdi:Concepto'), - new Node('cfdi:Concepto', [], [ - new Node('cfdi:Impuestos', [], [ - new Node('cfdi:Traslados', [], [ - new Node('cfdi:Traslado', ['Base' => $base]), - ]), - ]), - ]), - ]) - ); + $comprobante = $this->validComprobante(); + $comprobante->addConcepto()->addRetencion(['Base' => $base]); $this->runValidate(); - $this->assertStatusEqualsCode(Status::error(), 'CONCEPIMPC02'); + $this->assertStatusEqualsCode(Status::error(), 'CONCEPIMPC05'); + } + + public function testInvalidCaseRetencionTipoFactorExento() + { + $comprobante = $this->validComprobante(); + $comprobante->addConcepto()->addRetencion(['TipoFactor' => 'Exento']); + $this->runValidate(); + $this->assertStatusEqualsCode(Status::error(), 'CONCEPIMPC06'); + } + + public function testValidComprobante() + { + $this->validComprobante(); + $this->runValidate(); + $this->assertFalse($this->asserts->hasErrors()); + } + + private function validComprobante(): Comprobante + { + /** @var Comprobante $comprobante */ + $comprobante = $this->comprobante; + $comprobante->addConcepto(); + $comprobante->addConcepto()->multiTraslado([ + 'TipoFactor' => 'Exento', + 'Base' => '123.45', + ], [ + 'Base' => '123.45', + 'TipoFactor' => 'Tasa', + 'TasaOCuota' => '0.160000', + 'Importe' => '19.75', + ])->multiRetencion([ + 'Base' => '0.000001', + 'TipoFactor' => 'Tasa', + 'TasaOCuota' => '0.02', + 'Importe' => '1.23', + ], [ + 'Base' => '123.45', + 'TipoFactor' => 'Cuota', + ]); + return $comprobante; } } From f187b8ec6dc469ba3b12b98171ac6eef30aa59a7 Mon Sep 17 00:00:00 2001 From: David Date: Fri, 10 Nov 2017 11:35:13 -0600 Subject: [PATCH 3/5] Removed $allTrasladosHasBaseGreaterThanZero variable --- src/CfdiUtils/Validate/Cfdi33/Standard/ConceptoImpuestos.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/CfdiUtils/Validate/Cfdi33/Standard/ConceptoImpuestos.php b/src/CfdiUtils/Validate/Cfdi33/Standard/ConceptoImpuestos.php index 7a0ac2f4..3c22aa7d 100644 --- a/src/CfdiUtils/Validate/Cfdi33/Standard/ConceptoImpuestos.php +++ b/src/CfdiUtils/Validate/Cfdi33/Standard/ConceptoImpuestos.php @@ -112,7 +112,7 @@ private function conceptoImpuestosHasTrasladosOrRetenciones(NodeInterface $conce private function impuestoHasBaseGreaterThanZero(NodeInterface $impuesto): bool { if (! isset($impuesto['Base'])) { - return $allTrasladosHasBaseGreaterThanZero = false; + return false; } if (! is_numeric($impuesto['Base'])) { return false; From bf704d663ecbb8d552f34f1ee71548a730e00517 Mon Sep 17 00:00:00 2001 From: David Date: Fri, 10 Nov 2017 12:37:39 -0600 Subject: [PATCH 4/5] Added dataprovider to testTrasladosTipoFactorInvalidCase --- .../Cfdi33/Standard/ConceptoImpuestosTest.php | 24 +++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/tests/CfdiUtilsTests/Validate/Cfdi33/Standard/ConceptoImpuestosTest.php b/tests/CfdiUtilsTests/Validate/Cfdi33/Standard/ConceptoImpuestosTest.php index 1c17e634..c81fd3d4 100644 --- a/tests/CfdiUtilsTests/Validate/Cfdi33/Standard/ConceptoImpuestosTest.php +++ b/tests/CfdiUtilsTests/Validate/Cfdi33/Standard/ConceptoImpuestosTest.php @@ -21,7 +21,7 @@ protected function setUp() public function testInvalidCaseNoRetencionOrTraslado() { $comprobante = $this->validComprobante(); - $comprobante->addConcepto()->addChild(new Node('cfdi:Impuestos')); + $comprobante->addConcepto()->getImpuestos(); $this->runValidate(); $this->assertStatusEqualsCode(Status::error(), 'CONCEPIMPC01'); } @@ -49,13 +49,29 @@ public function testTrasladoHasBaseGreaterThanZeroInvalidCase($base) $this->assertStatusEqualsCode(Status::error(), 'CONCEPIMPC02'); } - public function testTrasladosTipoFactorInvalidCase() + public function providerTrasladoTipoFactorExento() + { + return[ + ['1', '1'], + [null, '1'], + ['1', null], + ]; + } + + /** + * @param $tasaOCuota + * @param $importe + * @dataProvider providerTrasladoTipoFactorExento + */ + public function testTrasladosTipoFactorInvalidCase($tasaOCuota, $importe) { $comprobante = $this->validComprobante(); - $comprobante->addConcepto()->addTraslado([ + $t = $comprobante->addConcepto()->addTraslado([ 'TipoFactor' => 'Exento', - 'TasaOCuota' => '1', + 'TasaOCuota' => $tasaOCuota, + 'Importe' => $importe, ]); + print_r($t); $this->runValidate(); $this->assertStatusEqualsCode(Status::error(), 'CONCEPIMPC03'); } From ad1e26b254da40aabed8652ebc818a5169b88728 Mon Sep 17 00:00:00 2001 From: David Date: Fri, 10 Nov 2017 12:43:15 -0600 Subject: [PATCH 5/5] Removed $t variable and print_r line --- .../Validate/Cfdi33/Standard/ConceptoImpuestosTest.php | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/tests/CfdiUtilsTests/Validate/Cfdi33/Standard/ConceptoImpuestosTest.php b/tests/CfdiUtilsTests/Validate/Cfdi33/Standard/ConceptoImpuestosTest.php index c81fd3d4..44db5421 100644 --- a/tests/CfdiUtilsTests/Validate/Cfdi33/Standard/ConceptoImpuestosTest.php +++ b/tests/CfdiUtilsTests/Validate/Cfdi33/Standard/ConceptoImpuestosTest.php @@ -2,7 +2,6 @@ namespace CfdiUtilsTests\Validate\Cfdi33\Standard; use CfdiUtils\Elements\Cfdi33\Comprobante; -use CfdiUtils\Nodes\Node; use CfdiUtils\Validate\Cfdi33\Standard\ConceptoImpuestos; use CfdiUtils\Validate\Status; use CfdiUtilsTests\Validate\ValidateTestCase; @@ -66,12 +65,11 @@ public function providerTrasladoTipoFactorExento() public function testTrasladosTipoFactorInvalidCase($tasaOCuota, $importe) { $comprobante = $this->validComprobante(); - $t = $comprobante->addConcepto()->addTraslado([ + $comprobante->addConcepto()->addTraslado([ 'TipoFactor' => 'Exento', 'TasaOCuota' => $tasaOCuota, 'Importe' => $importe, ]); - print_r($t); $this->runValidate(); $this->assertStatusEqualsCode(Status::error(), 'CONCEPIMPC03'); }