PHP - Aleatoriamente graba mal un valor numérico en un TXT

 
Vista:
sin imagen de perfil
Val: 38
Ha disminuido su posición en 6 puestos en PHP (en relación al último mes)
Gráfica de PHP

Aleatoriamente graba mal un valor numérico en un TXT

Publicado por CARLOS (15 intervenciones) el 03/10/2018 18:43:20
Hola a todos, pido ayuda a los más experimentados.
Por alguna razón, en forma aleatoria, graba con un formato incorrecto 2 importes en un TXT, que se usa como input a la aplicación "Compras y Ventas" del SIAP (aplicación para presentar las facturas de compras y ventas en AFIP).

La parte del código que formatea los campos en cuestión es:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
while ($rowItem = mysql_fetch_assoc($itemsFactura)){
	...
	...
	...
 
	$fileAlicuotas .= substr(str_pad($row["tipo_comprobante"], 3, "0", STR_PAD_LEFT), 0, 3); 		//CAMPO_1 -> Tipo de Comprobante -> cantidad 3 -> de 1 a 3
	$fileAlicuotas .= SEPARADOR_CAMPOS;
	$fileAlicuotas .= substr(str_pad($row["punto_venta"], 5, "0", STR_PAD_LEFT), 0, 5); 			//CAMPO_2 -> Punto de Venta -> cantidad 5 -> de 4 a 8
	$fileAlicuotas .= SEPARADOR_CAMPOS;
	$fileAlicuotas .= substr(str_pad($row["comprobante_desde"], 20, "0", STR_PAD_LEFT), 0, 20); 	//CAMPO_3 -> Comprobante Desde -> cantidad 20 -> de 9 a 28
	$fileAlicuotas .= SEPARADOR_CAMPOS;
 
	////// Grabo importe gravado sin separador de miles ni punto decimal /////
		$preTotalGravadoAux = number_format($totalesNetosIva[$ultimaAlicuota],2,",",".");
		$preTotalGravado = str_replace(",", "", $preTotalGravadoAux);
		$preTotalGravado = str_replace(".", "", $preTotalGravado);
	$fileAlicuotas .= substr(str_pad($preTotalGravado, 15, "0", STR_PAD_LEFT), 0, 15); 				//CAMPO_4 -> Importe Neto Gravado -> cantidad 15 -> de 29 a 43
	$fileAlicuotas .= SEPARADOR_CAMPOS;
	//-------------------------------------------------------//
		if($preTotalGravado == 0){
			$alicuotaIva = "0003";
		}else{
			$alicuotaIva = $codigosAlicuotasIva[$ultimaAlicuota];
		}
	$fileAlicuotas .= $alicuotaIva;  // substr(str_pad(0, $alicuotaIva, "0", STR_PAD_LEFT), 0, 4); 	//CAMPO_5 -> Codigo de la Alicuota de IVA -> cantidad 4 -> de 44 a 47 /*Codigo de TASA_IVA*/
	$fileAlicuotas .= SEPARADOR_CAMPOS;
 
	////// Grabo impuesto sin separador de miles ni punto decimal /////
		$preTotalImpLiquidadoAux = number_format($totalesAlicuotasIva[$ultimaAlicuota],2,",",".");
		$preTotalImpLiquidado = str_replace(",", "", $preTotalImpLiquidadoAux);
		$preTotalImpLiquidado = str_replace(".", "", $preTotalImpLiquidado);
	$fileAlicuotas .= substr(str_pad($preTotalImpLiquidado, 15, "0", STR_PAD_LEFT), 0, 15); 		//CAMPO_6 -> Importe del Impuesto Liquidado -> cantidad 15 -> de 48 a 62
	$fileAlicuotas .= SEPARADOR_CAMPOS;
	//-------------------------------------------------------//
 
	$fileAlicuotas.="\r\n";
 
	foreach ($totalesNetosIva as $key => $value) {
		$totalesNetosIva[$key] = 0;
	}
 
	foreach ($totalesAlicuotasIva as $key => $value) {
		$totalesAlicuotasIva[$key] = 0;
	}
 
}
$fechaExplode = explode("/",$_POST["periodo"]);
file_put_contents($configuracion->getPathDuplicadoDigital().$fechaExplode[1]."-.$fechaExplode[0]."_alicuotas.txt",print_r($fileAlicuotas, true));

y parte del archivo txt resultante es:
00100006000000000000000057160000000002730000005000000000057330
00100006000000000000000057170000000000528580005000000000011100
00100006000000000000000057180000000005520000005000000000115920
001000060000000000000000571900000-1623737060005000000-34098478
00100006000000000000000057200000000000700000005000000000014700
00100006000000000000000057210000000001102660005000000000023156
00100006000000000000000057220000000000347740005000000000007303

donde se puede ver que en el registro del centro:

001000060000000000000000571900000-1623737060005000000-34098478

en lugar de grabar un par de importes (mayores que cero), graba un par de cifras en negativo que nada tienen que ver con los datos de origen.
Los importes vienen en campos tipo decimal(12,2) y en este caso debería haber grabado:
18016.50 y 9112.50, sin los puntos decimales, claro.

Espero me puedan ayudar. Desde ya muchas gracias.
Saludos cordiales,
Carlos
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Javier (orzo) Rodríguez
Val: 85
Ha disminuido su posición en 4 puestos en PHP (en relación al último mes)
Gráfica de PHP

Aleatoriamente graba mal un valor numérico en un TXT

Publicado por Javier (orzo) Rodríguez (25 intervenciones) el 04/10/2018 13:34:28
Hola, Carlos.

Tal como presentas tu código, parecería que los números vienen en negativo desde el origen, dado que no se produce ninguna conversión extraña a lo largo de él.

¿Puedes pasar un ejemplo de registro con los campos implicados -una $row-? Quizá eso pueda darnos una pista.

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 38
Ha disminuido su posición en 6 puestos en PHP (en relación al último mes)
Gráfica de PHP

Aleatoriamente graba mal un valor numérico en un TXT

Publicado por CARLOS (15 intervenciones) el 04/10/2018 18:48:29
Hola Javier,

Resulta que este código lo hizo otro programador y cuando estaba examinando el código para copiarte una parte más completa, descubro un error conceptual.
El problema se generaba porque en algunos registros puede venir un valor en el campo 'bonificacion', el cual puede ser un porcentaje (o sea un valor entre 0 y 100), o venir un importe en $$ que obviamente puede ser mayor. Entonces el código solo calculaba como si siempre viniera un porcentaje!!!

Bien... como suele pasar, al explicar el problema, descubrís vos mismo la solución.

Muchas gracias por tu tiempo!!!
Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Javier (orzo) Rodríguez
Val: 85
Ha disminuido su posición en 4 puestos en PHP (en relación al último mes)
Gráfica de PHP

Aleatoriamente graba mal un valor numérico en un TXT

Publicado por Javier (orzo) Rodríguez (25 intervenciones) el 04/10/2018 19:44:24
Hola, Carlos.
Me alegro de que hayas encontrado la solución por ti mismo.
No hay nada peor que mantener el código de un tercero ;-)
Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar