Pregunta

Tengo 2 zonas de envío, los pedidos de A y B. para la Zona A se entregan todos los lunes, miércoles y viernes, mientras que la Zona B es el martes, jueves y sábado. Para cada pedido, el día de entrega está programado para el próximo día disponible, dependiendo de la zona. Tenga en cuenta que si alguien realiza un pedido el lunes, los productos se entregarán en la próxima fecha disponible, eso sería el martes para la Zona B y el miércoles para la Zona A.

Pero: si se realiza un pedido más tarde de las 18:00 (6pm) y el área del cliente está dentro de la zona de entrega de mañana, luego tenemos que avanzar en la fecha de entrega al próximo día disponible Para esa zona (porque el pedido no estará listo todavía, demasiado corto).

Aquí está el código y funciona bien, excepto en la última parte donde necesito verificar la hora, obtener la fecha de entrega regular y compararlo con la fecha de mañana.

<? 
$date = array(date("d"), date("m"), date("Y"));

$zones = array("A" => array(1 => "Monday",    
                            3 => "Wednesday", 
                            5 => "Friday")     

              ,"B" => array(2 => "Tuesday",    
                            4 => "Thursday",   
                            6 => "Saturday")); 

$found = false;
$days_plus = 1; // always begin from next day

// Retrieve last day from the zone
end($zones[$zone]); //Friday or Saturday
$last_day = key($zones[$zone]); //5 or 6

do {
    $mk = mktime(0, 0, 0, $date[1], ($date[0] + $days_plus), $date[2]);
    $week = date("w", $mk); // current day of week 

    if ($week <= $last_day) // if weekday not passed last day of zone
    {
        if (!isset($zones[$zone][$week]))
        {
            $days_plus++;
        }
        else
        {
            $found = true;
            $day = $last_day;
        }
    }
    else
    {
        $days_plus++;
    }
} while (!$found);

$deliverydate = date("d/m/Y", $mk); // regular delivery date
$tomorrow = date('d/m/Y', strtotime('tomorrow')); 

//Now, check if order is placed after 6pm 
if ((date("d/m/Y", $mk)==$tomorrow) && (date('G') > 18)) {
    // HERE'S my problem, how do I advance the
    //delivery date to next day in the same zone?
}
echo $deliverydate; 
?>

Nota: Intenté convertir el bucle en una función FindNextDay ($ Days_Plus, $ Date, $ Last_day, $ Zone) para que pudiera volver a llamarlo con un valor diferente de $ Days_Plus (aumentado por x días) pero no pude obtenerlo trabajar. Para cualquier persona interesada Aquí está la versión modificada

¿Fue útil?

Solución

Así es como lo haría.

NOTA
No di mucho tiempo para descubrir la mejor manera de manejar todas las reglas comerciales, pero todas mis pruebas parecían funcionar.

<?php


error_reporting(E_ALL);
ini_set('display_errors','On');

date_default_timezone_set('America/Los_Angeles');

$zones = array('A', 'B');
$zone_key = array_rand($zones);
$zone = $zones[$zone_key];


function getDeliveryDate($zone, $d = NULL, $time = NULL) {
    if ($time === NULL) 
        $time = date('G');
    if ($d === NULL)
        $now = strtotime('now');
    else
        $now = strtotime($d);
    $d = date('w', $now);
    $days = 1;
    if ($zone == 'A') {
        if ($d % 2) $days += 1;
        else if ($time > 18) $days += 2;

        if ($d + $days == 7) $days += 1;
        elseif ($d + $days > 7) $days -= 1;
    } else {
        if (! ($d % 2)) $days += 1;
        else if ($time > 18) $days += 2;
        if ($d + $days > 7) $days += 1;
    }

    $delivery_date = strtotime("+${days}days", $now);

    echo "For zone $zone, schedule on " . date('D', $now) . ", at $time, will deliver on " . date('m-d-Y', $delivery_date) . " which is a " . date('D', $delivery_date) . "\n";
}

$days = array('10/16/2011', '10/17/2011', '10/18/2011', '10/19/2011', '10/20/2011', '10/21/2011', '10/22/2011');
$times = array(17, 20);

foreach ($zones as $zone) {
    foreach ($days as $d) {
        foreach ($times as $t) {
            getDeliveryDate($zone, $d, $t);
        }
    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top