19 'PROFIT' =>
'#fda505',
21 private const GROUP_MONTH =
'month';
22 private const GROUP_DAY =
'day';
23 private const GROUP_WEEK_DAY =
'weekday';
37 return $this->getGraphsData();
40 private function getDateGrouping(): string
44 $periodDefinition =
$filter[StoreSaleFilter::REPORT_INTERVAL_FIELD_NAME][
'datasel'] ?? DateType::CURRENT_MONTH;
46 switch ($periodDefinition)
49 case DateType::QUARTER:
50 case DateType::CURRENT_QUARTER:
51 return self::GROUP_MONTH;
52 case DateType::LAST_WEEK:
53 case DateType::CURRENT_WEEK:
54 case DateType::NEXT_WEEK:
55 return self::GROUP_WEEK_DAY;
58 return self::GROUP_DAY;
61 private function getGraphsData():
array
67 if (empty($basketItems))
69 $basketItems = $this->getEmptyBasketItemsData();
73 $dateGrouping = $this->getDateGrouping();
74 foreach ($basketItems as $item)
76 $item[
'BASKET_QUANTITY'] *= -1;
77 $dateDeducted = $item[
'DATE_DEDUCTED'];
78 if (!($dateDeducted instanceof
DateTime))
82 $dateDeducted->setTime(0,0);
83 if ($dateGrouping === self::GROUP_MONTH)
85 $year = $dateDeducted->format(
'Y');
86 $month = $dateDeducted->format(
'm');
87 $dateDeducted->setDate(
$year, $month, 1);
91 'TOTAL_SOLD' => $item[
'BASKET_PRICE'] * $item[
'BASKET_QUANTITY'],
92 'COST_PRICE' => $item[
'COST_PRICE'] * $item[
'BASKET_QUANTITY'],
94 if ($item[
'BATCH_CURRENCY'])
98 if ($item[
'BASKET_CURRENCY'])
103 $combinedData[$dateDeducted->toString()] ??= [
107 'PROFITABILITY' =>
null,
108 'DATE_DEDUCTED' => $dateDeducted,
111 $combinedData[$dateDeducted->toString()][
'COST_PRICE'] +=
$priceFields[
'COST_PRICE'];
112 $combinedData[$dateDeducted->toString()][
'TOTAL_SOLD'] +=
$priceFields[
'TOTAL_SOLD'];
117 foreach ($combinedData as $dateKey =>
$data)
119 $profit =
$data[
'TOTAL_SOLD'] -
$data[
'COST_PRICE'];
120 $combinedData[$dateKey][
'PROFIT'] = $profit;
121 if (
$data[
'COST_PRICE'] > 0)
125 $totalProfit += $profit;
126 $totalSold +=
$data[
'TOTAL_SOLD'];
130 $soldGraphItems = [];
131 $profitGraphItems = [];
133 foreach ($combinedData as $date => $value)
135 $groupByValue =
$value[
'DATE_DEDUCTED']->getTimestamp();
136 $label = $this->formatDateForLabel($value[
'DATE_DEDUCTED']);
138 "groupBy" => $groupByValue,
144 'title' => Loc::getMessage(
'GRAPH_HANDLER_BALLOON_SUBTITLE_SOLD'),
145 'htmlValue' => $this->formatAmountByCurrency((
float)$value[
'TOTAL_SOLD']),
148 'title' => Loc::getMessage(
'GRAPH_HANDLER_BALLOON_SUBTITLE_PROFIT'),
149 'htmlValue' => $this->formatAmountByCurrency((
float)$value[
'PROFIT']),
152 'title' => Loc::getMessage(
'GRAPH_HANDLER_BALLOON_SUBTITLE_PROFITABILITY'),
153 'value' =>
$value[
'PROFITABILITY'] !==
null ?
"{$value['PROFITABILITY']}%" :
'-',
159 $soldGraphItems[] = $item + [
'value' => (float)$value[
'TOTAL_SOLD']];
160 $profitGraphItems[] = $item + [
'value' => (float)$value[
'PROFIT']];
161 $labels[$groupByValue] = $label;
166 "items" => $soldGraphItems,
167 "config" => $this->getConfigByCode(
'SOLD', $labels, $totalSold),
170 "items" => $profitGraphItems,
171 "config" => $this->getConfigByCode(
'PROFIT', $labels, $totalProfit)
175 private function getEmptyBasketItemsData():
array
181 'DATE_DEDUCTED' =>
new DateTime(),
182 'BASKET_QUANTITY' => 0,
186 private function getConfigByCode(
string $code,
array $labels,
float $total):
array
189 "groupsLabelMap" => $labels,
190 "reportTitle" => Loc::getMessage(
'GRAPH_HANDLER_BALLOON_SUBTITLE_' .
$code),
191 "reportColor" => self::COLORS[
$code],
192 "amount" => $this->formatAmountByCurrency($total),
193 "dateFormatForLabel" => $this->getDateFormatForLabel(),
194 "dateGrouping" => $this->getDateGrouping()
198 private function formatAmountByCurrency(
float $amount): string
200 $totalAmountFormatted = \CCurrencyLang::CurrencyFormat(
$amount, CurrencyManager::getBaseCurrency());
202 return str_replace(
" ",
" ", $totalAmountFormatted);
205 private function formatDateForLabel(Date $date)
207 return FormatDate($this->getDateFormatForLabel(), $date);
210 private function getDateFormatForLabel(): string
212 switch ($this->getDateGrouping())
214 case self::GROUP_DAY:
215 return Context::getCurrent()->getCulture()->getDayMonthFormat();
217 case self::GROUP_WEEK_DAY:
220 case self::GROUP_MONTH:
224 return Context::getCurrent()->getCulture()->getLongDateFormat();