Files
real-estate-app/database/seeders/SalesSeeder.php
Kurtis Holsapple ee37c6de85
Some checks failed
linter / quality (push) Failing after 3m48s
tests / ci (push) Failing after 4m13s
initial commit
2025-07-12 15:01:28 -07:00

149 lines
4.9 KiB
PHP

<?php
namespace Database\Seeders;
use App\Models\Market;
use Illuminate\Database\Seeder;
use App\Models\Sale;
use App\Models\SubMarket;
use Carbon\Carbon;
class SalesSeeder extends Seeder
{
public function run(): void
{
$file = base_path('Test Data for Market Reports.csv');
if (!file_exists($file)) {
$this->command->error("CSV file not found at {$file}");
return;
}
$handle = fopen($file, 'r');
$headers = fgetcsv($handle);
// Manual header mapping to correct column names
$headerMap = [
'Sale ID' => 'sale_id',
'Sale Name' => 'sale_name',
'Record Type' => 'record_type',
'Status' => 'status',
'Comp Source' => 'comp_source',
'Date Last Verified' => 'date_last_verified',
'Property Name' => 'property_name',
'Comp ID' => 'comp_id',
'Street' => 'street',
'City' => 'city',
'State/Province' => 'state_province',
'Zip/Postal Code' => 'zip_postal_code',
'Market' => 'market',
'Property County' => 'property_county',
'Sub-Market' => 'sub_market',
'Property Sub Type' => 'property_sub_type',
'# of Units' => 'num_units',
'Building Size (SF)' => 'building_size_sf',
'Year Built' => 'year_built',
'Listing Date' => 'listing_date',
'DOM (Cumulative)' => 'dom_cumulative',
'Original Listing Price' => 'original_listing_price',
'Listing Price' => 'listing_price',
'Adv - AGI' => 'adv_agi',
'X - AGI' => 'x_agi',
'Adv - NOI' => 'adv_noi',
'X - NOI' => 'x_noi',
'Asking Price (Unit)' => 'asking_price_unit',
'Asking Price (SF)' => 'asking_price_sf',
'Asking GRM' => 'asking_grm',
'Asking Cap' => 'asking_cap',
'CAN/EXP/WTH Date' => 'can_exp_wth_date',
'DOM (Can/Exp)' => 'dom_can_exp',
'Pending Date' => 'pending_date',
'DOM (Pending)' => 'dom_pending',
'Sale Date' => 'sale_date',
'DOM (Sold)' => 'dom_sold',
'Length of Escrow' => 'length_of_escrow',
'Sale Price' => 'sale_price',
'Sold Price (Unit)' => 'sold_price_unit',
'Sold Price Delivered' => 'sold_price_delivered',
'Sold Price (SF)' => 'sold_price_sf',
'Sales Terms' => 'sales_terms',
'Sold GRM' => 'sold_grm',
'Sold Cap' => 'sold_cap',
'Loan Amount' => 'loan_amount',
'% Down Payment' => 'percent_down_payment',
'Owner Occ Purchase' => 'owner_occ_purchase',
'Land Area (Acre)' => 'land_area_acre',
];
// Map headers to DB columns
$columns = array_map(fn($h) => $headerMap[$h] ?? null, $headers);
// List of date columns in your schema
$dateColumns = [
'date_last_verified',
'listing_date',
'can_exp_wth_date',
'pending_date',
'sale_date',
];
while (($row = fgetcsv($handle)) !== false) {
$data = [];
foreach ($columns as $index => $column) {
if ($column) {
$data[$column] = $row[$index];
}
}
// used in a moment
if ($data["market"]) {
$market = Market::firstOrCreate(["name" => $data["market"]]);
if ($data["sub_market"]) {
$subMarket = SubMarket::firstOrCreate(["name" => $data["market"], "market_id" => $market->id]);
}
} else {
$market = "";
$subMarket = "";
}
$data["market_id"] = $market ? $market->id : "";
$data["sub_market_id"] = $subMarket ? $subMarket->id : "";
unset($data["market"]);
unset($data["sub_market"]);
foreach ($dateColumns as $column) {
if (!empty($data[$column])) {
try {
// Normalize date from M/D/YY → Y-m-d
$data[$column] = Carbon::createFromFormat('n/j/y', $data[$column])->format('Y-m-d');
} catch (\Exception $e) {
// You can log or handle formatting errors if needed
$data[$column] = null;
}
} else {
$data[$column] = null;
}
}
foreach ($data as $col => $val) {
if (trim($val) === "") {
$data[$col] = null;
}
if ($val === "#Error!") {
$data[$col] = -1;
}
}
Sale::create($data);
}
fclose($handle);
$this->command->info('✅ Sales imported successfully.');
}
}