1
|
|
|
<?php |
2
|
|
|
|
3
|
|
|
namespace NFePHP\EFD\Elements\ICMSIPI; |
4
|
|
|
|
5
|
|
|
use NFePHP\EFD\Common\Element; |
6
|
|
|
use NFePHP\EFD\Common\ElementInterface; |
7
|
|
|
use \stdClass; |
8
|
|
|
|
9
|
|
|
class E210 extends Element implements ElementInterface |
10
|
|
|
{ |
11
|
|
|
const REG = 'E210'; |
12
|
|
|
const LEVEL = 3; |
13
|
|
|
const PARENT = 'E200'; |
14
|
|
|
|
15
|
|
|
protected $parameters = [ |
16
|
|
|
'IND_MOV_ST' => [ |
17
|
|
|
'type' => 'integer', |
18
|
|
|
'regex' => '^[0-1]{1}$', |
19
|
|
|
'required' => true, |
20
|
|
|
'info' => 'Indicador de movimento: 0 – Sem operações com ST 1 – Com operações de ST', |
21
|
|
|
'format' => '' |
22
|
|
|
], |
23
|
|
|
'VL_SLD_CRED_ANT_ST' => [ |
24
|
|
|
'type' => 'numeric', |
25
|
|
|
'regex' => '^\d+(\.\d*)?|\.\d+$', |
26
|
|
|
'required' => true, |
27
|
|
|
'info' => 'Valor do "Saldo credor de período anterior – Substituição Tributária"', |
28
|
|
|
'format' => '15v2' |
29
|
|
|
], |
30
|
|
|
'VL_DEVOL_ST' => [ |
31
|
|
|
'type' => 'numeric', |
32
|
|
|
'regex' => '^\d+(\.\d*)?|\.\d+$', |
33
|
|
|
'required' => true, |
34
|
|
|
'info' => 'Valor total do ICMS ST de devolução de mercadorias', |
35
|
|
|
'format' => '15v2' |
36
|
|
|
], |
37
|
|
|
'VL_RESSARC_ST' => [ |
38
|
|
|
'type' => 'numeric', |
39
|
|
|
'regex' => '^\d+(\.\d*)?|\.\d+$', |
40
|
|
|
'required' => true, |
41
|
|
|
'info' => 'Valor total do ICMS ST de ressarcimentos', |
42
|
|
|
'format' => '15v2' |
43
|
|
|
], |
44
|
|
|
'VL_OUT_CRED_ST' => [ |
45
|
|
|
'type' => 'numeric', |
46
|
|
|
'regex' => '^\d+(\.\d*)?|\.\d+$', |
47
|
|
|
'required' => true, |
48
|
|
|
'info' => 'Valor total de Ajustes "Outros créditos ST" e “Estorno de débitos ST”', |
49
|
|
|
'format' => '15v2' |
50
|
|
|
], |
51
|
|
|
'VL_AJ_CREDITOS_ST' => [ |
52
|
|
|
'type' => 'numeric', |
53
|
|
|
'regex' => '^\d+(\.\d*)?|\.\d+$', |
54
|
|
|
'required' => true, |
55
|
|
|
'info' => 'Valor total dos ajustes a crédito de ICMS ST, provenientes de ajustes do documento fiscal.', |
56
|
|
|
'format' => '15v2' |
57
|
|
|
], |
58
|
|
|
'VL_RETENCAO_ST' => [ |
59
|
|
|
'type' => 'numeric', |
60
|
|
|
'regex' => '^\d+(\.\d*)?|\.\d+$', |
61
|
|
|
'required' => true, |
62
|
|
|
'info' => 'Valor Total do ICMS retido por Substituição Tributária', |
63
|
|
|
'format' => '15v2' |
64
|
|
|
], |
65
|
|
|
'VL_OUT_DEB_ST' => [ |
66
|
|
|
'type' => 'numeric', |
67
|
|
|
'regex' => '^\d+(\.\d*)?|\.\d+$', |
68
|
|
|
'required' => true, |
69
|
|
|
'info' => 'Valor Total dos ajustes "Outros débitos ST" " e “Estorno de créditos ST”', |
70
|
|
|
'format' => '15v2' |
71
|
|
|
], |
72
|
|
|
'VL_AJ_DEBITOS_ST' => [ |
73
|
|
|
'type' => 'numeric', |
74
|
|
|
'regex' => '^\d+(\.\d*)?|\.\d+$', |
75
|
|
|
'required' => true, |
76
|
|
|
'info' => 'Valor total dos ajustes a débito de ICMS ST, provenientes de ajustes do documento fiscal.', |
77
|
|
|
'format' => '15v2' |
78
|
|
|
], |
79
|
|
|
'VL_SLD_DEV_ANT_ST' => [ |
80
|
|
|
'type' => 'numeric', |
81
|
|
|
'regex' => '^\d+(\.\d*)?|\.\d+$', |
82
|
|
|
'required' => true, |
83
|
|
|
'info' => 'Valor total de Saldo devedor antes das deduções', |
84
|
|
|
'format' => '15v2' |
85
|
|
|
], |
86
|
|
|
'VL_DEDUCOES_ST' => [ |
87
|
|
|
'type' => 'numeric', |
88
|
|
|
'regex' => '^\d+(\.\d*)?|\.\d+$', |
89
|
|
|
'required' => true, |
90
|
|
|
'info' => 'Valor total dos ajustes "Deduções ST"', |
91
|
|
|
'format' => '15v2' |
92
|
|
|
], |
93
|
|
|
'VL_ICMS_RECOL_ST' => [ |
94
|
|
|
'type' => 'numeric', |
95
|
|
|
'regex' => '^\d+(\.\d*)?|\.\d+$', |
96
|
|
|
'required' => true, |
97
|
|
|
'info' => 'Imposto a recolher ST (11-12)', |
98
|
|
|
'format' => '15v2' |
99
|
|
|
], |
100
|
|
|
'VL_SLD_CRED_ST_TRANSPORTAR' => [ |
101
|
|
|
'type' => 'numeric', |
102
|
|
|
'regex' => '^\d+(\.\d*)?|\.\d+$', |
103
|
|
|
'required' => true, |
104
|
|
|
'info' => 'Saldo credor de ST a transportar para o período ' |
105
|
|
|
.'seguinte [(03+04+05+06+07+12)– (08+09+10)].', |
106
|
|
|
'format' => '15v2' |
107
|
|
|
], |
108
|
|
|
'DEB_ESP_ST' => [ |
109
|
|
|
'type' => 'numeric', |
110
|
|
|
'regex' => '^\d+(\.\d*)?|\.\d+$', |
111
|
|
|
'required' => true, |
112
|
|
|
'info' => 'Valores recolhidos ou a recolher, extra- apuração.', |
113
|
|
|
'format' => '15v2' |
114
|
|
|
] |
115
|
|
|
]; |
116
|
|
|
|
117
|
|
|
/** |
118
|
|
|
* Constructor |
119
|
|
|
* @param \stdClass $std |
120
|
|
|
*/ |
121
|
|
|
public function __construct(\stdClass $std) |
122
|
|
|
{ |
123
|
|
|
parent::__construct(self::REG); |
124
|
|
|
$this->std = $this->standarize($std); |
125
|
|
|
//TODO: essa validação posterior está incorreta |
126
|
|
|
//$this->postValidation(); |
127
|
|
|
} |
128
|
|
|
|
129
|
|
|
public function postValidation() |
130
|
|
|
{ |
131
|
|
|
/* |
132
|
|
|
* Campo 11 (VL_SLD_DEV_ANT_ST) Validação: o valor informado deve ser preenchido com base na |
133
|
|
|
* expressão: soma do total de retenção por ST, campo VL_RETENCAO_ST, com total de outros |
134
|
|
|
* débitos por ST, campo VL_OUT_DEB_ST, com total de ajustes de débito por ST, campo |
135
|
|
|
* VL_AJ_DEBITOS_ST, menos a soma do saldo credor do período anterior por ST, campo |
136
|
|
|
* VL_SLD_CRED_ANT_ST, com total de devolução por ST, campo VL_DEVOL_ST, com total de |
137
|
|
|
* ressarcimento por ST, campo VL_RESSARC_ST, com o total de outros créditos por ST, campo |
138
|
|
|
* VL_OUT_CRED_ST, com o total de ajustes de crédito por ST, campo VL_AJ_CREDITOS_ST. Se o |
139
|
|
|
* valor da expressão for maior ou igual a “0” (zero), então este valor deve ser informado |
140
|
|
|
* neste campo. Se o valor da expressão for menor que “0” (zero), então este campo deve ser |
141
|
|
|
* preenchido com “0” (zero). |
142
|
|
|
*/ |
143
|
|
|
$somatorio = $this->values->vl_retencao_st |
144
|
|
|
+ $this->values->vl_out_deb_st |
145
|
|
|
+ $this->values->vl_aj_debitos_st |
146
|
|
|
- $this->values->vl_sld_cred_ant_st |
147
|
|
|
- $this->values->vl_devol_st |
148
|
|
|
- $this->values->vl_ressarc_st |
149
|
|
|
- $this->values->vl_out_cred_st |
150
|
|
|
- $this->values->vl_aj_creditos_st; |
151
|
|
|
|
152
|
|
View Code Duplication |
if (($somatorio >= 0 && $this->values->vl_sld_dev_ant_st == 0) |
|
|
|
|
153
|
|
|
|| ($somatorio < 0 && $this->values->vl_sld_dev_ant_st != 0)) { |
154
|
|
|
throw new \InvalidArgumentException("[" . self::REG . "] O valor informado deve ser preenchido com base na " |
155
|
|
|
."expressão: soma do total de retenção por ST, campo VL_RETENCAO_ST, com total de outros " |
156
|
|
|
."débitos por ST, campo VL_OUT_DEB_ST, com total de ajustes de débito por ST, campo " |
157
|
|
|
."VL_AJ_DEBITOS_ST, menos a soma do saldo credor do período anterior por ST, campo " |
158
|
|
|
."VL_SLD_CRED_ANT_ST, com total de devolução por ST, campo VL_DEVOL_ST, com total de " |
159
|
|
|
."ressarcimento por ST, campo VL_RESSARC_ST, com o total de outros créditos por ST, campo " |
160
|
|
|
."VL_OUT_CRED_ST, com o total de ajustes de crédito por ST, campo VL_AJ_CREDITOS_ST. Se o " |
161
|
|
|
."valor da expressão for maior ou igual a “0” (zero), então este valor deve ser informado " |
162
|
|
|
."neste campo. Se o valor da expressão for menor que “0” (zero), então este campo deve ser " |
163
|
|
|
."preenchido com “0” (zero)."); |
164
|
|
|
} |
165
|
|
|
|
166
|
|
|
/* |
167
|
|
|
* Campo 13 (VL_ICMS_RECOL_ST) Validação: o valor informado deve corresponder à diferença entre |
168
|
|
|
* o campo VL_SLD_DEV_ANT_ST e o campo VL_DEDUCOES_ST. |
169
|
|
|
*/ |
170
|
|
|
$diferenca = $this->values->vl_sld_dev_ant_st - $this->values->vl_deducoes_st; |
171
|
|
|
if (number_format($this->values->vl_icms_recol_st, 2, ',', '') != number_format($diferenca, 2, ',', '')) { |
172
|
|
|
throw new \InvalidArgumentException("[" . self::REG . "] O valor informado no campo VL_ICMS_RECOL_ST deve " |
173
|
|
|
."corresponder à diferença entre o campo VL_SLD_DEV_ANT_ST e o campo VL_DEDUCOES_ST."); |
174
|
|
|
} |
175
|
|
|
|
176
|
|
|
/* |
177
|
|
|
* Campo 14 (VL_SLD_CRED_ST_TRANSPORTAR) Validação: se o valor da expressão: soma do total de retenção |
178
|
|
|
* por ST, campo VL_RETENCAO_ST, com total de outros débitos por ST, campo VL_OUT_DEB_ST, com total de |
179
|
|
|
* ajustes de débito por ST, campo VL_AJ_DEBITOS_ST, menos a soma do saldo credor do período anterior |
180
|
|
|
* por ST, campo VL_SLD_CRED_ANT_ST, com total de devolução por ST, campo VL_DEVOL_ST, com total de |
181
|
|
|
* ressarcimento por ST, campo VL_RESSARC_ST, com o total de outros créditos por ST, campo VL_OUT_CRED_ST, |
182
|
|
|
* com o total de ajustes de crédito por ST, campo VL_AJ_CREDITOS_ST, com o total dos ajustes de deduções |
183
|
|
|
* ST, campo VL_DEDUÇÕES_ST, for maior ou igual a “0” (zero), este campo deve ser preenchido com “0” (zero). |
184
|
|
|
* Se for menor que “0” (zero), o valor absoluto do resultado deve ser informado. |
185
|
|
|
*/ |
186
|
|
|
$somatorio = $this->values->vl_retencao_st |
187
|
|
|
+ $this->values->vl_out_deb_st |
188
|
|
|
+ $this->values->vl_aj_debitos_st |
189
|
|
|
- $this->values->vl_sld_cred_ant_st |
190
|
|
|
- $this->values->vl_devol_st |
191
|
|
|
- $this->values->vl_ressarc_st |
192
|
|
|
- $this->values->vl_out_cred_st |
193
|
|
|
- $this->values->vl_aj_creditos_st |
194
|
|
|
- $this->values->vl_deducoes_st; |
195
|
|
|
|
196
|
|
View Code Duplication |
if (($somatorio >= 0 && $this->values->vl_sld_cred_st_transportar != 0) |
|
|
|
|
197
|
|
|
|| ($somatorio < 0 && $this->values->vl_sld_cred_st_transportar == 0)) { |
198
|
|
|
throw new \InvalidArgumentException("[" . self::REG . "] Se o valor da expressão: soma do total " |
199
|
|
|
."de retenção por ST, campo VL_RETENCAO_ST, com total de outros débitos por ST, campo VL_OUT_DEB_ST, " |
200
|
|
|
."com total de ajustes de débito por ST, campo VL_AJ_DEBITOS_ST, menos a soma do saldo credor do " |
201
|
|
|
."período anterior por ST, campo VL_SLD_CRED_ANT_ST, com total de devolução por ST, campo VL_DEVOL_ST, " |
202
|
|
|
."com total de ressarcimento por ST, campo VL_RESSARC_ST, com o total de outros créditos por ST, " |
203
|
|
|
."campo VL_OUT_CRED_ST, com o total de ajustes de crédito por ST, campo VL_AJ_CREDITOS_ST, com o " |
204
|
|
|
."total dos ajustes de deduções ST, campo VL_DEDUÇÕES_ST, for maior ou igual a “0” (zero), este " |
205
|
|
|
."campo deve ser preenchido com “0” (zero). Se for menor que “0” (zero), o valor absoluto do " |
206
|
|
|
."resultado deve ser informado."); |
207
|
|
|
} |
208
|
|
|
} |
209
|
|
|
} |
210
|
|
|
|
Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.
You can also find more detailed suggestions in the “Code” section of your repository.