PHP script om volgende leverdag te bepalen sluit maar 1 vakantiedag uit.

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Van Sebas

Van Sebas

30/12/2022 07:57:28
Quote Anchor link
Goedemorgen,

Met behulp van google heb bezig om een PHP script te maken waarmee ik op mijn webshop de eerst volgende mogelijke leverdatum wil tonen. Hierbij wil ik altijd de zondag uitsluiten en enkele feestdagen waarop we dicht zijn en dus geen bestellingen versturen. Nu heb ik het onderstaande script gemaakt en dit werkt op zich prima maar heeft nog een klein probleem en dat is als er twee feestdagen achter elkaar zijn wordt de tweede feestdag niet meegenomen.

Als voorbeeld als ik vandaag (30 december) het open dan zou de eerst volgende leverdatum 3 januari moeten zijn, dit omdat we 31 december en 1 januari gesloten zijn en dus niets versturen en pas weer bestellingen versturen op 2 januari en dus zou de eerst mogelijke leverdatum 3 januari moeten zijn. Maar omdat er meerdere vakantiedagen achter elkaar vallen wordt dit niet meegenomen in het onderstaande script.

Kan iemand mij misschien op weg helpen hoe ik dit kan verwerken in het onderstaande script?

Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
function NextDeliveryDay() {
    date_default_timezone_set('Europe/Amsterdam');
    setlocale(LC_TIME, 'NL_nl');
    $months = [
        'January' => 'januari',
        'February' => 'februari',
        'March' => 'maart',
        'April' => 'april',
        'May' => 'mei',
        'June' => 'juni',
        'July' => 'juli',
        'August' => 'augustus',
        'September' => 'september',
        'October' => 'oktober',
        'November' => 'november',
        'December' => 'december'
    ];
    
    $today = date('Y-n-j');
    $today = strtotime($today);
    
    $holidays = array("2022-1-1","2022-12-31","2023-1-1","2023-1-2");
    $holiday_ts = strtotime($holidays);

    // if holiday falls between start date and new date, then account for it
    if ($holiday_ts >= strtotime($today) && $holiday_ts <= strtotime($new_date)) {

        // check if the holiday falls on a working day
        $h = date('w', $holiday_ts);
            if ($h != 0 && $h != 6 ) {
            // holiday falls on a working day, add an extra working day
            $new_date = date('j F Y', strtotime("{$new_date} + 1 weekdays"));
            $new_date = str_replace(array_keys($months), array_values($months), $new_date);
        }
    }

    return $new_date;
}
 
PHP hulp

PHP hulp

27/12/2024 08:59:32
 
Ward van der Put
Moderator

Ward van der Put

30/12/2022 10:01:08
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
49
<?php

declare(strict_types=1);

class DeliveryDateFactory
{
    public const HOLIDAYS = [
        '2022-01-01',
        '2022-12-31',
        '2023-01-01',
        '2023-01-02',
    ];


    public readonly \DateTimeInterface $deliveryDate;
    
    public readonly \DateTimeInterface $shippingDate;
    
    public readonly \DateTimeZone $timezone;
    
    public function __construct()
    {

        // Today in the Netherlands.
        $this->timezone = new \DateTimeZone('Europe/Amsterdam');
        $today = new \DateTimeImmutable('now', $this->timezone);

        // Find next business day to ship by adding one weekday.
        $this->shippingDate = \DateTime::createFromImmutable($today);
        do {
            $this->shippingDate->modify('+1 weekday');
        }
while (in_array($this->shippingDate->format('Y-m-d'), self::HOLIDAYS));
        
        // Delivery date is shipping date plus one extra day.
        $this->deliveryDate = \DateTime::createFromInterface($this->shippingDate);
        $this->deliveryDate->add(new \DateInterval('P1D'));
    }


    public static function getNextDeliveryDate(): \DateTimeInterface
    {
        $factory = new DeliveryDateFactory();
        return $factory->deliveryDate;
    }
}



// Gebruik
$bezorgdatum = DeliveryDateFactory::getNextDeliveryDate();
var_dump( $bezorgdatum );

?>
Gewijzigd op 30/12/2022 10:13:29 door Ward van der Put
 
Jan R

Jan R

30/12/2022 11:34:37
Quote Anchor link
Ik heb hier een formuleke voor gemaakt. Met count weet je onmiddellijk hoeveel dagen er zijn.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
49
50
51
52
<?php
    echo '<pre>' . print_r(feestdagen(strtotime('2022-01-01'), strtotime('2023-12-31')), true) . '</pre>';
    function
feestdagen($from1, $to1) {
        $from = new \DateTime();
        $from->setTimestamp($from1);

        $to = new \DateTime();
        $to->setTimestamp($to1);
        
        $a = array();
        
        for($j=(int)$from->format('Y');$j<=(int)$to->format('Y');$j++) {
            // berekend
            $pasen = new \DateTime();
            $pasen->setTimestamp(easter_date($j)); // bedankt PHP
            $paasMaandag = clone $pasen;
            $paasMaandag->add(new \DateInterVal('P1D')); // 1 dag na pasen
            $olhHemelvaart = clone $pasen;
            $olhHemelvaart->add(new \DateInterVal('P39D')); // 39 dagen na pasen
            $pinksteren = clone $olhHemelvaart;
            $pinksteren->add(new \DateInterVal('P10D')); // 10 dagen na OLH hemelvaart
            $pinksterMaandag = clone $pinksteren;
            $pinksterMaandag->add(new \DateInterVal('P1D')); // 1 dag na pinksteren

            $a['Paasmaandag ' . $j] = $paasMaandag;
            $a['O.H. Hemelvaart ' . $j] = $olhHemelvaart;
            $a['Pinkstermaandag ' . $j] = $pinksterMaandag;
            
            $a['Nieuwjaar ' . $j] = new \DateTime($j . "-01-01");
            $a['Dag van de Arbeid ' . $j] = new \DateTime($j . "-05-01");;
            $a['Allerheiligen ' . $j] = new \DateTime($j . "-11-01");
            $a['Wapenstilstand ' . $j] = new \DateTime($j . "-11-11");
            $a['Kerstmis ' . $j] = new \DateTime($j . "-12-25");
            $a['Nationale feestdag ' . $j] = new \DateTime($j . "-07-21");;
            $a['Onze lieve vrouw hemelvaart ' . $j] = new \DateTime($j . "-08-15");;
        }

        
        foreach($a as $k=>$b) {
            if($b<$from || $b>$to) {unset($a[$k]);}
        }

        
        uasort($a, function($a, $b) {
            if ($a == $b) {
                return 0;
            }


            return $a < $b ? -1 : 1;
        });

        
        return $a;
    }

?>

Jan
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.