PHP script om volgende leverdag te bepalen sluit maar 1 vakantiedag uit.
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)
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
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;
}
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;
}
Code (php)
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
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 );
?>
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
Code (php)
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
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;
}
?>
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