Files
investbrain/app/Imports/Sheets/TransactionsSheet.php
T

71 lines
2.6 KiB
PHP
Raw Normal View History

2024-08-07 18:29:23 -05:00
<?php
namespace App\Imports\Sheets;
use App\Models\Transaction;
use Illuminate\Support\Collection;
use Maatwebsite\Excel\Concerns\ToCollection;
2024-08-30 20:22:28 -05:00
use App\Imports\ValidatesPortfolioPermissions;
2024-08-07 18:29:23 -05:00
use Maatwebsite\Excel\Concerns\SkipsEmptyRows;
use Maatwebsite\Excel\Concerns\WithHeadingRow;
2024-08-29 21:39:59 -05:00
use Maatwebsite\Excel\Concerns\WithValidation;
2024-08-28 22:06:47 -05:00
use Maatwebsite\Excel\Concerns\WithChunkReading;
2024-08-07 18:29:23 -05:00
2024-08-29 21:39:59 -05:00
class TransactionsSheet implements ToCollection, WithHeadingRow, WithValidation, SkipsEmptyRows, WithChunkReading
2024-08-07 18:29:23 -05:00
{
2024-08-30 20:22:28 -05:00
use ValidatesPortfolioPermissions;
2024-08-07 18:29:23 -05:00
public function collection(Collection $transactions)
{
2024-08-30 20:22:28 -05:00
$this->validatePortfolioPermissions($transactions);
2024-08-29 23:36:44 -05:00
Transaction::withoutEvents(function () use ($transactions) {
foreach ($transactions->sortBy('date') as $transaction) {
2024-08-30 20:22:28 -05:00
Transaction::where('id', $transaction['transaction_id'])
2024-08-29 23:36:44 -05:00
->firstOr(function () use ($transaction) {
2024-08-30 20:22:28 -05:00
$transaction = Transaction::make()->forceFill([
2024-08-29 23:36:44 -05:00
'id' => $transaction['transaction_id'],
'symbol' => $transaction['symbol'],
'portfolio_id' => $transaction['portfolio_id'],
'transaction_type' => $transaction['transaction_type'],
'quantity' => $transaction['quantity'],
'cost_basis' => $transaction['cost_basis'] ?? 0,
'sale_price' => $transaction['sale_price'],
'split' => $transaction['split'] ?? null,
'date' => $transaction['date'],
2024-08-30 20:22:28 -05:00
]);
$transaction->save();
2024-08-29 23:36:44 -05:00
2024-08-30 20:22:28 -05:00
return $transaction;
})
2024-08-30 21:58:38 -05:00
->syncToHolding();
2024-08-29 23:36:44 -05:00
}
});
2024-08-30 20:22:28 -05:00
2024-08-07 18:29:23 -05:00
}
2024-08-28 22:06:47 -05:00
2024-08-29 21:39:59 -05:00
public function rules(): array
{
return [
'transaction_id' => ['sometimes', 'nullable'],
'symbol' => ['required', 'string'],
'portfolio_id' => ['required', 'exists:portfolios,id'],
'quantity' => ['required', 'min:0', 'numeric'],
'transaction_type' => ['required', 'in:BUY,SELL'],
'date' => ['required', 'date'],
'quantity' => ['required', 'min:0', 'numeric'],
'cost_basis' => ['sometimes', 'nullable', 'min:0', 'numeric'],
'sale_price' => ['sometimes', 'nullable', 'min:0', 'numeric'],
];
}
2024-08-28 22:06:47 -05:00
public function chunkSize(): int
{
return 500;
}
2024-08-07 18:29:23 -05:00
}