Bezorgdatum kiezen

1
Graag wil ik klanten de mogelijkheid bieden om zelf een bezorgdatum te kiezen. Heeft iemand suggesties voor "best practices"? Hoeveel dagen bied je bijvoorbeeld aan? Twee weken of drie maanden? En in welke vorm doe je dat: een keuzelijst of een kalender?
StoreCore.io

Re: Bezorgdatum kiezen

2
Je kunt gebruik maken van de postnl Checkout.
Hierdoor kun je de klant zelf een adres laten invullen en automatisch worden de mogelijke bezorgtijden zichtbaar.

Helaas werkte dit bij mij niet, omdat de levertijd niet automatisch wordt verlengd, zodra het product een langere levertijd heeft.

An sich werkt de checkout prima, als je alles op voorraad hebt, of je website zou kunt ombouwen dat de levertijd langer wordt.
e-messen.nl, de webshop vooral uw keukenmessen, snijplanken en messenblokken

Re: Bezorgdatum kiezen

3
Ik zou het doen met een dropdown, keuzelijst dus. Niet met een agenda.
En hierbij 7 werkdagen aanhouden. Als je kan, hier ook nog de tijdstippen bij zetten.

Re: Bezorgdatum kiezen

4
Wij zijn hier ook mee bezig. Ik heb bedacht om de komende twee weken als optie te laten zien, met doorklik mogelijkheid om nog eer weken/maanden te laten zien.

Ook ben ik nog aan het bedenken hoe ik dit logistiek gezien ga aanpakken. Pak ik alle bestellingen alvast in en zet ik ze op karren, waar elke kar dan voor een bepaalde verzenddag is? Of laat ik de producten nog op hun locatie in het magazijn liggen met het risico dat ze (per ongeluk, of juist bewust) voor een andere bestelling gepakt gaan worden waardoor ik op de verzenddag misschien met te weinig voorraad zit? Of moet ik ze "hard" reserveren, waardoor ze niet voor andere bestellingen gepakt worden met het risico dat ik iets 2 maanden lang aan het opslaan ben voor een klant?
Advertentie

Met Shopify maak je zelf je eigen webwinkel dankzij meer dan honderd thema’s en de complete appstore. Shopify sluit ook goed aan op dropshippers. De software is technisch volledig SEO-geoptimaliseerd en biedt alle sociale media-integraties. Meer info op Shopify.com.

Re: Bezorgdatum kiezen

5
Het optimale tijdvak kiezen is inderdaad lastig. De grote verkooppiek voor pakjesavond begint medio oktober in de herfstvakantie. Een periode van 6 weken aanbieden is misschien echter te veel van het goede, ook omdat met name koopjesjagers dan nog wekenlang de tijd hebben om de koop te annuleren zodra ze elders iets anders hebben gekocht. Met andere woorden: hoe langer het tijdvak, hoe groter het risico dat het bestelsysteem wordt gebruikt als vrijblijvend reserveringssysteem.

De fulfilment houden we eenvoudig. Een order wordt pas ingeschoten op de dag voorafgaand aan de bezorgdag.

Re: Bezorgdatum kiezen

6
Wanneer je het dus gaat limiteren tot 7 werkdagen is dat risico er niet. Lijkt me ook niet dat er vanuit klanten vraag komt om 2 maanden iets op te slaan?

Ik zou de artikelen hard reserveren maar niet al inpakken en in de 'kar' leggen. Immers, wat als de klant 3 dagen later nog mailt voor een annulering? Kun je alles gaan uitpakken.

Re: Bezorgdatum kiezen

7
Meer dan een paar dagen is toch ook niet nodig.
Het is alleen maar voor als ze op dinsdag en woensdag weg zijn en maandag bestellen dat ze donderdag als dag kunnen opgeven.
Is het meer dagen dan bestellen ze maar een week later.
En is het trouwens geen nadeel dat je dan ook echt op die dag moet bezorgen. Als de post dan een dag later is heb je een probleem.

Re: Bezorgdatum kiezen

8
RicardoV schreef:Wanneer je het dus gaat limiteren tot 7 werkdagen is dat risico er niet. Lijkt me ook niet dat er vanuit klanten vraag komt om 2 maanden iets op te slaan?
Bij ons dus wel. Bedrijven die over 2 maanden een project beginnen en graag dan pas de kabels willen ontvangen.

Re: Bezorgdatum kiezen

9
Onderstaande PHP-listing is alvast een aanzet voor een datumprikker.

Ben ik misschien een (wettelijke) feestdag vergeten?

Code: Selecteer alles

<?php
/**
 * Bezorgdatum prikken
 *
 * Bestellingen kunnen worden bezorgd op dinsdag tot en met zaterdag.
 * Maandag is bij PostNL geen bezorgdag meer voor de eerste afleverpoging.
 * Bovendien worden bestellingen niet verzonden op zaterdag of zondag,
 * maar pas de maandag erop, zodat ze toch pas op dinsdag worden bezorgd.
 *
 * @author  Ward van der Put <http://twitter.com/bloknood>
 * @license http://opensource.org/licenses/GPL-3.0 GNU General Public License
 * @version 0.1
 */
class StoreCore_Shipping_Bezorgdatum
{
    /**
     * @var array
     */
    private $DeliveryDays = array();

    /**
     * @param  void
     * @return object
     */
    public function __construct()
    {
        $current_year = (int) date('Y');
        $next_year = $current_year + 1;

        $easter_date_current_year = $this->getEasterDate($current_year);
        $easter_date_next_year = $this->getEasterDate($next_year);

        $holidays = array();

        // Nieuwjaarsdag: 1 januari
        $holidays[] = mktime(0, 0, 0, 1, 1, $current_year);
        $holidays[] = mktime(0, 0, 0, 1, 1, $next_year);
        // Dag na nieuwjaarsdag: 2 januari
        $holidays[] = mktime(0, 0, 0, 1, 2, $current_year);
        $holidays[] = mktime(0, 0, 0, 1, 2, $next_year);

        // Eerste paasdag: paaszondag
        $holidays[] = $easter_date_current_year;
        $holidays[] = $easter_date_next_year;
        // Tweede paasdag: paasmaandag
        $holidays[] = $easter_date_current_year + 86400;
        $holidays[] = $easter_date_next_year    + 86400;
        // Dinsdag na tweede paasdag
        $holidays[] = $easter_date_current_year + 2 * 86400;
        $holidays[] = $easter_date_next_year    + 2 * 86400;

        // Koninginnedag: 30 april
        $holidays[] = mktime(0, 0, 0, 4, 30, $current_year);
        $holidays[] = mktime(0, 0, 0, 4, 30, $next_year);
        // Dag na koninginnedag en Dag van de Arbeid: 1 mei
        $holidays[] = mktime(0, 0, 0, 5, 1, $current_year);
        $holidays[] = mktime(0, 0, 0, 5, 1, $next_year);

        // Bevrijdingsdag: 5 mei
        $holidays[] = mktime(0, 0, 0, 5, 5, $current_year);
        $holidays[] = mktime(0, 0, 0, 5, 5, $next_year);
        // Dag na bevrijdingsdag: 6 mei
        $holidays[] = mktime(0, 0, 0, 5, 6, $current_year);
        $holidays[] = mktime(0, 0, 0, 5, 6, $next_year);

        // Hemelvaartsdag: 39 dagen na eerste paasdag
        $holidays[] = $easter_date_current_year + 39 * 86400;
        $holidays[] = $easter_date_next_year    + 39 * 86400;

        // Eerste pinksterdag (pinksterzondag): 49 dagen na eerste paasdag
        $holidays[] = $easter_date_current_year + 49 * 86400;
        $holidays[] = $easter_date_next_year    + 49 * 86400;
        // Tweede pinksterdag (pinkstermaandag): 50 dagen na eerste paasdag
        $holidays[] = $easter_date_current_year + 50 * 86400;
        $holidays[] = $easter_date_next_year    + 50 * 86400;
        // Dinsdag na tweede pinksterdag: 51 dagen na eerste paasdag
        $holidays[] = $easter_date_current_year + 51 * 86400;
        $holidays[] = $easter_date_next_year    + 51 * 86400;

        // Eerste kerstdag: 25 december
        $holidays[] = mktime(0, 0, 0, 12, 25, $current_year);
        $holidays[] = mktime(0, 0, 0, 12, 25, $next_year);
        // Tweede kerstdag: 26 december
        $holidays[] = mktime(0, 0, 0, 12, 26, $current_year);
        $holidays[] = mktime(0, 0, 0, 12, 26, $next_year);
        // Dag na tweede kerstdag: 27 december
        $holidays[] = mktime(0, 0, 0, 12, 27, $current_year);
        $holidays[] = mktime(0, 0, 0, 12, 27, $next_year);

        /**
         * Dagelijkse deadline voor de fulfilment van orders.
         * Voor 16:00 uur is morgen de eerste bezorgdag en
         * na 16:00 uur wordt overmorgen de eerstvolgende bezorgdag.
         *
         * @todo Eventueel 16 vervangen door (configuratie)constante.
         */
        if (date('G') < 16) {
            $first_day = mktime(0, 0, 0, date('n'), date('j'), date('Y')) + 86400;
        } else {
            $first_day = mktime(0, 0, 0, date('n'), date('j'), date('Y')) + 2 * 86400;
        }

        $search = array(
            'tuesday', 'wednesday', 'thursday', 'friday', 'saturday',
            'january', 'february', 'march', 'may', 'june', 'july', 'august', 'october'
        );
        $replace = array(
            'dinsdag', 'woensdag', 'donderdag', 'vrijdag', 'zaterdag',
            'januari', 'februari', 'maart', 'mei', 'juni', 'juli', 'augustus', 'oktober'
        );

        $delivery_days = array();
        for ($day = $first_day; $day < $first_day + (366 * 86400); $day = $day + 86400) {
            /**
             * De functie date('w', $day) retourneert de dagen van de week genummerd
             * van 0 (zondag) t/m 6 (zaterdag).  Bezorgen is mogelijk op dinsdag (2)
             * t/m zaterdag (6), dus niet op zondag (0) of maandag (1).
             */
            if (date('w', $day) > 1) {
                if (!in_array($day, $holidays)) {
                    $delivery_days[date('Y-m-d', $day)] =  str_ireplace($search, $replace, strtolower(date('l j F Y', $day)));
                }
            }

            if (count($delivery_days) >= 12) {
                break;
            }
        }
        $this->DeliveryDays = $delivery_days;
    }

    /**
     * @param  void
     * @return string
     */
    public function __toString()
    {
        return $this->getSelect();
    }

    /**
     * @param  int $year
     * @return int
     */
    public static function getEasterDate($year)
    {
        if (function_exists('easter_date')) {
            return easter_date($year);
        }
        
        /**
         * Bereken de datum van eerste paasdag (paaszondag) met het algoritme
         * van Delambre.
         *
         * @link http://www.php.net/manual/en/function.easter-days.php
         */
        $a = $year % 19; 
        $b = floor($year / 100); 
        $c = $year % 100; 
        $d = floor($b / 4); 
        $e = $b % 4; 
        $f = floor(($b + 8) / 25); 
        $g = floor(($b - $f + 1) / 3); 
        $h = (19 * $a + $b - $d - $g + 15) % 30; 
        $i = floor($c / 4); 
        $k = $c % 4; 
        $l = (32 + 2 * $e + 2 * $i - $h - $k) % 7; 
        $m = floor(($a + 11 * $h + 22 * $l) / 451); 
        $n = ($h + $l - 7 * $m + 114); 
        $month = floor($n / 31); 
        $day = $n % 31 + 1;

        return mktime(0, 0, 0, $month, $day, $year);
    }

    /**
     * @param  string $id
     * @return string
     */
    public function getSelect($id = 'Ecom_ShipTo_DeliveryDate')
    {
        $return = '<label for="' . $id . '">Gewenste bezorgdatum: <br>';
        $return .= '<select id="' . $id . '" name="' . $id . '">';
        $delivery_days = $this->DeliveryDays;
        foreach ($delivery_days as $key => $value) {
            $return .= '<option ';
            if (isset($_POST[$id]) && $_POST[$id] === $key) {
                $return .= 'selected ';
            }
            $return .= 'value="' . $key . '">' . $value . '</option>';
        }
        $return .= '</select>';
        $return .= '</label>';
        return $return;
    }
}

Re: Bezorgdatum kiezen

11
PaulG schreef:Zie niet zo gauw een dag die je vergeet wel dat koningsdag op de verkeerde datum staat :)
Dank je wel! Dat moet er inderdaad in: koningsdag is 27 april of 28 april wanneer 27 april een zondag is.

Re: Bezorgdatum kiezen

13
inetverhuurshop schreef:Dag vd arbeid hebben we in Nederland toch geen last van?
Klopt, 1 mei stond erin als de dag na koninginnedag op 30 april en moet nu wijken voor de dag na koningsdag op 27 of 28 april.

Re: Bezorgdatum kiezen

14
Wouter Hol schreef:
RicardoV schreef:Wanneer je het dus gaat limiteren tot 7 werkdagen is dat risico er niet. Lijkt me ook niet dat er vanuit klanten vraag komt om 2 maanden iets op te slaan?
Bij ons dus wel. Bedrijven die over 2 maanden een project beginnen en graag dan pas de kabels willen ontvangen.
Ja de zakelijke tak. Die bestellen ook via jullie website dan? Zou zeggen dat dat niet via de website gaat.

Dan kun je misschien beter een agenda kiezen. Een dropdown werkt alleen voor een aantal dagen..

Re: Bezorgdatum kiezen

15
Kleine update. Aangezien we veel werkende tweeverdieners (ouders) onder onze klanten hebben, heb ik een nieuwe beslissingsregel toegevoegd. Er worden in totaal drie zaterdagen aangeboden. Daarmee kan de klant kiezen uit 11 t/m 15 bezorgdatums, afhankelijk van de besteldag.