. */ declare(strict_types=1); namespace FireflyIII\Api\V1\Controllers\Insight\Income; use FireflyIII\Api\V1\Controllers\Controller; use FireflyIII\Api\V1\Requests\Insight\GenericRequest; use FireflyIII\Enums\TransactionTypeEnum; use FireflyIII\Helpers\Collector\GroupCollectorInterface; use FireflyIII\Support\Facades\Amount; use Illuminate\Http\JsonResponse; /** * Class PeriodController */ class PeriodController extends Controller { /** * This endpoint is documented at: * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/insight/insightIncomeTotal */ public function total(GenericRequest $request): JsonResponse { $accounts = $request->getAssetAccounts(); $start = $request->getStart(); $end = $request->getEnd(); $response = []; $convertToPrimary = Amount::convertToPrimary(); $primary = Amount::getPrimaryCurrency(); // collect all expenses in this period (regardless of type) $collector = app(GroupCollectorInterface::class); $collector->setTypes([TransactionTypeEnum::DEPOSIT->value])->setRange($start, $end)->setDestinationAccounts($accounts); $genericSet = $collector->getExtractedJournals(); foreach ($genericSet as $journal) { // currency $currencyId = $journal['currency_id']; $currencyCode = $journal['currency_code']; $field = $convertToPrimary && $currencyId !== $primary->id ? 'pc_amount' : 'amount'; // perhaps use default currency instead? if ($convertToPrimary && $journal['currency_id'] !== $primary->id) { $currencyId = $primary->id; $currencyCode = $primary->code; } // use foreign amount when the foreign currency IS the default currency. if ($convertToPrimary && $journal['currency_id'] !== $primary->id && $primary->id === $journal['foreign_currency_id']) { $field = 'foreign_amount'; } $response[$currencyId] ??= [ 'difference' => '0', 'difference_float' => 0, 'currency_id' => (string) $currencyId, 'currency_code' => $currencyCode, ]; $response[$currencyId]['difference'] = bcadd($response[$currencyId]['difference'], (string) app('steam')->positive($journal[$field])); $response[$currencyId]['difference_float'] = (float) $response[$currencyId]['difference']; // float but on purpose. } return response()->json(array_values($response)); } }