Skip to content

Commit c3562b5

Browse files
authored
feat: add federal taxation fields to DpsData and XmlBuilder (#13)
* feat(dto): add federal piscofins irrf csll cp properties to DpsData Add 10 optional string properties for federal taxation: - federalPiscofinsSituacaoTributaria (CST) - federalPiscofinsTipoRetencao - federalPiscofinsBaseCalculo - federalPiscofinsAliquotaPis / federalPiscofinsValorPis - federalPiscofinsAliquotaCofins / federalPiscofinsValorCofins - federalValorIrrf, federalValorCsll, federalValorCp All default to empty string to preserve backward compatibility. Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com> * feat(xml): serialize tribFed block when federal taxation data is present Add buildTribFederal() and hasFederalTaxationData() private methods to XmlBuilder. The tribFed XML element is appended to totTrib when any of the federal properties on DpsData are non-empty, following the NFS-e Nacional schema (tiDPS v1.00). Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com> * test(xml): cover tribFed serialization in XmlBuilderTest Add testBuildDpsIncludesFederalTaxationBlockWhenConfigured verifying that tribFed XML element with all expected child nodes is emitted when federal DpsData fields are populated. Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com> --------- Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>
1 parent dc7e74e commit c3562b5

File tree

3 files changed

+128
-0
lines changed

3 files changed

+128
-0
lines changed

src/Dto/DpsData.php

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,36 @@ public function __construct(
7474

7575
/** Whether ISS is retained at source. */
7676
public bool $issRetido = false,
77+
78+
/** Situação Tributária do PIS/COFINS (CST). */
79+
public string $federalPiscofinsSituacaoTributaria = '',
80+
81+
/** Tipo de retenção do PIS/COFINS/CSLL. */
82+
public string $federalPiscofinsTipoRetencao = '',
83+
84+
/** Base de cálculo do PIS/COFINS. */
85+
public string $federalPiscofinsBaseCalculo = '',
86+
87+
/** Alíquota do PIS. */
88+
public string $federalPiscofinsAliquotaPis = '',
89+
90+
/** Valor do PIS. */
91+
public string $federalPiscofinsValorPis = '',
92+
93+
/** Alíquota do COFINS. */
94+
public string $federalPiscofinsAliquotaCofins = '',
95+
96+
/** Valor do COFINS. */
97+
public string $federalPiscofinsValorCofins = '',
98+
99+
/** Valor do IRRF. */
100+
public string $federalValorIrrf = '',
101+
102+
/** Valor das contribuições sociais retidas (CSLL). */
103+
public string $federalValorCsll = '',
104+
105+
/** Valor da contribuição previdenciária retida. */
106+
public string $federalValorCp = '',
77107
) {
78108
}
79109
}

src/Xml/XmlBuilder.php

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,10 @@ private function buildTotTrib(\DOMDocument $doc, DpsData $dps): \DOMElement
101101

102102
$totTrib->appendChild($tribMun);
103103

104+
if ($this->hasFederalTaxationData($dps)) {
105+
$totTrib->appendChild($this->buildTribFederal($doc, $dps));
106+
}
107+
104108
// E0715: indTotTrib is ALWAYS included to avoid schema validation errors
105109
$totTrib->appendChild($doc->createElement('indTotTrib', (string) $dps->indicadorTributacao));
106110

@@ -133,4 +137,48 @@ private function buildToma(\DOMDocument $doc, DpsData $dps): \DOMElement
133137

134138
return $toma;
135139
}
140+
141+
private function buildTribFederal(\DOMDocument $doc, DpsData $dps): \DOMElement
142+
{
143+
$tribFed = $doc->createElement('tribFed');
144+
145+
if ($dps->federalPiscofinsSituacaoTributaria !== '') {
146+
$tribFed->appendChild($doc->createElement('sitTribPISCOFINS', $dps->federalPiscofinsSituacaoTributaria));
147+
}
148+
149+
if ($dps->federalPiscofinsTipoRetencao !== '') {
150+
$tribFed->appendChild($doc->createElement('tpRetPISCOFINSCSLL', $dps->federalPiscofinsTipoRetencao));
151+
}
152+
153+
foreach ([
154+
'vBCPISCOFINS' => $dps->federalPiscofinsBaseCalculo,
155+
'pAliqPIS' => $dps->federalPiscofinsAliquotaPis,
156+
'vPIS' => $dps->federalPiscofinsValorPis,
157+
'pAliqCOFINS' => $dps->federalPiscofinsAliquotaCofins,
158+
'vCOFINS' => $dps->federalPiscofinsValorCofins,
159+
'vIRRF' => $dps->federalValorIrrf,
160+
'vCSLL' => $dps->federalValorCsll,
161+
'vCP' => $dps->federalValorCp,
162+
] as $tag => $value) {
163+
if ($value !== '') {
164+
$tribFed->appendChild($doc->createElement($tag, $value));
165+
}
166+
}
167+
168+
return $tribFed;
169+
}
170+
171+
private function hasFederalTaxationData(DpsData $dps): bool
172+
{
173+
return $dps->federalPiscofinsSituacaoTributaria !== ''
174+
|| $dps->federalPiscofinsTipoRetencao !== ''
175+
|| $dps->federalPiscofinsBaseCalculo !== ''
176+
|| $dps->federalPiscofinsAliquotaPis !== ''
177+
|| $dps->federalPiscofinsValorPis !== ''
178+
|| $dps->federalPiscofinsAliquotaCofins !== ''
179+
|| $dps->federalPiscofinsValorCofins !== ''
180+
|| $dps->federalValorIrrf !== ''
181+
|| $dps->federalValorCsll !== ''
182+
|| $dps->federalValorCp !== '';
183+
}
136184
}

tests/Unit/Xml/XmlBuilderTest.php

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,36 @@ public function testBuildDpsAlwaysIncludesProviderTaxRegime(): void
195195
self::assertSame('0', $nodes->item(0)->textContent);
196196
}
197197

198+
public function testBuildDpsIncludesFederalTaxationBlockWhenConfigured(): void
199+
{
200+
$dps = $this->makeDps(
201+
federalPiscofinsSituacaoTributaria: '1',
202+
federalPiscofinsTipoRetencao: '3',
203+
federalPiscofinsBaseCalculo: '1000.00',
204+
federalPiscofinsAliquotaPis: '1.65',
205+
federalPiscofinsValorPis: '16.50',
206+
federalPiscofinsAliquotaCofins: '7.60',
207+
federalPiscofinsValorCofins: '76.00',
208+
federalValorIrrf: '15.00',
209+
federalValorCsll: '10.00',
210+
federalValorCp: '5.00',
211+
);
212+
213+
$xml = $this->builder->buildDps($dps);
214+
215+
self::assertStringContainsString('<tribFed>', $xml);
216+
self::assertStringContainsString('<sitTribPISCOFINS>1</sitTribPISCOFINS>', $xml);
217+
self::assertStringContainsString('<tpRetPISCOFINSCSLL>3</tpRetPISCOFINSCSLL>', $xml);
218+
self::assertStringContainsString('<vBCPISCOFINS>1000.00</vBCPISCOFINS>', $xml);
219+
self::assertStringContainsString('<pAliqPIS>1.65</pAliqPIS>', $xml);
220+
self::assertStringContainsString('<vPIS>16.50</vPIS>', $xml);
221+
self::assertStringContainsString('<pAliqCOFINS>7.60</pAliqCOFINS>', $xml);
222+
self::assertStringContainsString('<vCOFINS>76.00</vCOFINS>', $xml);
223+
self::assertStringContainsString('<vIRRF>15.00</vIRRF>', $xml);
224+
self::assertStringContainsString('<vCSLL>10.00</vCSLL>', $xml);
225+
self::assertStringContainsString('<vCP>5.00</vCP>', $xml);
226+
}
227+
198228
// -------------------------------------------------------------------------
199229

200230
public function testNonSimplesnacionalMustNotIncludeIndtottribAndPaliq(): void
@@ -261,6 +291,16 @@ private function makeDps(
261291
int $tipoRetencaoIss = 1,
262292
int $opcaoSimplesNacional = 1,
263293
int $indicadorTributacao = 0,
294+
string $federalPiscofinsSituacaoTributaria = '',
295+
string $federalPiscofinsTipoRetencao = '',
296+
string $federalPiscofinsBaseCalculo = '',
297+
string $federalPiscofinsAliquotaPis = '',
298+
string $federalPiscofinsValorPis = '',
299+
string $federalPiscofinsAliquotaCofins = '',
300+
string $federalPiscofinsValorCofins = '',
301+
string $federalValorIrrf = '',
302+
string $federalValorCsll = '',
303+
string $federalValorCp = '',
264304
): DpsData {
265305
return new DpsData(
266306
cnpjPrestador: $cnpjPrestador,
@@ -279,6 +319,16 @@ private function makeDps(
279319
issRetido: $issRetido,
280320
opcaoSimplesNacional: $opcaoSimplesNacional,
281321
indicadorTributacao: $indicadorTributacao,
322+
federalPiscofinsSituacaoTributaria: $federalPiscofinsSituacaoTributaria,
323+
federalPiscofinsTipoRetencao: $federalPiscofinsTipoRetencao,
324+
federalPiscofinsBaseCalculo: $federalPiscofinsBaseCalculo,
325+
federalPiscofinsAliquotaPis: $federalPiscofinsAliquotaPis,
326+
federalPiscofinsValorPis: $federalPiscofinsValorPis,
327+
federalPiscofinsAliquotaCofins: $federalPiscofinsAliquotaCofins,
328+
federalPiscofinsValorCofins: $federalPiscofinsValorCofins,
329+
federalValorIrrf: $federalValorIrrf,
330+
federalValorCsll: $federalValorCsll,
331+
federalValorCp: $federalValorCp,
282332
);
283333
}
284334
}

0 commit comments

Comments
 (0)