223 lines
9.8 KiB
PHP
223 lines
9.8 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
/** @var string $dbStatus */
|
|
/** @var array<int, array<string, mixed>> $categories */
|
|
/** @var array<int, array<string, mixed>> $catalogProducts */
|
|
/** @var array<int, array<string, mixed>> $popularProducts */
|
|
/** @var array<string, mixed> $settings */
|
|
/** @var string|null $notice */
|
|
/** @var string $buildVersion */
|
|
$timezone = new DateTimeZone('Europe/Moscow');
|
|
$now = new DateTimeImmutable('now', $timezone);
|
|
$lastArrival = new DateTimeImmutable('today', $timezone);
|
|
|
|
$previousWorkingDay = static function (DateTimeImmutable $date): DateTimeImmutable {
|
|
do {
|
|
$date = $date->modify('-1 day');
|
|
} while ((int) $date->format('N') >= 6);
|
|
|
|
return $date;
|
|
};
|
|
|
|
while ((int) $lastArrival->format('N') >= 6) {
|
|
$lastArrival = $previousWorkingDay($lastArrival);
|
|
}
|
|
|
|
$arrivalSeed = (int) sprintf('%u', crc32($lastArrival->format('Y-m-d') . '|rybstock-arrival'));
|
|
$arrivalSecond = (4 * 3600) + ($arrivalSeed % (3 * 3600 + 1));
|
|
$arrivalRefreshAt = $lastArrival->setTime(
|
|
intdiv($arrivalSecond, 3600),
|
|
intdiv($arrivalSecond % 3600, 60),
|
|
$arrivalSecond % 60
|
|
);
|
|
|
|
if ($now < $arrivalRefreshAt) {
|
|
$lastArrival = $previousWorkingDay($lastArrival);
|
|
}
|
|
|
|
$months = [
|
|
1 => 'января',
|
|
2 => 'февраля',
|
|
3 => 'марта',
|
|
4 => 'апреля',
|
|
5 => 'мая',
|
|
6 => 'июня',
|
|
7 => 'июля',
|
|
8 => 'августа',
|
|
9 => 'сентября',
|
|
10 => 'октября',
|
|
11 => 'ноября',
|
|
12 => 'декабря',
|
|
];
|
|
$arrivalDate = $lastArrival->format('j') . ' ' . $months[(int) $lastArrival->format('n')] . ' ' . $lastArrival->format('Y');
|
|
?>
|
|
<section class="start-screen wide">
|
|
<section class="home-hero">
|
|
<div class="hero-copy">
|
|
<p class="eyebrow">Интернет-склад качественной продукции</p>
|
|
<h1>Рыбсток</h1>
|
|
<p class="hero-lead">Рыба, морепродукты, мясо, сыры, овощи, ягоды и бакалея по стоковым ценам.</p>
|
|
<div class="hero-points" aria-label="Ключевые условия">
|
|
<span>Доставка день в день до 14:00</span>
|
|
<span>Без предоплаты</span>
|
|
<span>Самовывоз после подтверждения</span>
|
|
</div>
|
|
<div class="hero-actions">
|
|
<a class="primary-button hero-button" href="/catalog">Смотреть каталог</a>
|
|
<a class="secondary-button" href="tel:+79777363363">+7-977-736-33-63</a>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="hero-media">
|
|
<img src="/assets/images/brand-hero-products.svg" alt="Ассортимент Рыбсток">
|
|
</div>
|
|
</section>
|
|
|
|
<section class="storage-status" aria-label="Температура хранения и поступление товара">
|
|
<div class="arrival-card">
|
|
<span>Последнее поступление</span>
|
|
<strong><?= e((string) $arrivalDate) ?></strong>
|
|
<p>Свежие позиции принимаем по будням утром. В выходные склад не принимает новый товар.</p>
|
|
</div>
|
|
<div class="temperature-card freezer">
|
|
<span>Морозильная камера</span>
|
|
<strong><span data-temperature="-18.6" data-min="-19.4" data-max="-17.8">-18.6</span> °C</strong>
|
|
<p>Рабочий режим глубокой заморозки.</p>
|
|
</div>
|
|
<div class="temperature-card chiller">
|
|
<span>Холодильная камера</span>
|
|
<strong><span data-temperature="2.4" data-min="1.6" data-max="3.8">2.4</span> °C</strong>
|
|
<p>Температура для охлажденной продукции.</p>
|
|
</div>
|
|
</section>
|
|
|
|
<section class="home-banners" aria-label="Преимущества Рыбсток">
|
|
<div class="home-banner delivery-image">
|
|
<strong>Бесплатная доставка внутри МКАД от 5000 руб.</strong>
|
|
<span>Привезем заказ после подтверждения по телефону.</span>
|
|
</div>
|
|
<div class="home-banner region-image">
|
|
<strong>Бесплатная доставка за МКАД от 10000 руб.</strong>
|
|
<span>Для адресов до 10 км от МКАД, дальше расчет по расстоянию.</span>
|
|
</div>
|
|
<div class="home-banner day-image">
|
|
<strong>Можно приобрести день в день</strong>
|
|
<span>Привезем заказ день в день, если он оформлен в будний день до 14:00.</span>
|
|
</div>
|
|
<div class="home-banner payment-image">
|
|
<strong>Без предоплаты</strong>
|
|
<span>Оплата после подтверждения заказа и получения товара.</span>
|
|
</div>
|
|
</section>
|
|
|
|
<section class="promo-strip" aria-label="Промокоды и цены">
|
|
<div>
|
|
<span>Промокод</span>
|
|
<strong>Рыбсток7000</strong>
|
|
<small>300 руб. скидка на заказы от 7 000 руб.</small>
|
|
</div>
|
|
<div>
|
|
<span>Промокод</span>
|
|
<strong>Рыбсток20000</strong>
|
|
<small>5% при наличном расчете от 20 000 руб.</small>
|
|
</div>
|
|
<div>
|
|
<span>Промокод</span>
|
|
<strong>Рыбсток50000</strong>
|
|
<small>7% при наличном расчете от 50 000 руб.</small>
|
|
</div>
|
|
<div>
|
|
<span>Безналичный расчет</span>
|
|
<strong>+8%</strong>
|
|
<small>Отображается отдельной ценовой градацией.</small>
|
|
</div>
|
|
</section>
|
|
|
|
<section class="price-request-panel" id="price-request">
|
|
<div class="price-request-image" aria-hidden="true"></div>
|
|
<div>
|
|
<p class="eyebrow">Запрос проходных цен</p>
|
|
<h2>Пришлите список позиций, а мы сверим цены</h2>
|
|
<p class="muted">Можно вставить список текстом или приложить файл. Заявка будет уходить администратору на почту.</p>
|
|
</div>
|
|
<a class="secondary-button" href="#price-request">Подготовить форму</a>
|
|
</section>
|
|
|
|
<?php if ($notice !== null): ?>
|
|
<div class="status-box danger"><?= e($notice) ?></div>
|
|
<?php endif; ?>
|
|
|
|
<div class="content-grid">
|
|
<section class="panel">
|
|
<h2>Каталог</h2>
|
|
<?php if ($categories === []): ?>
|
|
<p class="muted">Категории пока не найдены. Если схема уже применена, проверьте `database/seed.sql`.</p>
|
|
<?php else: ?>
|
|
<?php
|
|
$items = $categories;
|
|
$depth = 0;
|
|
$currentSlug = '';
|
|
require base_path('views/partials/category-tree.php');
|
|
?>
|
|
<?php endif; ?>
|
|
</section>
|
|
|
|
<section class="panel">
|
|
<h2>Доставка</h2>
|
|
<dl class="settings-list">
|
|
<div>
|
|
<dt>Бесплатно внутри МКАД от</dt>
|
|
<dd><?= e((string) ($settings['inside_mkad_free_from'] ?? '5000')) ?> руб.</dd>
|
|
</div>
|
|
<div>
|
|
<dt>Доставка внутри МКАД</dt>
|
|
<dd><?= e((string) ($settings['inside_mkad_paid_price'] ?? '599')) ?> руб.</dd>
|
|
</div>
|
|
<div>
|
|
<dt>За МКАД</dt>
|
|
<dd><?= e((string) ($settings['outside_mkad_base_price'] ?? '199')) ?> руб. + <?= e((string) ($settings['outside_mkad_km_price'] ?? '60')) ?> руб./км</dd>
|
|
</div>
|
|
<div>
|
|
<dt>Подъем</dt>
|
|
<dd><?= e((string) ($settings['lift_price'] ?? '390')) ?> руб.</dd>
|
|
</div>
|
|
</dl>
|
|
</section>
|
|
</div>
|
|
|
|
<section class="panel products-panel">
|
|
<div class="section-heading">
|
|
<div>
|
|
<p class="eyebrow">Каталог продукции</p>
|
|
<h2>Товары на главной</h2>
|
|
</div>
|
|
<a class="subtle-link" href="/catalog">Весь каталог</a>
|
|
</div>
|
|
|
|
<?php if ($catalogProducts === []): ?>
|
|
<p class="muted">После наполнения базы товары будут отображаться здесь сразу на главной странице.</p>
|
|
<?php else: ?>
|
|
<div class="product-grid">
|
|
<?php foreach ($catalogProducts as $product): ?>
|
|
<?php require base_path('views/partials/product-card.php'); ?>
|
|
<?php endforeach; ?>
|
|
</div>
|
|
<?php endif; ?>
|
|
</section>
|
|
|
|
<section class="panel products-panel">
|
|
<h2>Популярные товары</h2>
|
|
<?php if ($popularProducts === []): ?>
|
|
<p class="muted">Товары появятся здесь после наполнения каталога и публикации фасовок.</p>
|
|
<?php else: ?>
|
|
<div class="product-grid">
|
|
<?php foreach ($popularProducts as $product): ?>
|
|
<?php require base_path('views/partials/product-card.php'); ?>
|
|
<?php endforeach; ?>
|
|
</div>
|
|
<?php endif; ?>
|
|
</section>
|
|
</section>
|