/bin/bash: indent: command not found /** * Prestatill Drive - Click & Collect * * Drive Module & Click & Collect for Prestashop * * @author La Boîte à Balises lbab.fr contact@lbab.fr * @copyright 2013-2018 La Boîte à Balises * @license La Boîte à Balises */ require_once _PS_MODULE_DIR_ . 'ineat_exceptional_hours/classes/ExceptionalHours.php'; require_once _PS_MODULE_DIR_ . 'ineat_delivery_restriction/classes/DeliveryRestriction.php'; require_once _PS_MODULE_DIR_ . 'prestatilldrive/classes/PrestatillDriveVacation.php'; class PrestatillDriveCreneau extends ObjectModel { public $id_creneau; public $id_store; public $id_week; public $id_day; public $id_order; public $id_cart; public $cause; public $hour; public $day; public static $definition = array( 'table' => 'prestatill_drive_creneau', 'primary' => 'id_creneau', 'multilang' => false, 'fields' => array( 'id_week' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId'), 'id_day' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId'), 'id_store' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId'), 'id_order' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId'), 'id_cart' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId'), 'cause' => array('type' => self::TYPE_STRING, 'validate' => 'isCatalogName', 'size' => 128), 'hour' => array('type' => self::TYPE_STRING, 'validate' => 'isCleanHtml'), 'day' => array('type' => self::TYPE_DATE, 'validate' => 'isDate'), ), ); public function __construct($id = null, $id_lang = null) { parent::__construct($id, $id_lang); } public static function getAllCreneauByIdCart($id_cart) { $request = 'SELECT id_creneau FROM '._DB_PREFIX_.'prestatill_drive_creneau WHERE id_cart = '.(int)$id_cart ; $result = Db::getInstance()->getRow($request); return $result; } /* * Récupérer un id_creneau à partir de la commande (id_order) */ public static function getCreneauByIdOrder($id_order = 0) { $request = 'SELECT id_creneau FROM '._DB_PREFIX_.'prestatill_drive_creneau WHERE id_order = '.(int)$id_order ; $result = Db::getInstance()->getRow($request); if (!empty($result)) { return new PrestatillDriveCreneau((int)$result['id_creneau']); } return false; } public static function updateCartCreneau($id_creneau, $id_cart) { $cart = new Cart((int)$id_cart); if (Validate::isLoadedObject((int)$id_cart)) { $cart->id_creneau = (int)$id_creneau; $cart->update(); } } public static function updateOrdersCreneau($id_creneau, $id_order, $id_cart) { $creneau = new PrestatillDriveCreneau((int)$id_creneau); if (Validate::isLoadedObject($creneau)) { if ($creneau->id_cart == (int)$id_cart) { $creneau->id_order = (int)$id_order; $creneau->update(); } $order = new Order((int)$id_order); if (Validate::isLoadedObject($order)) { $order->delivery_date = $creneau->day.' '.$creneau->hour; $order->update(); } } } public static function updateStoreByIdcreneau($id_store, $id_creneau) { setlocale(LC_TIME, 'fr_FR.utf8'); $date = date("Y-m-d"); if ($id_creneau == 0) { $creneau = new PrestatillDriveCreneau(); $creneau->id_cart = (int)Context::getContext()->cart->id; $creneau->day = $date; $creneau->save(); } else { $creneau = new PrestatillDriveCreneau((int)$id_creneau); } if (Validate::isLoadedObject($creneau)) { $creneau->id_store = (int)$id_store; $creneau->update(); return true; } } public static function updateOrdersState($id_order, $id_state) { $order = new Order((int)$id_order); if (Validate::isLoadedObject($order)) { $order->id_state = (int)$id_state; $order->update(); } } public static function countOrder($delivery_date) { $request = 'SELECT COUNT(id_order) FROM '._DB_PREFIX_.'orders WHERE delivery_date = "'.$delivery_date.'"'; $result = Db::getInstance()->executeS($request); return $result; } public static function getReservedCreneau($id_store) { $delivery_day = date('Y-m-d'); $request = 'SELECT id_week, id_day, day, hour FROM '._DB_PREFIX_.'prestatill_drive_creneau WHERE day >= "'.$delivery_day.'" AND id_order > 0 AND id_store ='.(int)$id_store; $result = Db::getInstance()->executeS($request); $table = array(); if(!empty($result)) { foreach($result as $res) { if(!isset($table[$res['day']." ".$res['hour']])) $table[$res['day']." ".$res['hour']] = 0; $table[$res['day']." ".$res['hour']] += 1; } return $table; } return $result; } public static function countCreneau($date, $date_fin) { $request = 'SELECT COUNT(hour), id_week, id_day, day, hour FROM '._DB_PREFIX_.'prestatill_drive_creneau WHERE day >= "'.pSQL($date).'" AND day <= "'.pSQL($date_fin).'" GROUP BY id_week, id_day, day, hour HAVING COUNT(hour) >= 100000;'; $result = Db::getInstance()->executeS($request); return $result; } // BEGIN OVERRIDE public static function getNbOrdersForAllSlots(?String $minimumDate = null) { $slots = []; $query = (new DbQuery()) ->select('delivery_date, COUNT(id_order) AS nbOrders') ->from('orders') ->groupBy('delivery_date') ; if ($minimumDate !== null) { $query->where('delivery_date >= \'' . pSQL($minimumDate) . '\''); } $orders = Db::getInstance()->executeS($query); foreach ($orders as $order) { $slots[$order['delivery_date']] = $order['nbOrders']; } return $slots; } public static function getAvailableSlotsByStore(int $storeId): array { $limitedTimeDelivery = Context::getContext()->cart->hasLimitedTimeProductDelivery(); $table = PrestatillDriveConfiguration::initTable($storeId, $limitedTimeDelivery); if (empty($table)) return []; $vacationDates = []; foreach ($table['vacations'] as $vacation) { $vacationDates[$vacation['vacation_start']] = $vacation['vacation_start']; $vacationDates[$vacation['vacation_end']] = $vacation['vacation_end']; if ($vacation['vacation_start'] !== $vacation['vacation_end']) { $vacationPeriod = new DatePeriod( new DateTime($vacation['vacation_start']), new DateInterval('P1D'), new DateTime($vacation['vacation_end']) ); foreach ($vacationPeriod as $vacationDay) { $vacationDates[$vacationDay->format('Y-m-d')] = $vacationDay->format('Y-m-d'); } } } $daysOpen = $table['open']; $startSlot = (new DateTime())->add(new DateInterval('PT' . $table['creneau_carence'] . 'M')); $nbOrdersForAllSlots = self::getNbOrdersForAllSlots($startSlot->format('Y-m-d H:i:s')); $daysWithExceptionalHours = ExceptionalHours::getDaysWithExceptionalHoursByStoreId($storeId); $daysWithDeliveryRestriction = DeliveryRestriction::getDaysWithRestrictionFromCart(Context::getContext()->cart); if ($storeId == (int) Configuration::get('GLOBALCONFIG_PARIS_STORE') || $storeId == (int) Configuration::get('GLOBALCONFIG_PARIS_BRETAGNE_STORE')) { $displayOnlyTheWeekEnd = DeliveryRestriction::cartContainsProductsOnlyAvailableTheWeekEnd(Context::getContext()->cart, true); } else { $displayOnlyTheWeekEnd = false; } if (!$displayOnlyTheWeekEnd) { $displayOnlyTheWeekEnd = DeliveryRestriction::cartContainsProductsOnlyAvailableTheWeekEnd(Context::getContext()->cart); } $displayOnlyForChristmasParis = $storeId == (int) Configuration::get('GLOBALCONFIG_PARIS_BRETAGNE_STORE') && DeliveryRestriction::cartContainsProductsOnlyAvailableForTheChrismasOnParis(Context::getContext()->cart) ; $days = []; foreach ($table['days'] as $day) { $days[$day['dateen']] = [ 'date' => $day['dateen'], 'presentedDate' => $day['date'], 'dayId' => $day['id_day'], 'slots' => [], ]; if ($displayOnlyForChristmasParis && !in_array($day['dateen'], ['2025-12-20', '2025-12-21', '2025-12-24', '2025-12-31'])) { continue; } if ( (!isset($daysOpen[$day['id_day']]) && !isset($daysWithExceptionalHours[$day['dateen']])) || isset($vacationDates[$day['dateen']]) || isset($daysWithDeliveryRestriction[$day['dateen']]) // Uniquement pour paris noel car ça tombe en semaine || $displayOnlyTheWeekEnd && ('2025-12-31' !== $day['dateen'] && '2025-12-24' !== $day['dateen'] && $day['id_day'] != 6 && $day['id_day'] != 7) ) continue; $openingDateAm = new DateTime($day['dateen'] . ' ' . ($daysWithExceptionalHours[$day['dateen']]['hour_open_am'] ?? $daysOpen[$day['id_day']]['hour_open_am']) ); $closingDateAm = new DateTime($day['dateen'] . ' ' . ($daysWithExceptionalHours[$day['dateen']]['hour_close_am'] ?? $daysOpen[$day['id_day']]['hour_close_am']) ); $slots = self::getSlotsBetweenDates($openingDateAm, $closingDateAm, $table['increment'], $startSlot, $nbOrdersForAllSlots); $openingDatePm = new DateTime($day['dateen'] . ' ' . ($daysWithExceptionalHours[$day['dateen']]['hour_open_pm'] ?? $daysOpen[$day['id_day']]['hour_open_pm']) ); $closingDatePm = new DateTime($day['dateen'] . ' ' . ($daysWithExceptionalHours[$day['dateen']]['hour_close_pm'] ?? $daysOpen[$day['id_day']]['hour_close_pm']) ); $slots = array_merge($slots, self::getSlotsBetweenDates($openingDatePm, $closingDatePm, $table['increment'], $startSlot, $nbOrdersForAllSlots)); $days[$day['dateen']]['slots'] = $slots; } return $days; } public static function getSlotsBetweenDates( DateTime $start, DateTime $end, int $interval, DateTime $minimunStartSlot, array $nbOrdersForAllSlots): array { $slots = []; while ($start < $end) { $slotStart = $start->format('H:i:s'); $slotStartDateTime = $start->format('Y-m-d H:i:s'); // Uniquement pour noel $hourSlot = $start->format('i') === '00' ? $start->format('Y-m-d H:30:s') : $start->format('Y-m-d H:00:s'); $start->add(new DateInterval('PT' . $interval . 'M')); if ($start <= $minimunStartSlot) continue; if (isset($nbOrdersForAllSlots[$slotStartDateTime]) && $nbOrdersForAllSlots[$slotStartDateTime] >= (int) Configuration::get('PRESTATILL_DRIVE_NB_DISPO')) continue; // Uniquement pour noel if (isset($nbOrdersForAllSlots[$slotStartDateTime]) && isset($nbOrdersForAllSlots[$hourSlot])) { if ($nbOrdersForAllSlots[$slotStartDateTime] + $nbOrdersForAllSlots[$hourSlot] >= (int) Configuration::get('PRESTATILL_DRIVE_NB_DISPO')) continue; } $slots[] = [ 'presentedSlot' => $slotStart . ' - ' . ($start < $end ? $start->format('H:i:s') : $end->format('H:i:s')), 'hour' => $slotStart, 'datetime' => $slotStartDateTime, ]; } return $slots; } // END OVERRIDE } Confiture Abricots et Amandes (230g) - Méert

Confiture Abricots et Amandes (230g)

Confiture d'abricots et d'amandes Confiture d'abricots et d'amandes m... Plus de détails

Prix : ( x 9,90 €)

Détails du produit

Confiture d'abricots et d'amandes

Confiture d'abricots et d'amandes maison pour vous régaler aux petits-déjeuners ou aux goûters.

Pot de 230g | Expédition en France et en Europe

Raffinement & gourmandise

Les confitures Méert sont élaborées dans nos ateliers de façon artisanale et selon une recette traditionnelle. Les fruits que nous utilisons sont exclusivement d'origine française. La plupart sont issus de l'agriculture biologique. Nos confitures sont garanties sans conservateurs.