Ver Mensaje Individual
  #1 (permalink)  
Antiguo 27/03/2014, 02:40
jsusarevalo
 
Fecha de Ingreso: diciembre-2011
Ubicación: Madrid
Mensajes: 46
Antigüedad: 12 años, 5 meses
Puntos: 1
Cálculos en sistema de pedido

Hola a tod@s,

Tengo un sistema de pedidos que me calcula los precios en base a unas características. Una de ellas es un cálculo de precio en base a unas medidas.

Fabricamos productos de 2, 3 y 4 paradas, de tal forma que necesitamos calcular el coste de los tramos intermedios entre estas paradas, por lo que a priori,

Si es un 2 paradas tiene un tramo intermedio
Si es un 3 paradas tiene dos tramos intermedios
Si es un 4 paradsa tiene tres tramos intermedios

El precio del tramo intermedio está compuesto por dos costes diferentes:
Coste por la ejecución de los primeros 14cm
Coste por cm adicional a esos 14cm

Hasta aquí todo está correctamente funcionando.

El problema viene cuando por ejemplo, un cliente pide un 2 paradas, pero con un tramo intermedio superior a 2000mm, ya que solo nos es posible fabricar tramos de esta medida como máximo, de tal forma que necesitamos fabricar dos tramos intermedios a pesar de que es un 2 paradas (normalmente lleva uno).

Por lo tanto necesitamos cobrar 2 veces el coste de ejecución de los primeros 14cm, y despues los cm adicionales para cada intermedio.

Para más inri las medidas que nos dan los clientes siempre son de suelo a suelo, y nosotros restamos siempre 2340mm. Ejemplo: Dos paradas con distancia de suelo a suelo de 3300 --> el tramo intermedio a fabricar será 3300 - 2340 = 960mm, lo pasamos a cm 960/10 = 96cm

De estos 96cm restamos 14cm y cobramos 200 euros por esa ejecución.
96-14 = 82 cm , estos 82 cm los multiplicamos por el coste por cm 82 * 2 = 164 euros

De tal forma que el coste de este tramo sería 200 + 164 =364 euros.

En el caso de que fuese 3 o 4 paradas aplicaríamos la misma operación para los otros tramos y sumaríamos los importes.

En el caso que se nos plantea, imaginad un 2 parada con distancia 6690mm

Cómo solo podemos fabricar tramos de 2000, sucede lo siguiente:

6690 - 2340 = 4350 de tramo intermedio que estará compuesto por:

un tramo de 2000mm
otro tramo de 2000mm
otro tramo de 350mm

De tal forma que para un dos paradas, que normalmente tiene un intermedio, en este caso tenemos tres.

El primer tramo de 2000mm tendría un coste de: (pasamos a cm 2000/10=200)
Ejecución de los primeros 14cm = 200 euros
200 -14= 186cm * coste por cm 2 euros = 372 euros
Total del primer tramo = 572 euros

El segundo tramo como es de 2000mm tendría el mismo coste 572 euros

El tercer tramo de 350mm / 10 = 35 cm
Ejecución de los primeros los primeros 14cm = 200 euros
35 - 14 = 24cm * coste por cm 2 euros = 48 euros

Total del tercer tramo 248 euros

De tal forma que el precio de los intermedios sería 1392 euros.

Tengo este código para el caso de un 4 paradas.

Código PHP:
break;
      case '4':
        precio_total += <?=(@mysql_result(@mysql_query("SELECT precio_coste FROM productos WHERE (id='8')",$conexion),0,'precio_coste'));?>;
        document.getElementById('capa-desglose').innerHTML += '<div align="left" class="mt10 menu-izq-enlace-activo">PVE UB52 de 4 paradas</div>';

        var total_intermedios=474.60*3;
        if(como_son_medidas=="aproximadas")
        {
            if(p0_medida_aproximada!="" && p1_medida_aproximada!=""  && p2_medida_aproximada!="" && p3_medida_aproximada!="")
            {
                var total_ejecucion=((((p0_medida_aproximada-2340)/10) + ((p1_medida_aproximada-2340)/10) + ((p2_medida_aproximada-2340)/10))-42) * 4.27;

        if (total_ejecucion > 4340 && total_ejecucion < 6340 ){
          total_ejecucion += (474.60*2);
        }
        else if (total_ejecucion >= 6340 && total_ejecucion < 8340){
          total_ejecucion += (474.60*3);
        }
        else if (total_ejecucion >= 8340 && total_ejecucion < 10340){
          total_ejecucion += (474.60*4);
        }
        else if (total_ejecucion >= 10340){
          total_ejecucion += (474.60*5);
        }
                precio_total +=(total_intermedios+total_ejecucion);