| 
									
										
										
										
											2019-03-24 14:48:12 +01:00
										 |  |  | <?php | 
					
						
							|  |  |  | /** | 
					
						
							|  |  |  |  * TransactionGroupTransformer.php | 
					
						
							| 
									
										
										
										
											2020-02-16 13:57:18 +01:00
										 |  |  |  * Copyright (c) 2019 james@firefly-iii.org | 
					
						
							| 
									
										
										
										
											2019-03-24 14:48:12 +01:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2019-10-02 06:37:26 +02:00
										 |  |  |  * This file is part of Firefly III (https://github.com/firefly-iii). | 
					
						
							| 
									
										
										
										
											2019-03-24 14:48:12 +01:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2019-10-02 06:37:26 +02:00
										 |  |  |  * This program is free software: you can redistribute it and/or modify | 
					
						
							|  |  |  |  * it under the terms of the GNU Affero General Public License as | 
					
						
							|  |  |  |  * published by the Free Software Foundation, either version 3 of the | 
					
						
							|  |  |  |  * License, or (at your option) any later version. | 
					
						
							| 
									
										
										
										
											2019-03-24 14:48:12 +01:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2019-10-02 06:37:26 +02:00
										 |  |  |  * This program is distributed in the hope that it will be useful, | 
					
						
							| 
									
										
										
										
											2019-03-24 14:48:12 +01:00
										 |  |  |  * but WITHOUT ANY WARRANTY; without even the implied warranty of | 
					
						
							|  |  |  |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
					
						
							| 
									
										
										
										
											2019-10-02 06:37:26 +02:00
										 |  |  |  * GNU Affero General Public License for more details. | 
					
						
							| 
									
										
										
										
											2019-03-24 14:48:12 +01:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2019-10-02 06:37:26 +02:00
										 |  |  |  * You should have received a copy of the GNU Affero General Public License | 
					
						
							|  |  |  |  * along with this program.  If not, see <https://www.gnu.org/licenses/>. | 
					
						
							| 
									
										
										
										
											2019-03-24 14:48:12 +01:00
										 |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | declare(strict_types=1); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace FireflyIII\Transformers; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-12 05:11:19 +01:00
										 |  |  | use FireflyIII\Exceptions\FireflyException; | 
					
						
							| 
									
										
										
										
											2020-03-15 09:54:44 +01:00
										 |  |  | use FireflyIII\Models\Bill; | 
					
						
							| 
									
										
										
										
											2019-04-16 16:20:46 +02:00
										 |  |  | use FireflyIII\Models\Budget; | 
					
						
							|  |  |  | use FireflyIII\Models\Category; | 
					
						
							| 
									
										
										
										
											2021-02-16 10:19:20 +01:00
										 |  |  | use FireflyIII\Models\Location; | 
					
						
							| 
									
										
										
										
											2019-04-16 16:20:46 +02:00
										 |  |  | use FireflyIII\Models\Transaction; | 
					
						
							| 
									
										
										
										
											2020-03-15 09:54:44 +01:00
										 |  |  | use FireflyIII\Models\TransactionCurrency; | 
					
						
							| 
									
										
										
										
											2019-04-16 16:20:46 +02:00
										 |  |  | use FireflyIII\Models\TransactionGroup; | 
					
						
							|  |  |  | use FireflyIII\Models\TransactionJournal; | 
					
						
							| 
									
										
										
										
											2019-03-25 15:14:09 +01:00
										 |  |  | use FireflyIII\Models\TransactionType; | 
					
						
							|  |  |  | use FireflyIII\Repositories\TransactionGroup\TransactionGroupRepositoryInterface; | 
					
						
							|  |  |  | use FireflyIII\Support\NullArrayObject; | 
					
						
							| 
									
										
										
										
											2019-04-16 16:20:46 +02:00
										 |  |  | use Illuminate\Support\Collection; | 
					
						
							| 
									
										
										
										
											2019-03-25 15:14:09 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-24 14:48:12 +01:00
										 |  |  | /** | 
					
						
							|  |  |  |  * Class TransactionGroupTransformer | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | class TransactionGroupTransformer extends AbstractTransformer | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2020-10-18 17:44:30 +02:00
										 |  |  |     private TransactionGroupRepositoryInterface $groupRepos; | 
					
						
							|  |  |  |     private array                               $metaDateFields; | 
					
						
							|  |  |  |     private array                               $metaFields; | 
					
						
							| 
									
										
										
										
											2019-03-25 15:14:09 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-24 14:48:12 +01:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Constructor. | 
					
						
							|  |  |  |      * | 
					
						
							| 
									
										
										
										
											2023-02-12 07:15:06 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-24 14:48:12 +01:00
										 |  |  |      */ | 
					
						
							|  |  |  |     public function __construct() | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2019-03-25 15:14:09 +01:00
										 |  |  |         $this->groupRepos     = app(TransactionGroupRepositoryInterface::class); | 
					
						
							|  |  |  |         $this->metaFields     = [ | 
					
						
							| 
									
										
										
										
											2022-12-29 19:42:40 +01:00
										 |  |  |             'sepa_cc', | 
					
						
							|  |  |  |             'sepa_ct_op', | 
					
						
							|  |  |  |             'sepa_ct_id', | 
					
						
							|  |  |  |             'sepa_db', | 
					
						
							|  |  |  |             'sepa_country', | 
					
						
							|  |  |  |             'sepa_ep', | 
					
						
							|  |  |  |             'sepa_ci', | 
					
						
							|  |  |  |             'sepa_batch_id', | 
					
						
							|  |  |  |             'internal_reference', | 
					
						
							|  |  |  |             'bunq_payment_id', | 
					
						
							|  |  |  |             'import_hash_v2', | 
					
						
							|  |  |  |             'recurrence_id', | 
					
						
							|  |  |  |             'external_id', | 
					
						
							|  |  |  |             'original_source', | 
					
						
							|  |  |  |             'external_url', | 
					
						
							|  |  |  |             'recurrence_count', | 
					
						
							|  |  |  |             'recurrence_total', | 
					
						
							| 
									
										
										
										
											2019-03-25 15:14:09 +01:00
										 |  |  |         ]; | 
					
						
							|  |  |  |         $this->metaDateFields = ['interest_date', 'book_date', 'process_date', 'due_date', 'payment_date', 'invoice_date']; | 
					
						
							| 
									
										
										
										
											2019-03-24 14:48:12 +01:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							| 
									
										
										
										
											2023-06-21 12:34:58 +02:00
										 |  |  |      * @param array $group | 
					
						
							| 
									
										
										
										
											2019-03-24 14:48:12 +01:00
										 |  |  |      * | 
					
						
							|  |  |  |      * @return array | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     public function transform(array $group): array | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2021-02-16 10:19:20 +01:00
										 |  |  |         $data  = new NullArrayObject($group); | 
					
						
							|  |  |  |         $first = new NullArrayObject(reset($group['transactions'])); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-23 19:11:25 +02:00
										 |  |  |         return [ | 
					
						
							| 
									
										
										
										
											2022-12-29 19:42:40 +01:00
										 |  |  |             'id'           => (int)$first['transaction_group_id'], | 
					
						
							| 
									
										
										
										
											2019-03-25 15:14:09 +01:00
										 |  |  |             'created_at'   => $first['created_at']->toAtomString(), | 
					
						
							|  |  |  |             'updated_at'   => $first['updated_at']->toAtomString(), | 
					
						
							| 
									
										
										
										
											2022-12-29 19:42:40 +01:00
										 |  |  |             'user'         => (string)$data['user_id'], | 
					
						
							| 
									
										
										
										
											2019-03-25 15:14:09 +01:00
										 |  |  |             'group_title'  => $data['title'], | 
					
						
							|  |  |  |             'transactions' => $this->transformTransactions($data), | 
					
						
							|  |  |  |             'links'        => [ | 
					
						
							| 
									
										
										
										
											2019-03-24 14:48:12 +01:00
										 |  |  |                 [ | 
					
						
							|  |  |  |                     'rel' => 'self', | 
					
						
							| 
									
										
										
										
											2023-06-21 12:34:58 +02:00
										 |  |  |                     'uri' => '/transactions/' . $first['transaction_group_id'], | 
					
						
							| 
									
										
										
										
											2019-03-24 14:48:12 +01:00
										 |  |  |                 ], | 
					
						
							|  |  |  |             ], | 
					
						
							|  |  |  |         ]; | 
					
						
							| 
									
										
										
										
											2019-03-25 15:14:09 +01:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-16 16:20:46 +02:00
										 |  |  |     /** | 
					
						
							| 
									
										
										
										
											2023-06-21 12:34:58 +02:00
										 |  |  |      * @param NullArrayObject $data | 
					
						
							| 
									
										
										
										
											2019-04-16 16:20:46 +02:00
										 |  |  |      * | 
					
						
							|  |  |  |      * @return array | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2023-06-21 12:34:58 +02:00
										 |  |  |     private function transformTransactions(NullArrayObject $data): array | 
					
						
							| 
									
										
										
										
											2019-04-16 16:20:46 +02:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2023-06-21 12:34:58 +02:00
										 |  |  |         $result       = []; | 
					
						
							|  |  |  |         $transactions = $data['transactions'] ?? []; | 
					
						
							|  |  |  |         foreach ($transactions as $transaction) { | 
					
						
							|  |  |  |             $result[] = $this->transformTransaction($transaction); | 
					
						
							| 
									
										
										
										
											2020-03-12 05:11:19 +01:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2020-03-15 09:54:44 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-16 16:20:46 +02:00
										 |  |  |         return $result; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-15 09:54:44 +01:00
										 |  |  |     /** | 
					
						
							| 
									
										
										
										
											2023-06-21 12:34:58 +02:00
										 |  |  |      * @param array $transaction | 
					
						
							| 
									
										
										
										
											2020-03-15 09:54:44 +01:00
										 |  |  |      * | 
					
						
							| 
									
										
										
										
											2023-06-21 12:34:58 +02:00
										 |  |  |      * @return array | 
					
						
							| 
									
										
										
										
											2020-03-15 09:54:44 +01:00
										 |  |  |      */ | 
					
						
							| 
									
										
										
										
											2023-06-21 12:34:58 +02:00
										 |  |  |     private function transformTransaction(array $transaction): array | 
					
						
							| 
									
										
										
										
											2020-03-15 09:54:44 +01:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2023-06-21 12:34:58 +02:00
										 |  |  |         $row = new NullArrayObject($transaction); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // amount:
 | 
					
						
							|  |  |  |         $amount        = app('steam')->positive((string)($row['amount'] ?? '0')); | 
					
						
							|  |  |  |         $foreignAmount = null; | 
					
						
							|  |  |  |         if (null !== $row['foreign_amount'] && '' !== $row['foreign_amount'] && bccomp('0', $row['foreign_amount']) !== 0) { | 
					
						
							|  |  |  |             $foreignAmount = app('steam')->positive($row['foreign_amount']); | 
					
						
							| 
									
										
										
										
											2020-03-15 09:54:44 +01:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-21 12:34:58 +02:00
										 |  |  |         $metaFieldData = $this->groupRepos->getMetaFields((int)$row['transaction_journal_id'], $this->metaFields); | 
					
						
							|  |  |  |         $metaDateData  = $this->groupRepos->getMetaDateFields((int)$row['transaction_journal_id'], $this->metaDateFields); | 
					
						
							|  |  |  |         $type          = $this->stringFromArray($transaction, 'transaction_type_type', TransactionType::WITHDRAWAL); | 
					
						
							| 
									
										
										
										
											2020-03-15 09:54:44 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-30 14:24:37 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-21 12:34:58 +02:00
										 |  |  |         $longitude = null; | 
					
						
							|  |  |  |         $latitude  = null; | 
					
						
							|  |  |  |         $zoomLevel = null; | 
					
						
							|  |  |  |         $location  = $this->getLocationById((int)$row['transaction_journal_id']); | 
					
						
							|  |  |  |         if (null !== $location) { | 
					
						
							|  |  |  |             $longitude = $location->longitude; | 
					
						
							|  |  |  |             $latitude  = $location->latitude; | 
					
						
							|  |  |  |             $zoomLevel = $location->zoom_level; | 
					
						
							| 
									
										
										
										
											2020-03-15 09:54:44 +01:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-21 12:34:58 +02:00
										 |  |  |         return [ | 
					
						
							|  |  |  |             'user'                   => (string)$row['user_id'], | 
					
						
							|  |  |  |             'transaction_journal_id' => (string)$row['transaction_journal_id'], | 
					
						
							|  |  |  |             'type'                   => strtolower($type), | 
					
						
							|  |  |  |             'date'                   => $row['date']->toAtomString(), | 
					
						
							|  |  |  |             'order'                  => $row['order'], | 
					
						
							| 
									
										
										
										
											2021-03-21 09:15:40 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-21 12:34:58 +02:00
										 |  |  |             'currency_id'             => (string)$row['currency_id'], | 
					
						
							|  |  |  |             'currency_code'           => $row['currency_code'], | 
					
						
							|  |  |  |             'currency_name'           => $row['currency_name'], | 
					
						
							|  |  |  |             'currency_symbol'         => $row['currency_symbol'], | 
					
						
							|  |  |  |             'currency_decimal_places' => (int)$row['currency_decimal_places'], | 
					
						
							| 
									
										
										
										
											2021-03-21 09:15:40 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-21 12:34:58 +02:00
										 |  |  |             'foreign_currency_id'             => $this->stringFromArray($transaction, 'foreign_currency_id', null), | 
					
						
							|  |  |  |             'foreign_currency_code'           => $row['foreign_currency_code'], | 
					
						
							|  |  |  |             'foreign_currency_symbol'         => $row['foreign_currency_symbol'], | 
					
						
							|  |  |  |             'foreign_currency_decimal_places' => $row['foreign_currency_decimal_places'], | 
					
						
							| 
									
										
										
										
											2021-03-21 09:15:40 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-21 12:34:58 +02:00
										 |  |  |             'amount'         => $amount, | 
					
						
							|  |  |  |             'foreign_amount' => $foreignAmount, | 
					
						
							| 
									
										
										
										
											2021-03-21 09:15:40 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-21 12:34:58 +02:00
										 |  |  |             'description' => $row['description'], | 
					
						
							| 
									
										
										
										
											2021-12-10 16:40:22 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-21 12:34:58 +02:00
										 |  |  |             'source_id'   => (string)$row['source_account_id'], | 
					
						
							|  |  |  |             'source_name' => $row['source_account_name'], | 
					
						
							|  |  |  |             'source_iban' => $row['source_account_iban'], | 
					
						
							|  |  |  |             'source_type' => $row['source_account_type'], | 
					
						
							| 
									
										
										
										
											2023-05-29 13:56:55 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-21 12:34:58 +02:00
										 |  |  |             'destination_id'   => (string)$row['destination_account_id'], | 
					
						
							|  |  |  |             'destination_name' => $row['destination_account_name'], | 
					
						
							|  |  |  |             'destination_iban' => $row['destination_account_iban'], | 
					
						
							|  |  |  |             'destination_type' => $row['destination_account_type'], | 
					
						
							| 
									
										
										
										
											2020-03-15 09:54:44 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-21 12:34:58 +02:00
										 |  |  |             'budget_id'   => $this->stringFromArray($transaction, 'budget_id', null), | 
					
						
							|  |  |  |             'budget_name' => $row['budget_name'], | 
					
						
							| 
									
										
										
										
											2020-03-15 09:54:44 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-21 12:34:58 +02:00
										 |  |  |             'category_id'   => $this->stringFromArray($transaction, 'category_id', null), | 
					
						
							|  |  |  |             'category_name' => $row['category_name'], | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             'bill_id'   => $this->stringFromArray($transaction, 'bill_id', null), | 
					
						
							|  |  |  |             'bill_name' => $row['bill_name'], | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             'reconciled' => $row['reconciled'], | 
					
						
							|  |  |  |             'notes'      => $this->groupRepos->getNoteText((int)$row['transaction_journal_id']), | 
					
						
							|  |  |  |             'tags'       => $this->groupRepos->getTags((int)$row['transaction_journal_id']), | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             'internal_reference' => $metaFieldData['internal_reference'], | 
					
						
							|  |  |  |             'external_id'        => $metaFieldData['external_id'], | 
					
						
							|  |  |  |             'original_source'    => $metaFieldData['original_source'], | 
					
						
							|  |  |  |             'recurrence_id'      => $this->stringFromArray($metaFieldData->getArrayCopy(), 'recurrence_id', null), | 
					
						
							|  |  |  |             'recurrence_total'   => $this->integerFromArray($metaFieldData->getArrayCopy(), 'recurrence_total'), | 
					
						
							|  |  |  |             'recurrence_count'   => $this->integerFromArray($metaFieldData->getArrayCopy(), 'recurrence_count'), | 
					
						
							|  |  |  |             'bunq_payment_id'    => $metaFieldData['bunq_payment_id'], | 
					
						
							|  |  |  |             'external_url'       => $metaFieldData['external_url'], | 
					
						
							|  |  |  |             'import_hash_v2'     => $metaFieldData['import_hash_v2'], | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             'sepa_cc'       => $metaFieldData['sepa_cc'], | 
					
						
							|  |  |  |             'sepa_ct_op'    => $metaFieldData['sepa_ct_op'], | 
					
						
							|  |  |  |             'sepa_ct_id'    => $metaFieldData['sepa_ct_id'], | 
					
						
							|  |  |  |             'sepa_db'       => $metaFieldData['sepa_db'], | 
					
						
							|  |  |  |             'sepa_country'  => $metaFieldData['sepa_country'], | 
					
						
							|  |  |  |             'sepa_ep'       => $metaFieldData['sepa_ep'], | 
					
						
							|  |  |  |             'sepa_ci'       => $metaFieldData['sepa_ci'], | 
					
						
							|  |  |  |             'sepa_batch_id' => $metaFieldData['sepa_batch_id'], | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             'interest_date' => $this->dateFromArray($metaDateData, 'interest_date'), | 
					
						
							|  |  |  |             'book_date'     => $this->dateFromArray($metaDateData, 'book_date'), | 
					
						
							|  |  |  |             'process_date'  => $this->dateFromArray($metaDateData, 'process_date'), | 
					
						
							|  |  |  |             'due_date'      => $this->dateFromArray($metaDateData, 'due_date'), | 
					
						
							|  |  |  |             'payment_date'  => $this->dateFromArray($metaDateData, 'payment_date'), | 
					
						
							|  |  |  |             'invoice_date'  => $this->dateFromArray($metaDateData, 'invoice_date'), | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             // location data
 | 
					
						
							|  |  |  |             'longitude'     => $longitude, | 
					
						
							|  |  |  |             'latitude'      => $latitude, | 
					
						
							|  |  |  |             'zoom_level'    => $zoomLevel, | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             'has_attachments' => $this->hasAttachments((int)$row['transaction_journal_id']), | 
					
						
							|  |  |  |         ]; | 
					
						
							| 
									
										
										
										
											2023-05-29 13:56:55 +02:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							| 
									
										
										
										
											2023-06-21 12:34:58 +02:00
										 |  |  |      * @param array       $array | 
					
						
							|  |  |  |      * @param string      $key | 
					
						
							|  |  |  |      * @param string|null $default | 
					
						
							| 
									
										
										
										
											2023-05-29 13:56:55 +02:00
										 |  |  |      * | 
					
						
							|  |  |  |      * @return string|null | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2023-06-21 12:34:58 +02:00
										 |  |  |     private function stringFromArray(array $array, string $key, ?string $default): ?string | 
					
						
							| 
									
										
										
										
											2023-05-29 13:56:55 +02:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2023-06-21 12:34:58 +02:00
										 |  |  |         if (array_key_exists($key, $array) && null === $array[$key]) { | 
					
						
							|  |  |  |             return null; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         if (array_key_exists($key, $array) && null !== $array[$key]) { | 
					
						
							|  |  |  |             if (0 === $array[$key]) { | 
					
						
							|  |  |  |                 return $default; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             if ('0' === $array[$key]) { | 
					
						
							|  |  |  |                 return $default; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             return (string)$array[$key]; | 
					
						
							| 
									
										
										
										
											2021-03-21 09:15:40 +01:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-21 12:34:58 +02:00
										 |  |  |         if (null !== $default) { | 
					
						
							| 
									
										
										
										
											2023-11-04 19:20:07 +01:00
										 |  |  |             return $default; | 
					
						
							| 
									
										
										
										
											2023-06-21 12:34:58 +02:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return null; | 
					
						
							| 
									
										
										
										
											2020-03-15 09:54:44 +01:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							| 
									
										
										
										
											2023-06-21 12:34:58 +02:00
										 |  |  |      * @param int $journalId | 
					
						
							| 
									
										
										
										
											2020-03-15 09:54:44 +01:00
										 |  |  |      * | 
					
						
							| 
									
										
										
										
											2023-06-21 12:34:58 +02:00
										 |  |  |      * @return Location|null | 
					
						
							| 
									
										
										
										
											2020-03-15 09:54:44 +01:00
										 |  |  |      */ | 
					
						
							| 
									
										
										
										
											2023-06-21 12:34:58 +02:00
										 |  |  |     private function getLocationById(int $journalId): ?Location | 
					
						
							| 
									
										
										
										
											2020-03-15 09:54:44 +01:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2023-06-21 12:34:58 +02:00
										 |  |  |         return $this->groupRepos->getLocation($journalId); | 
					
						
							| 
									
										
										
										
											2020-03-15 09:54:44 +01:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-16 16:20:46 +02:00
										 |  |  |     /** | 
					
						
							| 
									
										
										
										
											2023-06-21 12:34:58 +02:00
										 |  |  |      * @param TransactionJournal $journal | 
					
						
							| 
									
										
										
										
											2022-12-29 19:42:40 +01:00
										 |  |  |      * | 
					
						
							|  |  |  |      * @return Location|null | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     private function getLocation(TransactionJournal $journal): ?Location | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         return $journal->locations()->first(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							| 
									
										
										
										
											2023-06-21 12:34:58 +02:00
										 |  |  |      * @param array  $array | 
					
						
							|  |  |  |      * @param string $key | 
					
						
							| 
									
										
										
										
											2019-04-16 16:20:46 +02:00
										 |  |  |      * | 
					
						
							| 
									
										
										
										
											2023-06-21 12:34:58 +02:00
										 |  |  |      * @return int|null | 
					
						
							| 
									
										
										
										
											2019-04-16 16:20:46 +02:00
										 |  |  |      */ | 
					
						
							| 
									
										
										
										
											2023-06-21 12:34:58 +02:00
										 |  |  |     private function integerFromArray(array $array, string $key): ?int | 
					
						
							| 
									
										
										
										
											2019-04-16 16:20:46 +02:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2023-06-21 12:34:58 +02:00
										 |  |  |         if (array_key_exists($key, $array)) { | 
					
						
							|  |  |  |             return (int)$array[$key]; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return null; | 
					
						
							| 
									
										
										
										
											2019-04-16 16:20:46 +02:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-15 09:54:44 +01:00
										 |  |  |     /** | 
					
						
							| 
									
										
										
										
											2023-06-21 12:34:58 +02:00
										 |  |  |      * @param NullArrayObject $object | 
					
						
							|  |  |  |      * @param string          $key | 
					
						
							| 
									
										
										
										
											2020-03-15 09:54:44 +01:00
										 |  |  |      * | 
					
						
							| 
									
										
										
										
											2023-06-21 12:34:58 +02:00
										 |  |  |      * @return string|null | 
					
						
							| 
									
										
										
										
											2020-03-15 09:54:44 +01:00
										 |  |  |      */ | 
					
						
							| 
									
										
										
										
											2023-06-21 12:34:58 +02:00
										 |  |  |     private function dateFromArray(NullArrayObject $object, string $key): ?string | 
					
						
							| 
									
										
										
										
											2020-03-15 09:54:44 +01:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2023-06-21 12:34:58 +02:00
										 |  |  |         if (null === $object[$key]) { | 
					
						
							|  |  |  |             return null; | 
					
						
							| 
									
										
										
										
											2020-03-15 09:54:44 +01:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-21 12:34:58 +02:00
										 |  |  |         return $object[$key]->toAtomString(); | 
					
						
							| 
									
										
										
										
											2020-03-15 09:54:44 +01:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-29 15:00:29 +02:00
										 |  |  |     /** | 
					
						
							| 
									
										
										
										
											2023-06-21 12:34:58 +02:00
										 |  |  |      * @param int $journalId | 
					
						
							| 
									
										
										
										
											2022-03-29 15:00:29 +02:00
										 |  |  |      * | 
					
						
							|  |  |  |      * @return bool | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     private function hasAttachments(int $journalId): bool | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         return $this->groupRepos->countAttachments($journalId) > 0; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-15 09:54:44 +01:00
										 |  |  |     /** | 
					
						
							| 
									
										
										
										
											2023-06-21 12:34:58 +02:00
										 |  |  |      * @param TransactionGroup $group | 
					
						
							| 
									
										
										
										
											2020-03-15 09:54:44 +01:00
										 |  |  |      * | 
					
						
							| 
									
										
										
										
											2023-06-21 12:34:58 +02:00
										 |  |  |      * @return array | 
					
						
							|  |  |  |      * @throws FireflyException | 
					
						
							| 
									
										
										
										
											2020-03-15 09:54:44 +01:00
										 |  |  |      */ | 
					
						
							| 
									
										
										
										
											2023-06-21 12:34:58 +02:00
										 |  |  |     public function transformObject(TransactionGroup $group): array | 
					
						
							| 
									
										
										
										
											2020-03-15 09:54:44 +01:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2023-06-21 12:34:58 +02:00
										 |  |  |         try { | 
					
						
							|  |  |  |             $result = [ | 
					
						
							| 
									
										
										
										
											2023-11-05 19:55:39 +01:00
										 |  |  |                 'id'           => $group->id, | 
					
						
							| 
									
										
										
										
											2023-06-21 12:34:58 +02:00
										 |  |  |                 'created_at'   => $group->created_at->toAtomString(), | 
					
						
							|  |  |  |                 'updated_at'   => $group->updated_at->toAtomString(), | 
					
						
							| 
									
										
										
										
											2023-11-05 19:55:39 +01:00
										 |  |  |                 'user'         => $group->user_id, | 
					
						
							| 
									
										
										
										
											2023-06-21 12:34:58 +02:00
										 |  |  |                 'group_title'  => $group->title, | 
					
						
							|  |  |  |                 'transactions' => $this->transformJournals($group->transactionJournals), | 
					
						
							|  |  |  |                 'links'        => [ | 
					
						
							|  |  |  |                     [ | 
					
						
							|  |  |  |                         'rel' => 'self', | 
					
						
							|  |  |  |                         'uri' => '/transactions/' . $group->id, | 
					
						
							|  |  |  |                     ], | 
					
						
							|  |  |  |                 ], | 
					
						
							|  |  |  |             ]; | 
					
						
							|  |  |  |         } catch (FireflyException $e) { | 
					
						
							| 
									
										
										
										
											2023-10-06 18:23:32 +02:00
										 |  |  |             app('log')->error($e->getMessage()); | 
					
						
							|  |  |  |             app('log')->error($e->getTraceAsString()); | 
					
						
							| 
									
										
										
										
											2023-06-21 12:34:58 +02:00
										 |  |  |             throw new FireflyException(sprintf('Transaction group #%d is broken. Please check out your log files.', $group->id), 0, $e); | 
					
						
							| 
									
										
										
										
											2020-03-15 09:54:44 +01:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-21 12:34:58 +02:00
										 |  |  |         // do something else.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return $result; | 
					
						
							| 
									
										
										
										
											2020-03-15 09:54:44 +01:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-16 16:20:46 +02:00
										 |  |  |     /** | 
					
						
							| 
									
										
										
										
											2023-06-21 12:34:58 +02:00
										 |  |  |      * @param Collection $transactionJournals | 
					
						
							| 
									
										
										
										
											2019-04-16 16:20:46 +02:00
										 |  |  |      * | 
					
						
							| 
									
										
										
										
											2023-06-21 12:34:58 +02:00
										 |  |  |      * @return array | 
					
						
							|  |  |  |      * @throws FireflyException | 
					
						
							| 
									
										
										
										
											2019-04-16 16:20:46 +02:00
										 |  |  |      */ | 
					
						
							| 
									
										
										
										
											2023-06-21 12:34:58 +02:00
										 |  |  |     private function transformJournals(Collection $transactionJournals): array | 
					
						
							| 
									
										
										
										
											2019-04-16 16:20:46 +02:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2023-06-21 12:34:58 +02:00
										 |  |  |         $result = []; | 
					
						
							|  |  |  |         /** @var TransactionJournal $journal */ | 
					
						
							|  |  |  |         foreach ($transactionJournals as $journal) { | 
					
						
							|  |  |  |             $result[] = $this->transformJournal($journal); | 
					
						
							| 
									
										
										
										
											2023-05-29 13:56:55 +02:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-21 12:34:58 +02:00
										 |  |  |         return $result; | 
					
						
							| 
									
										
										
										
											2019-04-16 16:20:46 +02:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-15 09:54:44 +01:00
										 |  |  |     /** | 
					
						
							| 
									
										
										
										
											2023-06-21 12:34:58 +02:00
										 |  |  |      * @param TransactionJournal $journal | 
					
						
							| 
									
										
										
										
											2020-03-15 09:54:44 +01:00
										 |  |  |      * | 
					
						
							|  |  |  |      * @return array | 
					
						
							|  |  |  |      * @throws FireflyException | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     private function transformJournal(TransactionJournal $journal): array | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $source          = $this->getSourceTransaction($journal); | 
					
						
							|  |  |  |         $destination     = $this->getDestinationTransaction($journal); | 
					
						
							|  |  |  |         $type            = $journal->transactionType->type; | 
					
						
							| 
									
										
										
										
											2023-05-18 05:38:17 +02:00
										 |  |  |         $currency        = $source->transactionCurrency; | 
					
						
							| 
									
										
										
										
											2023-11-05 19:41:37 +01:00
										 |  |  |         $amount          = app('steam')->bcround($this->getAmount($type, $source->amount), $currency->decimal_places ?? 0); | 
					
						
							| 
									
										
										
										
											2023-11-05 19:55:39 +01:00
										 |  |  |         $foreignAmount   = $this->getForeignAmount($type, null === $source->foreign_amount ? null : $source->foreign_amount); | 
					
						
							| 
									
										
										
										
											2020-03-15 09:54:44 +01:00
										 |  |  |         $metaFieldData   = $this->groupRepos->getMetaFields($journal->id, $this->metaFields); | 
					
						
							|  |  |  |         $metaDates       = $this->getDates($this->groupRepos->getMetaDateFields($journal->id, $this->metaDateFields)); | 
					
						
							|  |  |  |         $foreignCurrency = $this->getForeignCurrency($source->foreignCurrency); | 
					
						
							|  |  |  |         $budget          = $this->getBudget($journal->budgets->first()); | 
					
						
							|  |  |  |         $category        = $this->getCategory($journal->categories->first()); | 
					
						
							|  |  |  |         $bill            = $this->getBill($journal->bill); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-05-18 05:38:17 +02:00
										 |  |  |         if (null !== $foreignAmount && null !== $source->foreignCurrency) { | 
					
						
							| 
									
										
										
										
											2022-12-27 21:13:18 +01:00
										 |  |  |             $foreignAmount = app('steam')->bcround($foreignAmount, $foreignCurrency['decimal_places'] ?? 0); | 
					
						
							| 
									
										
										
										
											2021-02-16 10:19:20 +01:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $longitude = null; | 
					
						
							|  |  |  |         $latitude  = null; | 
					
						
							|  |  |  |         $zoomLevel = null; | 
					
						
							|  |  |  |         $location  = $this->getLocation($journal); | 
					
						
							|  |  |  |         if (null !== $location) { | 
					
						
							|  |  |  |             $longitude = $location->longitude; | 
					
						
							|  |  |  |             $latitude  = $location->latitude; | 
					
						
							|  |  |  |             $zoomLevel = $location->zoom_level; | 
					
						
							| 
									
										
										
										
											2020-07-12 17:32:48 +02:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-15 09:54:44 +01:00
										 |  |  |         return [ | 
					
						
							| 
									
										
										
										
											2023-11-05 19:55:39 +01:00
										 |  |  |             'user'                   => $journal->user_id, | 
					
						
							| 
									
										
										
										
											2023-11-05 19:41:37 +01:00
										 |  |  |             'transaction_journal_id' => $journal->id, | 
					
						
							| 
									
										
										
										
											2021-03-21 09:15:40 +01:00
										 |  |  |             'type'                   => strtolower($type), | 
					
						
							|  |  |  |             'date'                   => $journal->date->toAtomString(), | 
					
						
							|  |  |  |             'order'                  => $journal->order, | 
					
						
							| 
									
										
										
										
											2020-10-18 17:44:30 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-11-05 19:41:37 +01:00
										 |  |  |             'currency_id'             => $currency->id, | 
					
						
							| 
									
										
										
										
											2021-03-21 09:15:40 +01:00
										 |  |  |             'currency_code'           => $currency->code, | 
					
						
							|  |  |  |             'currency_symbol'         => $currency->symbol, | 
					
						
							| 
									
										
										
										
											2022-12-29 19:42:40 +01:00
										 |  |  |             'currency_decimal_places' => (int)$currency->decimal_places, | 
					
						
							| 
									
										
										
										
											2020-10-18 17:44:30 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-03-21 09:15:40 +01:00
										 |  |  |             'foreign_currency_id'             => $foreignCurrency['id'], | 
					
						
							|  |  |  |             'foreign_currency_code'           => $foreignCurrency['code'], | 
					
						
							|  |  |  |             'foreign_currency_symbol'         => $foreignCurrency['symbol'], | 
					
						
							|  |  |  |             'foreign_currency_decimal_places' => $foreignCurrency['decimal_places'], | 
					
						
							| 
									
										
										
										
											2020-10-18 17:44:30 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-12-27 21:13:18 +01:00
										 |  |  |             'amount'         => app('steam')->bcround($amount, $currency->decimal_places), | 
					
						
							| 
									
										
										
										
											2020-10-18 17:44:30 +02:00
										 |  |  |             'foreign_amount' => $foreignAmount, | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-03-21 09:15:40 +01:00
										 |  |  |             'description' => $journal->description, | 
					
						
							| 
									
										
										
										
											2020-10-18 17:44:30 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-11-05 19:41:37 +01:00
										 |  |  |             'source_id'   => $source->account_id, | 
					
						
							| 
									
										
										
										
											2021-03-21 09:15:40 +01:00
										 |  |  |             'source_name' => $source->account->name, | 
					
						
							|  |  |  |             'source_iban' => $source->account->iban, | 
					
						
							|  |  |  |             'source_type' => $source->account->accountType->type, | 
					
						
							| 
									
										
										
										
											2020-10-18 17:44:30 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-11-05 19:41:37 +01:00
										 |  |  |             'destination_id'   => $destination->account_id, | 
					
						
							| 
									
										
										
										
											2021-03-21 09:15:40 +01:00
										 |  |  |             'destination_name' => $destination->account->name, | 
					
						
							|  |  |  |             'destination_iban' => $destination->account->iban, | 
					
						
							|  |  |  |             'destination_type' => $destination->account->accountType->type, | 
					
						
							| 
									
										
										
										
											2020-10-18 17:44:30 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-03-21 09:15:40 +01:00
										 |  |  |             'budget_id'   => $budget['id'], | 
					
						
							|  |  |  |             'budget_name' => $budget['name'], | 
					
						
							| 
									
										
										
										
											2020-10-18 17:44:30 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-03-21 09:15:40 +01:00
										 |  |  |             'category_id'   => $category['id'], | 
					
						
							|  |  |  |             'category_name' => $category['name'], | 
					
						
							| 
									
										
										
										
											2020-10-18 17:44:30 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-03-21 09:15:40 +01:00
										 |  |  |             'bill_id'   => $bill['id'], | 
					
						
							|  |  |  |             'bill_name' => $bill['name'], | 
					
						
							| 
									
										
										
										
											2020-10-18 17:44:30 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-03-21 09:15:40 +01:00
										 |  |  |             'reconciled' => $source->reconciled, | 
					
						
							|  |  |  |             'notes'      => $this->groupRepos->getNoteText($journal->id), | 
					
						
							|  |  |  |             'tags'       => $this->groupRepos->getTags($journal->id), | 
					
						
							| 
									
										
										
										
											2020-10-18 17:44:30 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |             'internal_reference' => $metaFieldData['internal_reference'], | 
					
						
							|  |  |  |             'external_id'        => $metaFieldData['external_id'], | 
					
						
							|  |  |  |             'original_source'    => $metaFieldData['original_source'], | 
					
						
							| 
									
										
										
										
											2021-03-21 09:15:40 +01:00
										 |  |  |             'recurrence_id'      => $metaFieldData['recurrence_id'], | 
					
						
							| 
									
										
										
										
											2020-10-18 17:44:30 +02:00
										 |  |  |             'bunq_payment_id'    => $metaFieldData['bunq_payment_id'], | 
					
						
							|  |  |  |             'import_hash_v2'     => $metaFieldData['import_hash_v2'], | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             'sepa_cc'       => $metaFieldData['sepa_cc'], | 
					
						
							|  |  |  |             'sepa_ct_op'    => $metaFieldData['sepa_ct_op'], | 
					
						
							|  |  |  |             'sepa_ct_id'    => $metaFieldData['sepa_ct_id'], | 
					
						
							| 
									
										
										
										
											2021-03-11 06:29:07 +01:00
										 |  |  |             'sepa_db'       => $metaFieldData['sepa_db'], | 
					
						
							| 
									
										
										
										
											2020-10-18 17:44:30 +02:00
										 |  |  |             'sepa_country'  => $metaFieldData['sepa_country'], | 
					
						
							|  |  |  |             'sepa_ep'       => $metaFieldData['sepa_ep'], | 
					
						
							|  |  |  |             'sepa_ci'       => $metaFieldData['sepa_ci'], | 
					
						
							|  |  |  |             'sepa_batch_id' => $metaFieldData['sepa_batch_id'], | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-03-21 09:15:40 +01:00
										 |  |  |             'interest_date' => $metaDates['interest_date'], | 
					
						
							|  |  |  |             'book_date'     => $metaDates['book_date'], | 
					
						
							|  |  |  |             'process_date'  => $metaDates['process_date'], | 
					
						
							|  |  |  |             'due_date'      => $metaDates['due_date'], | 
					
						
							|  |  |  |             'payment_date'  => $metaDates['payment_date'], | 
					
						
							|  |  |  |             'invoice_date'  => $metaDates['invoice_date'], | 
					
						
							| 
									
										
										
										
											2021-02-16 10:19:20 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |             // location data
 | 
					
						
							|  |  |  |             'longitude'     => $longitude, | 
					
						
							|  |  |  |             'latitude'      => $latitude, | 
					
						
							|  |  |  |             'zoom_level'    => $zoomLevel, | 
					
						
							| 
									
										
										
										
											2020-10-18 17:44:30 +02:00
										 |  |  |         ]; | 
					
						
							| 
									
										
										
										
											2019-03-24 14:48:12 +01:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2020-10-18 17:44:30 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							| 
									
										
										
										
											2023-06-21 12:34:58 +02:00
										 |  |  |      * @param TransactionJournal $journal | 
					
						
							| 
									
										
										
										
											2021-03-21 09:15:40 +01:00
										 |  |  |      * | 
					
						
							| 
									
										
										
										
											2023-06-21 12:34:58 +02:00
										 |  |  |      * @return Transaction | 
					
						
							| 
									
										
										
										
											2021-03-21 09:15:40 +01:00
										 |  |  |      * @throws FireflyException | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2023-06-21 12:34:58 +02:00
										 |  |  |     private function getSourceTransaction(TransactionJournal $journal): Transaction | 
					
						
							| 
									
										
										
										
											2021-03-21 09:15:40 +01:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2023-06-21 12:34:58 +02:00
										 |  |  |         $result = $journal->transactions->first( | 
					
						
							|  |  |  |             static function (Transaction $transaction) { | 
					
						
							|  |  |  |                 return (float)$transaction->amount < 0; // lame but it works.
 | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         ); | 
					
						
							|  |  |  |         if (null === $result) { | 
					
						
							|  |  |  |             throw new FireflyException(sprintf('Journal #%d unexpectedly has no source transaction.', $journal->id)); | 
					
						
							| 
									
										
										
										
											2021-03-21 09:15:40 +01:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return $result; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							| 
									
										
										
										
											2023-06-21 12:34:58 +02:00
										 |  |  |      * @param TransactionJournal $journal | 
					
						
							| 
									
										
										
										
											2021-03-21 09:15:40 +01:00
										 |  |  |      * | 
					
						
							| 
									
										
										
										
											2023-06-21 12:34:58 +02:00
										 |  |  |      * @return Transaction | 
					
						
							|  |  |  |      * @throws FireflyException | 
					
						
							| 
									
										
										
										
											2021-03-21 09:15:40 +01:00
										 |  |  |      */ | 
					
						
							| 
									
										
										
										
											2023-06-21 12:34:58 +02:00
										 |  |  |     private function getDestinationTransaction(TransactionJournal $journal): Transaction | 
					
						
							| 
									
										
										
										
											2021-03-21 09:15:40 +01:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2023-06-21 12:34:58 +02:00
										 |  |  |         $result = $journal->transactions->first( | 
					
						
							|  |  |  |             static function (Transaction $transaction) { | 
					
						
							|  |  |  |                 return (float)$transaction->amount > 0; // lame but it works
 | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         ); | 
					
						
							|  |  |  |         if (null === $result) { | 
					
						
							|  |  |  |             throw new FireflyException(sprintf('Journal #%d unexpectedly has no destination transaction.', $journal->id)); | 
					
						
							| 
									
										
										
										
											2021-03-21 09:15:40 +01:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-21 12:34:58 +02:00
										 |  |  |         return $result; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2021-03-21 09:15:40 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-21 12:34:58 +02:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * @param string $type | 
					
						
							|  |  |  |      * @param string $amount | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return string | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     private function getAmount(string $type, string $amount): string | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         return app('steam')->positive($amount); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2021-03-21 09:15:40 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-21 12:34:58 +02:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * @param string      $type | 
					
						
							|  |  |  |      * @param string|null $foreignAmount | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return string|null | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     private function getForeignAmount(string $type, ?string $foreignAmount): ?string | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $result = null; | 
					
						
							|  |  |  |         if (null !== $foreignAmount && '' !== $foreignAmount && bccomp('0', $foreignAmount) !== 0) { | 
					
						
							|  |  |  |             $result = app('steam')->positive($foreignAmount); | 
					
						
							| 
									
										
										
										
											2021-03-13 06:25:25 +01:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2021-03-21 09:15:40 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-21 12:34:58 +02:00
										 |  |  |         return $result; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2023-05-29 13:56:55 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-21 12:34:58 +02:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * @param NullArrayObject $dates | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return array | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     private function getDates(NullArrayObject $dates): array | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $fields = [ | 
					
						
							|  |  |  |             'interest_date', | 
					
						
							|  |  |  |             'book_date', | 
					
						
							|  |  |  |             'process_date', | 
					
						
							|  |  |  |             'due_date', | 
					
						
							|  |  |  |             'payment_date', | 
					
						
							|  |  |  |             'invoice_date', | 
					
						
							|  |  |  |         ]; | 
					
						
							|  |  |  |         $return = []; | 
					
						
							|  |  |  |         foreach ($fields as $field) { | 
					
						
							|  |  |  |             $return[$field] = null; | 
					
						
							|  |  |  |             if (null !== $dates[$field]) { | 
					
						
							|  |  |  |                 $return[$field] = $dates[$field]->toAtomString(); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2023-05-29 13:56:55 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-21 12:34:58 +02:00
										 |  |  |         return $return; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2023-05-29 13:56:55 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-21 12:34:58 +02:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * @param TransactionCurrency|null $currency | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return array | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     private function getForeignCurrency(?TransactionCurrency $currency): array | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $array = [ | 
					
						
							|  |  |  |             'id'             => null, | 
					
						
							|  |  |  |             'code'           => null, | 
					
						
							|  |  |  |             'symbol'         => null, | 
					
						
							|  |  |  |             'decimal_places' => null, | 
					
						
							|  |  |  |         ]; | 
					
						
							|  |  |  |         if (null === $currency) { | 
					
						
							|  |  |  |             return $array; | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2023-11-05 19:41:37 +01:00
										 |  |  |         $array['id']             = $currency->id; | 
					
						
							| 
									
										
										
										
											2023-06-21 12:34:58 +02:00
										 |  |  |         $array['code']           = $currency->code; | 
					
						
							|  |  |  |         $array['symbol']         = $currency->symbol; | 
					
						
							|  |  |  |         $array['decimal_places'] = (int)$currency->decimal_places; | 
					
						
							| 
									
										
										
										
											2023-05-29 13:56:55 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-21 12:34:58 +02:00
										 |  |  |         return $array; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2023-05-29 13:56:55 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-21 12:34:58 +02:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * @param Budget|null $budget | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return array | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     private function getBudget(?Budget $budget): array | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $array = [ | 
					
						
							|  |  |  |             'id'   => null, | 
					
						
							|  |  |  |             'name' => null, | 
					
						
							|  |  |  |         ]; | 
					
						
							|  |  |  |         if (null === $budget) { | 
					
						
							|  |  |  |             return $array; | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2023-11-05 19:41:37 +01:00
										 |  |  |         $array['id']   = $budget->id; | 
					
						
							| 
									
										
										
										
											2023-06-21 12:34:58 +02:00
										 |  |  |         $array['name'] = $budget->name; | 
					
						
							| 
									
										
										
										
											2023-05-29 13:56:55 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-21 12:34:58 +02:00
										 |  |  |         return $array; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2023-05-29 13:56:55 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-21 12:34:58 +02:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * @param Category|null $category | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return array | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     private function getCategory(?Category $category): array | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $array = [ | 
					
						
							|  |  |  |             'id'   => null, | 
					
						
							|  |  |  |             'name' => null, | 
					
						
							| 
									
										
										
										
											2023-05-29 13:56:55 +02:00
										 |  |  |         ]; | 
					
						
							| 
									
										
										
										
											2023-06-21 12:34:58 +02:00
										 |  |  |         if (null === $category) { | 
					
						
							|  |  |  |             return $array; | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2023-11-05 19:41:37 +01:00
										 |  |  |         $array['id']   = $category->id; | 
					
						
							| 
									
										
										
										
											2023-06-21 12:34:58 +02:00
										 |  |  |         $array['name'] = $category->name; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return $array; | 
					
						
							| 
									
										
										
										
											2020-10-18 17:44:30 +02:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2021-02-16 10:19:20 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							| 
									
										
										
										
											2023-06-21 12:34:58 +02:00
										 |  |  |      * @param Bill|null $bill | 
					
						
							| 
									
										
										
										
											2021-02-16 10:19:20 +01:00
										 |  |  |      * | 
					
						
							| 
									
										
										
										
											2021-03-21 09:15:40 +01:00
										 |  |  |      * @return array | 
					
						
							| 
									
										
										
										
											2021-02-16 10:19:20 +01:00
										 |  |  |      */ | 
					
						
							| 
									
										
										
										
											2023-06-21 12:34:58 +02:00
										 |  |  |     private function getBill(?Bill $bill): array | 
					
						
							| 
									
										
										
										
											2021-02-16 10:19:20 +01:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2023-06-21 12:34:58 +02:00
										 |  |  |         $array = [ | 
					
						
							|  |  |  |             'id'   => null, | 
					
						
							|  |  |  |             'name' => null, | 
					
						
							|  |  |  |         ]; | 
					
						
							|  |  |  |         if (null === $bill) { | 
					
						
							|  |  |  |             return $array; | 
					
						
							| 
									
										
										
										
											2021-03-21 09:15:40 +01:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2023-06-21 12:34:58 +02:00
										 |  |  |         $array['id']   = (string)$bill->id; | 
					
						
							|  |  |  |         $array['name'] = $bill->name; | 
					
						
							| 
									
										
										
										
											2021-03-21 09:15:40 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-21 12:34:58 +02:00
										 |  |  |         return $array; | 
					
						
							| 
									
										
										
										
											2021-02-16 10:19:20 +01:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2019-08-17 12:09:03 +02:00
										 |  |  | } |