This commit is contained in:
2026-06-10 02:15:05 -06:00
parent fdbb64788a
commit 4334052267
12 changed files with 813 additions and 21 deletions
@@ -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
View File
@@ -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 = [