$baseDate = strtotime("{$selectedYear}-{$selectedMonth}-01");
// Получаем периоды за 3 предыдущих месяца.
- $periods = self::getPeriods($baseDate, 3);
+ $periods = self::getPeriods($baseDate, 3, true);
// Получаем историю продаж для каждого периода.
$salesHistory = self::getSalesHistory($storeId, $periods, $category, $subcategory, $species);
}
/**
- * ФоÑ\80миÑ\80Ñ\83еÑ\82 пеÑ\80иодÑ\8b (меÑ\81Ñ\8fÑ\86 + недели) за заданное колиÑ\87еÑ\81Ñ\82во пÑ\80едÑ\8bдÑ\83Ñ\89иÑ\85 меÑ\81Ñ\8fÑ\86ев оÑ\82 базовой даÑ\82Ñ\8b.
+ * УнивеÑ\80Ñ\81алÑ\8cнÑ\8bй меÑ\82од длÑ\8f Ñ\84оÑ\80миÑ\80ованиÑ\8f пеÑ\80иодов (меÑ\81Ñ\8fÑ\86ев) Ñ\81 даÑ\82ами.
*
- * @param int $baseDate Timestamp базовой даты.
- * @param int $count Количество периодов для получения (по умолчанию 3).
+ * @param int $baseDate Timestamp базовой даты.
+ * @param int $count Количество предыдущих месяцев.
+ * @param bool $withWeeks Если true — добавляются данные по неделям месяца.
+ * @param bool $withWeights Если true — добавляется вес для каждого периода.
*
- * @return array Ð\9cассив периодов с ключами вида "YYYY-MM".
+ * @return array Ð\90Ñ\81Ñ\81оÑ\86иаÑ\82ивнÑ\8bй массив периодов с ключами вида "YYYY-MM".
*/
- private static function getPeriods($baseDate, $count = 3)
+ private static function getPeriods($baseDate, $count, $withWeeks = false, $withWeights = false)
{
$periods = [];
- for ($i = $count; $i >= 1; $i--) {
+ for ($i = 1; $i <= $count; $i++) {
$timestamp = strtotime("-{$i} month", $baseDate);
- $month = date('m', $timestamp);
$year = date('Y', $timestamp);
+ $month = date('m', $timestamp);
- $periodKey = "{$year}-{$month}";
- $periods[$periodKey] = [
+ $periodKey = sprintf('%04d-%02d', $year, $month);
+ $periodData = [
'year' => $year,
'month' => $month,
- 'weeks' => [],
];
- $daysInMonth = cal_days_in_month(CAL_GREGORIAN, (int)$month, (int)$year);
- $weeksCount = $daysInMonth > 28 ? 5 : 4;
+ if ($withWeights) {
+ $periodData['weight'] = $count - $i + 1;
+ }
+
+ if ($withWeeks) {
+ $weeks = [];
+ $daysInMonth = cal_days_in_month(CAL_GREGORIAN, (int)$month, (int)$year);
- for ($weekNumber = 1; $weekNumber <= $weeksCount; $weekNumber++) {
- $range = Motivation::getWeekRange(null, $weekNumber, (int)$month, (int)$year);
- $periods[$periodKey]['weeks'][$weekNumber - 1] = $range;
+ $weeksCount = $daysInMonth > 28 ? 5 : 4;
+ for ($weekNumber = 1; $weekNumber <= $weeksCount; $weekNumber++) {
+ $weeks[] = Motivation::getWeekRange(null, $weekNumber, (int)$month, (int)$year);
+ }
+ $periodData['weeks'] = $weeks;
}
+
+ $periods[$periodKey] = $periodData;
}
return $periods;
}
-
/**
* Получает историю продаж за каждый период по неделям.
*
public static function calculateWeightedSalesForProductsWithoutHistory($storeId, $selectedMonth, $productsWithoutHistory)
{
$targetDate = strtotime(date('Y') . "-$selectedMonth-01");
- $periods = self::generateWeightedPeriods($targetDate, 3);
+ $periods = self::getPeriods($targetDate, 3);
$weightedResults = [];
return $weightedResults;
}
- /**
- * Генерирует периоды для расчёта продаж.
- *
- * @param int $targetDate Timestamp целевой даты.
- * @param int $count Количество предыдущих месяцев.
- * @param bool $withWeight Если true – к каждому периоду добавляется вес (ключ 'weight').
- *
- * @return array Ассоциативный массив, где ключ – "YYYY-MM", а значение – массив с ключами 'year', 'month'
- * и, если $withWeight равен true, 'weight'.
- */
- private static function generateWeightedPeriods($targetDate, $count = 3, $withWeight = false)
- {
- $periods = [];
- for ($i = 1; $i <= $count; $i++) {
- $timestamp = strtotime("-{$i} month", $targetDate);
- $year = date('Y', $timestamp);
- $month = date('m', $timestamp);
- $periodKey = sprintf('%04d-%02d', $year, $month);
-
- $periodData = [
- 'year' => $year,
- 'month' => $month,
- ];
-
- if ($withWeight) {
- // Вес рассчитывается как 4 - $i, то есть для ближайшего месяца – вес 3, затем 2 и 1.
- $periodData['weight'] = 4 - $i;
- }
-
- $periods[$periodKey] = $periodData;
- }
- return $periods;
- }
/**
* Получает идентификаторы товаров, похожих на указанный товар,
{
$targetDate = strtotime(date('Y') . "-$selectedMonth-01");
- $weightedPeriods = self::generateWeightedPeriods($targetDate, 3, true);
+ $weightedPeriods = self::getPeriods($targetDate, 3, false,true);
$productsData = [];
$globalTotal = 0;