Calcul des jours fériés dans ZF/Magento

Je décris ici une méthode permettant de situer un jour férié en France, utile dans le calcul d'une date de livraison par exemple.
Qui parle de coïncidence avec le mois de mai ? 🙂

Cette méthode s'applique à Zend Framework, donc facilement déclinable sous Magento.
On va se baser sur la fonction PHP easter_date qui retourne le dimanche de Pâques pour une année donnée, duquel découle trois autres jours fériés.

Version ZF

Voici la méthode :

    /**
     * Is given date a public holiday?
     *
     * @param mixed $date
     * @param int $dayToAdd
     * @return bool
     */
    public function isPublicHoliday($date = null, $dayToAdd = 0)
    {
        $date = new Zend_Date($date);
        $year = new Zend_Date($date)->subDay($dayToAdd)->toString(Zend_Date::YEAR);
        $easterDate = easter_date($year); // dimanche de paques 
        $holidays = array(); // jours fériés
        $holidays[] = new Zend_Date($year . '-01-01'); // jour de l'an
        $holidays[] = new Zend_Date($year . '-05-01'); // fete du travail
        $holidays[] = new Zend_Date($year . '-05-08'); // fete de la victoire 1945
        $holidays[] = new Zend_Date($year . '-07-14'); // fete nationale
        $holidays[] = new Zend_Date($year . '-08-15'); // assomption
        $holidays[] = new Zend_Date($year . '-11-01'); // toussaint
        $holidays[] = new Zend_Date($year . '-11-11'); // fete de l'armistice 1918
        $holidays[] = new Zend_Date($year . '-12-25'); // jour de noel
        $holidays[] = new Zend_Date($easterDate)->addDay(1); // lundi de paques
        $holidays[] = new Zend_Date($easterDate)->addDay(39); // jeudi de l'ascension
        $holidays[] = new Zend_Date($easterDate)->addDay(50); // lundi de pentecote 
        foreach ($holidays as $holiday) {
            if ($holiday->addDay($dayToAdd)->compareDate($date) == 0)
                return true;
        }
        return false;
    }


* Particularité Alsace/Moselle

Pour ceux qui ont la chance d'habiter en Alsace ou Moselle, il faut ajouter les 2 lignes suivantes :
        $holidays[] = new Zend_Date($year . '-12-26'); // saint etienne
        $holidays[] = new Zend_Date($easterDate)->subDay(2); // vendredi saint

* Avant et après les dates fériées

Le paramétrage dayToAdd permet d'ajouter ou de retrancher des jours aux dates fériées, par exemple pour déterminer une veille ou un lendemain de jour férié.
Note : On remarquera l'opération inverse avec la date donnée en paramètre pour tomber la même année (cas du 31 décembre, veille de jour férié).
Toujours dans ZF, on ajoutera un helper de contrôleur par exemple, soit :

/**
 * Public holiday action helper
 */
class PublicHoliday extends Zend_Controller_Action_Helper_Abstract
{
    public function isPublicHoliday($date = null, $dayToAdd = 0)
    {
        ...
    }
    /**
     * Helper default call
     */
    public function direct($date = null, $dayToAdd = 0)
    {
        return $this->isPublicHoliday($date, $dayToAdd);
    }
}

A l'intérieur d'un contrôleur, l'appel se fera ainsi :
$this->_helper->PublicHoliday();
A l'intérieur d'un modèle, l'appel se fera ainsi :

$publicHoliday = Zend_Controller_Action_HelperBroker::getStaticHelper('PublicHoliday');
$publicHoliday->isPublicHoliday();

 

Cas d'utilisation

Voici quelques exemples :
Est-ce qu'aujourd'hui est un jour férié ?
$this->_helper->PublicHoliday();
Est-ce que demain est un jour férié ?
$this->_helper->PublicHoliday(Zend_Date::now()->addDay(1));
Est-ce qu'aujourd'hui est un lendemain de jour férié ?
$this->_helper->PublicHoliday(Zend_Date::now(), 1);
Est-ce qu'hier était une avant-veille de jour férié ?
$this->_helper->PublicHoliday(Zend_Date::now()->subDay(1), -2);

 

Version Magento

En Magento, on ajoutera cette méthode dans le helper du module Core par exemple, que nous aurons pris soin de rewriter bien-sûr.

/**
 * Core data helper
 *
 * @category    Netapsys
 * @package     Netapsys_Core
 */
class Netapsys_Core_Helper_Data extends Mage_Core_Helper_Data
{
    public function isPublicHoliday($date = null, $dayToAdd = 0)
    {
        ...
    }
}

Les appels seront donc de la forme :
Mage::helper('core')->isPublicHoliday();
Au préalable, afin d'utiliser le fuseau horaire géré dans Magento, il conviendra de remplacer chaque :
new Zend_Date(...)
par :
Mage::app()->getLocale()->date(...)
Si vous avez des remarques, n'hésitez pas !

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Captcha *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.