Files
goodgo-platform/tmp/tec2773-industrial-stash/scripts/seed-industrial-listings.ts

510 lines
16 KiB
TypeScript

/**
* Seed industrial listings — 12 sample listings across 8 parks.
*
* Usage: npx tsx scripts/seed-industrial-listings.ts
* Idempotent: uses upsert on id.
*/
import { PrismaPg } from '@prisma/adapter-pg';
import {
PrismaClient,
IndustrialPropertyType,
IndustrialLeaseType,
IndustrialListingStatus,
} from '@prisma/client';
import pg from 'pg';
const pool = new pg.Pool({ connectionString: process.env['DATABASE_URL'] });
const adapter = new PrismaPg(pool);
const prisma = new PrismaClient({ adapter });
interface IndustrialListingSeed {
id: string;
parkId: string;
sellerId: string;
agentId: string | null;
propertyType: IndustrialPropertyType;
leaseType: IndustrialLeaseType;
status: IndustrialListingStatus;
title: string;
description: string;
areaM2: number;
ceilingHeightM: number | null;
floorLoadTonM2: number | null;
columnSpacingM: number | null;
dockCount: number | null;
craneCapacityTon: number | null;
hasMezzanine: boolean;
hasOfficeArea: boolean;
officeAreaM2: number | null;
priceUsdM2: number | null;
pricingUnit: string | null;
totalLeasePrice: number | null;
managementFee: number | null;
depositMonths: number | null;
minLeaseYears: number | null;
maxLeaseYears: number | null;
availableFrom: Date | null;
powerCapacityKva: number | null;
waterSupplyM3Day: number | null;
}
const now = new Date();
const oneMonthLater = new Date(now.getTime() + 30 * 24 * 60 * 60 * 1000);
const threeMonthsLater = new Date(now.getTime() + 90 * 24 * 60 * 60 * 1000);
const LISTINGS: IndustrialListingSeed[] = [
// --- VSIP Bac Ninh (seed-kcn-001) — 2 listings ---
{
id: 'seed-ind-listing-001',
parkId: 'seed-kcn-001',
sellerId: 'seed-seller-001',
agentId: 'seed-agentprofile-001',
propertyType: IndustrialPropertyType.READY_BUILT_FACTORY,
leaseType: IndustrialLeaseType.FACTORY_LEASE,
status: IndustrialListingStatus.ACTIVE,
title: 'Nhà xưởng xây sẵn 3.000m² KCN VSIP Bắc Ninh',
description: 'Nhà xưởng xây sẵn tiêu chuẩn VSIP tại KCN VSIP Bắc Ninh. Kết cấu thép tiền chế, nền bê tông cốt thép chịu tải 3 tấn/m², hệ thống PCCC tự động, điện 3 pha 500kVA.',
areaM2: 3000,
ceilingHeightM: 10,
floorLoadTonM2: 3,
columnSpacingM: 12,
dockCount: 4,
craneCapacityTon: null,
hasMezzanine: true,
hasOfficeArea: true,
officeAreaM2: 200,
priceUsdM2: 5.5,
pricingUnit: 'usd/m2/month',
totalLeasePrice: 16500,
managementFee: 0.7,
depositMonths: 3,
minLeaseYears: 3,
maxLeaseYears: 10,
availableFrom: oneMonthLater,
powerCapacityKva: 500,
waterSupplyM3Day: 50,
},
{
id: 'seed-ind-listing-002',
parkId: 'seed-kcn-001',
sellerId: 'seed-seller-002',
agentId: null,
propertyType: IndustrialPropertyType.INDUSTRIAL_LAND,
leaseType: IndustrialLeaseType.LAND_LEASE,
status: IndustrialListingStatus.ACTIVE,
title: 'Đất công nghiệp 10.000m² VSIP Bắc Ninh — vị trí đắc địa',
description: 'Lô đất công nghiệp mặt tiền đường chính 40m, gần cổng chính KCN. Phù hợp xây dựng nhà máy sản xuất điện tử, linh kiện.',
areaM2: 10000,
ceilingHeightM: null,
floorLoadTonM2: null,
columnSpacingM: null,
dockCount: null,
craneCapacityTon: null,
hasMezzanine: false,
hasOfficeArea: false,
officeAreaM2: null,
priceUsdM2: 90,
pricingUnit: 'usd/m2/year',
totalLeasePrice: 900000,
managementFee: 0.7,
depositMonths: 6,
minLeaseYears: 20,
maxLeaseYears: 50,
availableFrom: now,
powerCapacityKva: null,
waterSupplyM3Day: null,
},
// --- Amata Dong Nai (seed-kcn-003) — 2 listings ---
{
id: 'seed-ind-listing-003',
parkId: 'seed-kcn-003',
sellerId: 'seed-seller-001',
agentId: 'seed-agentprofile-002',
propertyType: IndustrialPropertyType.READY_BUILT_WAREHOUSE,
leaseType: IndustrialLeaseType.WAREHOUSE_LEASE,
status: IndustrialListingStatus.ACTIVE,
title: 'Kho xưởng 5.000m² KCN Amata Đồng Nai — sẵn dock container',
description: 'Kho xưởng xây sẵn với 6 dock container, hệ thống kệ pallet, nền chịu tải 5 tấn/m². Thích hợp logistics và phân phối.',
areaM2: 5000,
ceilingHeightM: 12,
floorLoadTonM2: 5,
columnSpacingM: 15,
dockCount: 6,
craneCapacityTon: 5,
hasMezzanine: false,
hasOfficeArea: true,
officeAreaM2: 150,
priceUsdM2: 5.0,
pricingUnit: 'usd/m2/month',
totalLeasePrice: 25000,
managementFee: 0.65,
depositMonths: 3,
minLeaseYears: 2,
maxLeaseYears: 10,
availableFrom: oneMonthLater,
powerCapacityKva: 300,
waterSupplyM3Day: 30,
},
{
id: 'seed-ind-listing-004',
parkId: 'seed-kcn-003',
sellerId: 'seed-seller-002',
agentId: 'seed-agentprofile-001',
propertyType: IndustrialPropertyType.READY_BUILT_FACTORY,
leaseType: IndustrialLeaseType.FACTORY_LEASE,
status: IndustrialListingStatus.DRAFT,
title: 'Nhà máy sản xuất 8.000m² Amata — cần bàn giao sớm',
description: 'Nhà máy quy mô lớn với 2 bay sản xuất, cầu trục 10 tấn, hệ thống xử lý nước thải riêng. Đang hoàn thiện, dự kiến bàn giao Q3/2026.',
areaM2: 8000,
ceilingHeightM: 14,
floorLoadTonM2: 5,
columnSpacingM: 18,
dockCount: 8,
craneCapacityTon: 10,
hasMezzanine: true,
hasOfficeArea: true,
officeAreaM2: 500,
priceUsdM2: 4.8,
pricingUnit: 'usd/m2/month',
totalLeasePrice: 38400,
managementFee: 0.65,
depositMonths: 6,
minLeaseYears: 5,
maxLeaseYears: 20,
availableFrom: threeMonthsLater,
powerCapacityKva: 1500,
waterSupplyM3Day: 100,
},
// --- Nam Dinh Vu (seed-kcn-005) ---
{
id: 'seed-ind-listing-005',
parkId: 'seed-kcn-005',
sellerId: 'seed-seller-001',
agentId: 'seed-agentprofile-003',
propertyType: IndustrialPropertyType.LOGISTICS_CENTER,
leaseType: IndustrialLeaseType.WAREHOUSE_LEASE,
status: IndustrialListingStatus.ACTIVE,
title: 'Trung tâm logistics 15.000m² KCN Nam Đình Vũ — sát cảng biển',
description: 'Trung tâm logistics hiện đại ngay cảng Đình Vũ, phù hợp cho kho ngoại quan, trung chuyển hàng hóa quốc tế. Hệ thống bãi container 5.000m².',
areaM2: 15000,
ceilingHeightM: 12,
floorLoadTonM2: 5,
columnSpacingM: 20,
dockCount: 12,
craneCapacityTon: null,
hasMezzanine: false,
hasOfficeArea: true,
officeAreaM2: 300,
priceUsdM2: 4.8,
pricingUnit: 'usd/m2/month',
totalLeasePrice: 72000,
managementFee: 0.6,
depositMonths: 3,
minLeaseYears: 3,
maxLeaseYears: 15,
availableFrom: now,
powerCapacityKva: 800,
waterSupplyM3Day: 60,
},
// --- Long Hau (seed-kcn-006) ---
{
id: 'seed-ind-listing-006',
parkId: 'seed-kcn-006',
sellerId: 'seed-seller-002',
agentId: 'seed-agentprofile-002',
propertyType: IndustrialPropertyType.READY_BUILT_WAREHOUSE,
leaseType: IndustrialLeaseType.SUBLEASE,
status: IndustrialListingStatus.ACTIVE,
title: 'Kho hàng 2.000m² Long Hậu — cho thuê lại giá tốt',
description: 'Kho hàng cho thuê lại tại KCN Long Hậu, còn 4 năm hợp đồng gốc. Nền epoxy, PCCC đầy đủ, gần cảng Hiệp Phước.',
areaM2: 2000,
ceilingHeightM: 9,
floorLoadTonM2: 3,
columnSpacingM: 10,
dockCount: 2,
craneCapacityTon: null,
hasMezzanine: false,
hasOfficeArea: false,
officeAreaM2: null,
priceUsdM2: 4.0,
pricingUnit: 'usd/m2/month',
totalLeasePrice: 8000,
managementFee: 0.5,
depositMonths: 2,
minLeaseYears: 1,
maxLeaseYears: 4,
availableFrom: now,
powerCapacityKva: 200,
waterSupplyM3Day: 15,
},
// --- Thang Long II Hung Yen (seed-kcn-011) ---
{
id: 'seed-ind-listing-007',
parkId: 'seed-kcn-011',
sellerId: 'seed-seller-001',
agentId: 'seed-agentprofile-001',
propertyType: IndustrialPropertyType.READY_BUILT_FACTORY,
leaseType: IndustrialLeaseType.FACTORY_LEASE,
status: IndustrialListingStatus.ACTIVE,
title: 'Xưởng sản xuất 4.500m² KCN Thăng Long II — tiêu chuẩn Nhật',
description: 'Nhà xưởng tiêu chuẩn Nhật Bản tại KCN Thăng Long II Hưng Yên. Clean room sẵn, hệ thống AHU, phù hợp sản xuất linh kiện điện tử.',
areaM2: 4500,
ceilingHeightM: 10,
floorLoadTonM2: 3,
columnSpacingM: 12,
dockCount: 4,
craneCapacityTon: null,
hasMezzanine: true,
hasOfficeArea: true,
officeAreaM2: 350,
priceUsdM2: 4.5,
pricingUnit: 'usd/m2/month',
totalLeasePrice: 20250,
managementFee: 0.6,
depositMonths: 3,
minLeaseYears: 3,
maxLeaseYears: 15,
availableFrom: oneMonthLater,
powerCapacityKva: 600,
waterSupplyM3Day: 40,
},
// --- Yen Phong Bac Ninh (seed-kcn-012) ---
{
id: 'seed-ind-listing-008',
parkId: 'seed-kcn-012',
sellerId: 'seed-seller-002',
agentId: null,
propertyType: IndustrialPropertyType.INDUSTRIAL_LAND,
leaseType: IndustrialLeaseType.LAND_LEASE,
status: IndustrialListingStatus.ACTIVE,
title: 'Đất công nghiệp 5.000m² Yên Phong — gần Samsung',
description: 'Lô đất công nghiệp cuối cùng tại KCN Yên Phong, liền kề nhà máy Samsung Display. Hạ tầng hoàn chỉnh, phù hợp nhà cung cấp Samsung.',
areaM2: 5000,
ceilingHeightM: null,
floorLoadTonM2: null,
columnSpacingM: null,
dockCount: null,
craneCapacityTon: null,
hasMezzanine: false,
hasOfficeArea: false,
officeAreaM2: null,
priceUsdM2: 85,
pricingUnit: 'usd/m2/year',
totalLeasePrice: 425000,
managementFee: 0.6,
depositMonths: 6,
minLeaseYears: 20,
maxLeaseYears: 47,
availableFrom: now,
powerCapacityKva: null,
waterSupplyM3Day: null,
},
// --- DEEP C Hai Phong (seed-kcn-016) ---
{
id: 'seed-ind-listing-009',
parkId: 'seed-kcn-016',
sellerId: 'seed-seller-001',
agentId: 'seed-agentprofile-003',
propertyType: IndustrialPropertyType.READY_BUILT_FACTORY,
leaseType: IndustrialLeaseType.FACTORY_LEASE,
status: IndustrialListingStatus.ACTIVE,
title: 'Nhà xưởng xanh 6.000m² DEEP C Hải Phòng — EDGE certified',
description: 'Nhà xưởng đạt chứng chỉ EDGE Green Building, mái solar panels 200kWp, hệ thống thu gom nước mưa. Phù hợp doanh nghiệp ESG.',
areaM2: 6000,
ceilingHeightM: 11,
floorLoadTonM2: 3,
columnSpacingM: 15,
dockCount: 6,
craneCapacityTon: null,
hasMezzanine: false,
hasOfficeArea: true,
officeAreaM2: 250,
priceUsdM2: 4.5,
pricingUnit: 'usd/m2/month',
totalLeasePrice: 27000,
managementFee: 0.6,
depositMonths: 3,
minLeaseYears: 3,
maxLeaseYears: 15,
availableFrom: threeMonthsLater,
powerCapacityKva: 700,
waterSupplyM3Day: 50,
},
// --- My Phuoc 3 Binh Duong (seed-kcn-017) ---
{
id: 'seed-ind-listing-010',
parkId: 'seed-kcn-017',
sellerId: 'seed-seller-002',
agentId: 'seed-agentprofile-002',
propertyType: IndustrialPropertyType.READY_BUILT_WAREHOUSE,
leaseType: IndustrialLeaseType.WAREHOUSE_LEASE,
status: IndustrialListingStatus.ACTIVE,
title: 'Kho xưởng 3.500m² Mỹ Phước 3 — gần đường Mỹ Phước Tân Vạn',
description: 'Kho xưởng xây sẵn mặt đường nội khu, gần đường Mỹ Phước - Tân Vạn. Phù hợp kho hàng FMCG, logistics e-commerce.',
areaM2: 3500,
ceilingHeightM: 10,
floorLoadTonM2: 3,
columnSpacingM: 12,
dockCount: 4,
craneCapacityTon: null,
hasMezzanine: false,
hasOfficeArea: true,
officeAreaM2: 100,
priceUsdM2: 4.8,
pricingUnit: 'usd/m2/month',
totalLeasePrice: 16800,
managementFee: 0.55,
depositMonths: 3,
minLeaseYears: 2,
maxLeaseYears: 10,
availableFrom: oneMonthLater,
powerCapacityKva: 400,
waterSupplyM3Day: 30,
},
// --- KTG Nhon Trach (seed-kcn-009) ---
{
id: 'seed-ind-listing-011',
parkId: 'seed-kcn-009',
sellerId: 'seed-seller-001',
agentId: 'seed-agentprofile-001',
propertyType: IndustrialPropertyType.OFFICE_IN_PARK,
leaseType: IndustrialLeaseType.FACTORY_LEASE,
status: IndustrialListingStatus.DRAFT,
title: 'Văn phòng trong KCN KTG Nhơn Trạch 500m²',
description: 'Văn phòng mới xây trong KCN KTG Nhơn Trạch, 2 tầng, điều hòa trung tâm, bãi đỗ xe riêng. Phù hợp văn phòng vùng cho nhà máy lân cận.',
areaM2: 500,
ceilingHeightM: 3.5,
floorLoadTonM2: null,
columnSpacingM: null,
dockCount: null,
craneCapacityTon: null,
hasMezzanine: false,
hasOfficeArea: true,
officeAreaM2: 500,
priceUsdM2: 8.0,
pricingUnit: 'usd/m2/month',
totalLeasePrice: 4000,
managementFee: 0.55,
depositMonths: 2,
minLeaseYears: 1,
maxLeaseYears: 5,
availableFrom: now,
powerCapacityKva: 100,
waterSupplyM3Day: 5,
},
// --- Chu Lai Quang Nam (seed-kcn-020) ---
{
id: 'seed-ind-listing-012',
parkId: 'seed-kcn-020',
sellerId: 'seed-seller-002',
agentId: 'seed-agentprofile-003',
propertyType: IndustrialPropertyType.INDUSTRIAL_LAND,
leaseType: IndustrialLeaseType.LAND_LEASE,
status: IndustrialListingStatus.ACTIVE,
title: 'Đất KCN Chu Lai 20.000m² — ưu đãi KKTM đặc biệt',
description: 'Lô đất lớn tại KCN Chu Lai, thuộc Khu kinh tế mở Chu Lai với ưu đãi thuế đặc biệt: miễn tiền thuê đất 15 năm, miễn thuế NK toàn bộ. Phù hợp sản xuất ô tô, cơ khí.',
areaM2: 20000,
ceilingHeightM: null,
floorLoadTonM2: null,
columnSpacingM: null,
dockCount: null,
craneCapacityTon: null,
hasMezzanine: false,
hasOfficeArea: false,
officeAreaM2: null,
priceUsdM2: 40,
pricingUnit: 'usd/m2/year',
totalLeasePrice: 800000,
managementFee: 0.35,
depositMonths: 6,
minLeaseYears: 20,
maxLeaseYears: 50,
availableFrom: now,
powerCapacityKva: null,
waterSupplyM3Day: null,
},
];
export async function seedIndustrialListings() {
console.log('🏭 Seeding industrial listings...');
for (const l of LISTINGS) {
const isPublished =
l.status === IndustrialListingStatus.ACTIVE ||
l.status === IndustrialListingStatus.RESERVED;
await prisma.industrialListing.upsert({
where: { id: l.id },
update: {
title: l.title,
status: l.status,
priceUsdM2: l.priceUsdM2,
totalLeasePrice: l.totalLeasePrice,
},
create: {
id: l.id,
parkId: l.parkId,
sellerId: l.sellerId,
agentId: l.agentId,
propertyType: l.propertyType,
leaseType: l.leaseType,
status: l.status,
title: l.title,
description: l.description,
areaM2: l.areaM2,
ceilingHeightM: l.ceilingHeightM,
floorLoadTonM2: l.floorLoadTonM2,
columnSpacingM: l.columnSpacingM,
dockCount: l.dockCount,
craneCapacityTon: l.craneCapacityTon,
hasMezzanine: l.hasMezzanine,
hasOfficeArea: l.hasOfficeArea,
officeAreaM2: l.officeAreaM2,
priceUsdM2: l.priceUsdM2,
pricingUnit: l.pricingUnit,
totalLeasePrice: l.totalLeasePrice,
managementFee: l.managementFee,
depositMonths: l.depositMonths,
minLeaseYears: l.minLeaseYears,
maxLeaseYears: l.maxLeaseYears,
availableFrom: l.availableFrom,
powerCapacityKva: l.powerCapacityKva,
waterSupplyM3Day: l.waterSupplyM3Day,
viewCount: Math.floor(Math.random() * 200) + 5,
inquiryCount: Math.floor(Math.random() * 15),
publishedAt: isPublished ? new Date() : null,
},
});
console.log(`${l.title.slice(0, 60)}...`);
}
console.log(`🏭 Seeded ${LISTINGS.length} industrial listings.`);
}
// Run standalone
async function main() {
try {
await seedIndustrialListings();
} catch (err) {
console.error('Seed error:', err);
process.exit(1);
} finally {
await prisma.$disconnect();
await pool.end();
}
}
if (require.main === module) {
void main();
}