diff --git a/app/Http/Controllers/TransactionController.php b/app/Http/Controllers/TransactionController.php
index 73bf50c..0bfb7a8 100644
--- a/app/Http/Controllers/TransactionController.php
+++ b/app/Http/Controllers/TransactionController.php
@@ -13,7 +13,8 @@ class TransactionController extends Controller
*/
public function index()
{
+ $user = request()->user();
- return view('transaction.index');
+ return view('transaction.index', compact('user'));
}
}
diff --git a/app/Models/User.php b/app/Models/User.php
index 3b5b566..36014fe 100644
--- a/app/Models/User.php
+++ b/app/Models/User.php
@@ -70,7 +70,18 @@ class User extends Authenticatable
public function transactions(): HasManyDeep
{
- return $this->hasManyDeep(Transaction::class, ['portfolio_user', Portfolio::class]);
+ return $this->hasManyDeep(Transaction::class, ['portfolio_user', Portfolio::class])
+ ->withAggregate('market_data', 'name')
+ ->withAggregate('portfolio', 'title')
+ ->withAggregate('market_data', 'market_value')
+ ->withAggregate('market_data', 'fifty_two_week_low')
+ ->withAggregate('market_data', 'fifty_two_week_high')
+ ->withAggregate('market_data', 'updated_at')
+ ->selectRaw('COALESCE(transactions.cost_basis * transactions.quantity, 0) AS total_cost_basis')
+ ->selectRaw('COALESCE(market_data.market_value * transactions.quantity, 0) AS total_market_value')
+ ->selectRaw('COALESCE((market_data.market_value - transactions.cost_basis) * transactions.quantity, 0) AS market_gain_dollars')
+ ->selectRaw('COALESCE(((market_data.market_value - transactions.cost_basis) / transactions.cost_basis) * 100, 0) AS market_gain_percent')
+ ->join('market_data', 'transactions.symbol', 'market_data.symbol');;
}
public function daily_change(): HasManyDeep
diff --git a/lang/en.json b/lang/en.json
index 073774d..95b734c 100644
--- a/lang/en.json
+++ b/lang/en.json
@@ -115,6 +115,7 @@
"Press :key to search": "Press :key to search",
"Search holdings, portfolios, or anything else...": "Search holdings, portfolios, or anything else...",
"Darn! Nothing found for that search.": "Darn! Nothing found for that search.",
+ "Portfolio": "Portfolio",
"Portfolios": "Portfolios",
"Create Portfolio": "Create Portfolio",
"Transactions": "Transactions",
diff --git a/lang/es.json b/lang/es.json
index 6ba4da0..24cd905 100644
--- a/lang/es.json
+++ b/lang/es.json
@@ -115,6 +115,7 @@
"Press :key to search": "Presiona :key para buscar",
"Search holdings, portfolios, or anything else...": "Busca participaciones, portafolios, o cualquier otra cosa...",
"Darn! Nothing found for that search.": "¡Vaya! No se encontró nada para esa búsqueda.",
+ "Portfolio": "Portafolio",
"Portfolios": "Portafolios",
"Create Portfolio": "Crear Portafolio",
"Transactions": "Transacciones",
diff --git a/resources/views/components/partials/side-bar.blade.php b/resources/views/components/partials/side-bar.blade.php
index 5bbee59..51fe43f 100644
--- a/resources/views/components/partials/side-bar.blade.php
+++ b/resources/views/components/partials/side-bar.blade.php
@@ -16,7 +16,7 @@
- {{-- --}}
+
{{-- --}}
diff --git a/resources/views/livewire/holdings-table.blade.php b/resources/views/livewire/holdings-table.blade.php
index 53c2e64..449ce69 100644
--- a/resources/views/livewire/holdings-table.blade.php
+++ b/resources/views/livewire/holdings-table.blade.php
@@ -80,9 +80,6 @@ new class extends Component {
@scope('cell_dividends_earned', $row)
{{ Number::currency($row->dividends_earned ?? 0) }}
@endscope
- @scope('cell_dividends_earned', $row)
- {{ Number::currency($row->dividends_earned ?? 0) }}
- @endscope
@scope('cell_market_data_updated_at', $row)
{{ \Carbon\Carbon::parse($row->market_data_updated_at)->diffForHumans() }}
@endscope
diff --git a/resources/views/livewire/manage-transaction-form.blade.php b/resources/views/livewire/manage-transaction-form.blade.php
index 129f2ff..6472f67 100644
--- a/resources/views/livewire/manage-transaction-form.blade.php
+++ b/resources/views/livewire/manage-transaction-form.blade.php
@@ -62,7 +62,7 @@ new class extends Component {
// $this->transaction->owner_id = auth()->user()->id;
$this->transaction->save();
- $this->success(__('Transaction updated'), redirectTo: route('portfolio.show', ['portfolio' => $this->portfolio->id]));
+ $this->success(__('Transaction updated'), redirectTo: route('portfolio.show', ['portfolio' => $this->transaction->portfolio_id]));
}
public function save()
diff --git a/resources/views/livewire/transactions-table.blade.php b/resources/views/livewire/transactions-table.blade.php
new file mode 100644
index 0000000..65ea31e
--- /dev/null
+++ b/resources/views/livewire/transactions-table.blade.php
@@ -0,0 +1,129 @@
+ 'date', 'direction' => 'desc'];
+
+ public array $headers;
+
+ // methods
+ public function showTransactionDialog($transactionId)
+ {
+ $this->editingTransaction = Transaction::findOrFail($transactionId);
+ $this->dispatch('toggle-manage-transaction');
+ }
+
+ public function mount()
+ {
+ $this->headers = [
+ ['key' => 'date', 'label' => __('Date'), 'sortable' => true],
+ ['key' => 'portfolio_title', 'label' => __('Portfolio')],
+ ['key' => 'symbol', 'label' => __('Symbol'), 'class' => ''],
+ ['key' => 'market_data_name', 'label' => __('Name')],
+ ['key' => 'transaction_type', 'label' => __('Type')],
+ ['key' => 'quantity', 'label' => __('Quantity')],
+ ['key' => 'cost_basis', 'label' => __('Cost Basis')],
+ ['key' => 'total_cost_basis', 'label' => __('Total Cost Basis')],
+ ['key' => 'market_data_market_value', 'label' => __('Market Value')],
+ ['key' => 'total_market_value', 'label' => __('Total Market Value')],
+ // ['key' => 'market_gain_dollars', 'label' => __('Market Gain/Loss')],
+ // ['key' => 'market_gain_percent', 'label' => __('Market Gain/Loss')],
+ // ['key' => 'realized_gain_dollars', 'label' => __('Realized Gain/Loss')],
+ // ['key' => 'dividends_earned', 'label' => __('Dividends Earned')],
+ // ['key' => 'market_data_updated_at', 'label' => __('Market Data Age')],
+ ];
+ }
+
+ public function transactions()
+ {
+ return auth()
+ ->user()
+ ->transactions()
+ ->orderBy(...array_values($this->sortBy))
+ ->paginate(10);
+ }
+
+}; ?>
+
+
+
+ { loading = true }, 200);
+ $wire.showTransactionDialog($event.detail.id).then(() => {
+ clearTimeout(timeout);
+ loading = false;
+ })
+ "
+ :sort-by="$sortBy"
+ with-pagination
+ >
+ @scope('cell_symbol', $row)
+ {{ $row->symbol }}
+
+ @endscope
+ @scope('cell_date', $row)
+ {{ $row->date->format('M d, Y') }}
+ @endscope
+ @scope('cell_transaction_type', $row)
+
+ @endscope
+ @scope('cell_cost_basis', $row)
+ {{ Number::currency($row->cost_basis ?? 0) }}
+ @endscope
+ @scope('cell_total_cost_basis', $row)
+ {{ Number::currency($row->total_cost_basis ?? 0) }}
+ @endscope
+ @scope('cell_realized_gain_dollars', $row)
+ {{ Number::currency($row->realized_gain_dollars ?? 0) }}
+ @endscope
+ @scope('cell_market_gain_dollars', $row)
+ {{ Number::currency($row->market_gain_dollars ?? 0) }}
+ @endscope
+ @scope('cell_market_gain_percent', $row)
+ {{ Number::percentage($row->market_gain_percent ?? 0) }}
+ @endscope
+ @scope('cell_market_data_market_value', $row)
+ {{ Number::currency($row->market_data_market_value ?? 0) }}
+ @endscope
+ @scope('cell_total_market_value', $row)
+ {{ Number::currency($row->total_market_value ?? 0) }}
+ @endscope
+ @scope('cell_dividends_earned', $row)
+ {{ Number::currency($row->dividends_earned ?? 0) }}
+ @endscope
+ @scope('cell_market_data_updated_at', $row)
+ {{ \Carbon\Carbon::parse($row->market_data_updated_at)->diffForHumans() }}
+ @endscope
+
+
+
+ @livewire('manage-transaction-form', [
+ 'transaction' => $editingTransaction,
+ ], key($editingTransaction->id ?? 'new'))
+
+
+
\ No newline at end of file
diff --git a/resources/views/transaction/index.blade.php b/resources/views/transaction/index.blade.php
index 999b12b..83cbb03 100644
--- a/resources/views/transaction/index.blade.php
+++ b/resources/views/transaction/index.blade.php
@@ -3,6 +3,7 @@
- {{-- @livewire('manage-transaction-form', ['portfolio' => $portfolio]) --}}
+ @livewire('transactions-table')
+