24 $receivedQuantity = self::getIncomingOutgoingQuantitiesFromDocuments($userFilter);
26 $reduceCallback =
static function($result, $current)
28 $measureId = (int)$current[
'MEASURE_ID'] ?: \CCatalogMeasure::getDefaultMeasure(
true)[
'ID'];
29 if (!array_key_exists($measureId, $result))
31 $result[$measureId] = 0.0;
34 $result[$measureId] += $current[
'AMOUNT'][
'OUTGOING'];
38 foreach ($receivedQuantity as $storeId => $productEntry)
40 $receivedQuantity[$storeId] = array_reduce($productEntry, $reduceCallback, []);
43 return $receivedQuantity;
55 $userFilter[
'STORES'] = $storeId;
57 $outgoingQuantity = self::getIncomingOutgoingQuantitiesFromDocuments($userFilter)[$storeId] ?? [];
59 $mapCallback =
static function ($entry)
61 return $entry[
'AMOUNT'][
'OUTGOING'];
64 return array_map($mapCallback, $outgoingQuantity);
75 $receivedQuantity = self::getIncomingOutgoingQuantitiesFromDocuments($userFilter);
77 $reduceCallback =
static function($result, $current)
79 $measureId = (int)$current[
'MEASURE_ID'] ?: \CCatalogMeasure::getDefaultMeasure(
true)[
'ID'];
80 if (!array_key_exists($measureId, $result))
82 $result[$measureId] = 0.0;
85 $result[$measureId] += $current[
'AMOUNT'][
'INCOMING'];
89 foreach ($receivedQuantity as $storeId => $productEntry)
91 $receivedQuantity[$storeId] = array_reduce($productEntry, $reduceCallback, []);
94 return $receivedQuantity;
107 $userFilter[
'STORES'] = $storeId;
109 $receivedQuantity = self::getIncomingOutgoingQuantitiesFromDocuments($userFilter)[$storeId] ?? [];
111 $mapCallback =
static function ($entry)
113 return $entry[
'AMOUNT'][
'INCOMING'];
116 return array_map($mapCallback, $receivedQuantity);
128 private static function getIncomingOutgoingQuantitiesFromDocuments(array $userFilter = []): array
130 $userFilter = self::prepareFilter($userFilter);
132 $productsDataList = self::getDocumentProductsDataList($userFilter);
136 while ($entry = $productsDataList->fetch())
138 $storeFromId = (int)$entry[
'STORE_FROM'];
139 $storeToId = (int)$entry[
'STORE_TO'];
141 if (!isset($result[$storeFromId]))
143 $result[$storeFromId] = [];
145 if (!isset($result[$storeToId]))
147 $result[$storeToId] = [];
150 $productId = $entry[
'ELEMENT_ID'];
151 if (!array_key_exists($productId, $result[$storeToId]))
153 $result[$storeToId][$productId] = [
154 'MEASURE_ID' => (int)$entry[
'MEASURE_ID'] ?: \CCatalogMeasure::getDefaultMeasure(
true)[
'ID'],
162 if ($storeFromId > 0)
164 $result[$storeFromId][$productId][
'AMOUNT'][
'OUTGOING'] += (float)$entry[
'AMOUNT_SUM'];
169 $result[$storeToId][$productId][
'AMOUNT'][
'INCOMING'] += (float)$entry[
'AMOUNT_SUM'];
180 private static function getDocumentProductsDataList(array $userFilter = []): Result
183 $receivedQuantityQuery->setSelect([
189 'MEASURE_ID' =>
'PRODUCT.MEASURE'
193 '=DOCUMENT.STATUS' =>
'Y',
196 if (isset($userFilter[
'PRODUCTS']))
198 $filter[
'=ELEMENT_ID'] = $userFilter[
'PRODUCTS'];
201 if (isset($userFilter[
'STORES']))
205 '=STORE_TO' => $userFilter[
'STORES'],
206 '=STORE_FROM' => $userFilter[
'STORES'],
210 if (isset($userFilter[
'REPORT_INTERVAL']))
212 $filter[
'>=DOCUMENT.DATE_STATUS'] =
new DateTime($userFilter[
'REPORT_INTERVAL'][
'FROM']);
213 $filter[
'<=DOCUMENT.DATE_STATUS'] =
new DateTime($userFilter[
'REPORT_INTERVAL'][
'TO']);
216 $receivedQuantityQuery->setFilter($filter);
217 $receivedQuantityQuery->setGroup([
'STORE_FROM',
'STORE_TO',
'ELEMENT_ID']);
218 $receivedQuantityQuery->registerRuntimeField(
219 new ExpressionField(
'AMOUNT_SUM',
'SUM(de.AMOUNT)')
221 $receivedQuantityQuery->setCustomBaseTableAlias(
'de');
223 return $receivedQuantityQuery->exec();
229 private static function getDefaultReportInterval(): array
231 $currentDate =
new DateTime();
232 $intervalStartDate =
new DateTime();
233 $intervalStartDate->add(self::DEFAULT_DATE_INTERVAL);
236 'FROM' => $intervalStartDate->toString(),
237 'TO' => $currentDate->toString(),
245 private static function prepareFilter(array $filter): array
247 if (!isset($filter[
'REPORT_INTERVAL'][
'FROM'], $filter[
'REPORT_INTERVAL'][
'TO']))
249 $filter[
'REPORT_INTERVAL'] = self::getDefaultReportInterval();
static getReceivedQuantityForStores(array $userFilter=[])
const DEFAULT_DATE_INTERVAL
static getReceivedQuantityForProductsOnStore(int $storeId, array $userFilter=[])
static getOutgoingQuantityForProductsOnStore(int $storeId, array $userFilter=[])
static getOutgoingQuantityForStores(array $userFilter=[])