1
This commit is contained in:
@@ -0,0 +1,6 @@
|
||||
-- AlterTable: permitir servicios sin catalogo (partidas personalizadas) y campos de cobro por horas
|
||||
ALTER TABLE "ServicioCotizado" ALTER COLUMN "servicioCatalogoId" DROP NOT NULL;
|
||||
ALTER TABLE "ServicioCotizado" ADD COLUMN "nombre" TEXT;
|
||||
ALTER TABLE "ServicioCotizado" ADD COLUMN "esPersonalizado" BOOLEAN NOT NULL DEFAULT false;
|
||||
ALTER TABLE "ServicioCotizado" ADD COLUMN "horas" DOUBLE PRECISION;
|
||||
ALTER TABLE "ServicioCotizado" ADD COLUMN "tarifaHora" DOUBLE PRECISION;
|
||||
@@ -0,0 +1,10 @@
|
||||
-- DropForeignKey
|
||||
ALTER TABLE "ServicioCotizado" DROP CONSTRAINT "ServicioCotizado_servicioCatalogoId_fkey";
|
||||
|
||||
-- AlterTable
|
||||
ALTER TABLE "ServicioCotizado" ADD COLUMN "horasIncluidas" DOUBLE PRECISION,
|
||||
ADD COLUMN "modeloCobro" TEXT NOT NULL DEFAULT 'fijo',
|
||||
ADD COLUMN "montoMinimo" DOUBLE PRECISION;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "ServicioCotizado" ADD CONSTRAINT "ServicioCotizado_servicioCatalogoId_fkey" FOREIGN KEY ("servicioCatalogoId") REFERENCES "ServicioCatalogo"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
||||
@@ -0,0 +1,2 @@
|
||||
-- AlterTable
|
||||
ALTER TABLE "ServicioCatalogo" ADD COLUMN "nivel" TEXT;
|
||||
@@ -0,0 +1,6 @@
|
||||
-- AlterTable
|
||||
ALTER TABLE "Cotizacion" ADD COLUMN "esDoble" BOOLEAN NOT NULL DEFAULT false,
|
||||
ADD COLUMN "opcionesMetadata" JSONB;
|
||||
|
||||
-- AlterTable
|
||||
ALTER TABLE "ServicioCotizado" ADD COLUMN "opcion" TEXT;
|
||||
@@ -0,0 +1,32 @@
|
||||
-- CreateIndex
|
||||
CREATE INDEX "Cliente_nombre_empresa_idx" ON "Cliente"("nombre", "empresa");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "Cotizacion_clienteId_idx" ON "Cotizacion"("clienteId");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "Cotizacion_asesorId_idx" ON "Cotizacion"("asesorId");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "Cotizacion_estado_idx" ON "Cotizacion"("estado");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "Cotizacion_createdAt_idx" ON "Cotizacion"("createdAt");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "FasePaquete_paqueteId_idx" ON "FasePaquete"("paqueteId");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "ServicioCatalogo_categoriaId_idx" ON "ServicioCatalogo"("categoriaId");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "ServicioCatalogo_activo_fase_orden_idx" ON "ServicioCatalogo"("activo", "fase", "orden");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "ServicioCotizado_cotizacionId_idx" ON "ServicioCotizado"("cotizacionId");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "ServicioCotizado_servicioCatalogoId_idx" ON "ServicioCotizado"("servicioCatalogoId");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "ServicioPaquete_fasePaqueteId_idx" ON "ServicioPaquete"("fasePaqueteId");
|
||||
+34
-21
@@ -3,41 +3,54 @@ import { PrismaPg } from "@prisma/adapter-pg";
|
||||
import { hash } from "bcryptjs";
|
||||
|
||||
const adapter = new PrismaPg({
|
||||
host: "localhost",
|
||||
port: 5432,
|
||||
user: "postgres",
|
||||
password: "postgres",
|
||||
database: "cotizador_e3",
|
||||
host: process.env.DB_HOST || "localhost",
|
||||
port: parseInt(process.env.DB_PORT || "5432"),
|
||||
user: process.env.DB_USER || "postgres",
|
||||
password: process.env.DB_PASSWORD || "postgres",
|
||||
database: process.env.DB_NAME || "cotizador_e3",
|
||||
});
|
||||
const prisma = new PrismaClient({ adapter });
|
||||
|
||||
async function main() {
|
||||
console.log("Seeding database...");
|
||||
|
||||
const adminHash = await hash("cee564F1.", 10);
|
||||
const asesorHash = await hash("asesor123", 10);
|
||||
// Credentials come from env. Without SEED_*_PASSWORD the user is created
|
||||
// with a default password only if it doesn't exist yet (never overwritten).
|
||||
const adminEmail = process.env.SEED_ADMIN_EMAIL || "[email protected]";
|
||||
const adminPassword = process.env.SEED_ADMIN_PASSWORD;
|
||||
if (!adminPassword) {
|
||||
console.warn(
|
||||
` AVISO: SEED_ADMIN_PASSWORD no definida. Si el usuario ${adminEmail} no existe, se creará con password "admin123" — cámbiala de inmediato.`
|
||||
);
|
||||
}
|
||||
const adminHash = await hash(adminPassword || "admin123", 10);
|
||||
|
||||
await prisma.user.upsert({
|
||||
where: { email: "[email protected]" },
|
||||
update: { password: adminHash },
|
||||
where: { email: adminEmail },
|
||||
update: adminPassword ? { password: adminHash } : {},
|
||||
create: {
|
||||
email: "[email protected]",
|
||||
email: adminEmail,
|
||||
password: adminHash,
|
||||
name: "Uriel Jareth Alvarado Ortiz",
|
||||
name: process.env.SEED_ADMIN_NAME || "Administrador",
|
||||
role: "admin",
|
||||
},
|
||||
});
|
||||
|
||||
await prisma.user.upsert({
|
||||
where: { email: "[email protected]" },
|
||||
update: { password: asesorHash },
|
||||
create: {
|
||||
email: "[email protected]",
|
||||
password: asesorHash,
|
||||
name: "Lorena Soto",
|
||||
role: "asesor",
|
||||
},
|
||||
});
|
||||
const asesorEmail = process.env.SEED_ASESOR_EMAIL;
|
||||
if (asesorEmail) {
|
||||
const asesorPassword = process.env.SEED_ASESOR_PASSWORD;
|
||||
const asesorHash = await hash(asesorPassword || "asesor123", 10);
|
||||
await prisma.user.upsert({
|
||||
where: { email: asesorEmail },
|
||||
update: asesorPassword ? { password: asesorHash } : {},
|
||||
create: {
|
||||
email: asesorEmail,
|
||||
password: asesorHash,
|
||||
name: process.env.SEED_ASESOR_NAME || "Asesor",
|
||||
role: "asesor",
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
// ── CATEGORIAS (must be created BEFORE servicios for FK) ──
|
||||
const categorias = [
|
||||
|
||||
Reference in New Issue
Block a user