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); + } + +}; ?> + +
+ + + @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') +