diff --git a/Makefile b/Makefile index 2cc35c2..0827416 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,9 @@ estructura: powershell -ExecutionPolicy Bypass -File ./dev/scripts/estructura.ps1 +testdb: + docker compose -f api/dev/docker-compose.yml up -d + build: docker compose build diff --git a/api/.env.example b/api/.env.example new file mode 100644 index 0000000..c97adea --- /dev/null +++ b/api/.env.example @@ -0,0 +1,8 @@ +# Environment variables declared in this file are automatically made available to Prisma. +# See the documentation for more detail: https://pris.ly/d/prisma-schema#accessing-environment-variables-from-the-schema + +# Prisma supports the native connection string format for PostgreSQL, MySQL, SQLite, SQL Server, MongoDB and CockroachDB. +# See the documentation for all the connection string options: https://pris.ly/d/connection-strings + +DATABASE_URL=postgresql://planilla:planilla@localhost:5434/planilla_db?schema=public + diff --git a/api/.gitignore b/api/.gitignore index 3a13d4f..8299001 100644 --- a/api/.gitignore +++ b/api/.gitignore @@ -1,4 +1,5 @@ node_modules +dev # Keep environment variables out of version control .env prisma/generated \ No newline at end of file diff --git a/api/prisma/migrations/20250515020056_init/migration.sql b/api/prisma/migrations/20250515020056_init/migration.sql new file mode 100644 index 0000000..555a426 --- /dev/null +++ b/api/prisma/migrations/20250515020056_init/migration.sql @@ -0,0 +1,84 @@ +-- CreateTable +CREATE TABLE "Cliente" ( + "id" BIGSERIAL NOT NULL, + "created_at" TIMESTAMP(3) NOT NULL DEFAULT (now() AT TIME ZONE 'utc'), + "updated_at" TIMESTAMP(3) NOT NULL DEFAULT (now() AT TIME ZONE 'utc'), + "name" TEXT NOT NULL, + "cedula" BIGINT NOT NULL, + "ubicacion" TEXT NOT NULL DEFAULT '.', + "grupo_estudio" TEXT, + "empleado" BOOLEAN NOT NULL DEFAULT false, + "avatar_url" TEXT, + "telefono" TEXT, + "idciat" TEXT, + + CONSTRAINT "Cliente_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "Planilla" ( + "id" BIGSERIAL NOT NULL, + "created_at" TIMESTAMP(3) NOT NULL DEFAULT (now() AT TIME ZONE 'utc'), + "updated_at" TIMESTAMP(3) NOT NULL DEFAULT (now() AT TIME ZONE 'utc'), + "fecha_desde" TIMESTAMP(3) NOT NULL, + "fecha_hasta" TIMESTAMP(3) NOT NULL, + "titulo" TEXT NOT NULL, + "total" DECIMAL(65,30), + "estado" TEXT NOT NULL DEFAULT 'pagado', + "fecha_anulado" TIMESTAMP(3), + "empleado_id" BIGINT NOT NULL, + "creador_id" UUID, + "anulador_id" UUID, + + CONSTRAINT "Planilla_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "TareaRealizada" ( + "id" BIGSERIAL NOT NULL, + "empleado_id" BIGINT NOT NULL, + "planilla_id" BIGINT, + "titulo" TEXT NOT NULL, + "precio" DOUBLE PRECISION, + "estado" TEXT NOT NULL DEFAULT 'pendiente', + "observacion" TEXT, + "fecha" TIMESTAMP(3) NOT NULL, + "created_at" TIMESTAMP(3) NOT NULL DEFAULT (now() AT TIME ZONE 'utc'), + "tipo" TEXT NOT NULL DEFAULT '', + "fecha_anulado" TIMESTAMP(3), + "creador_id" UUID NOT NULL, + "anulador_id" UUID, + + CONSTRAINT "TareaRealizada_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "Asistencia" ( + "id" BIGSERIAL NOT NULL, + "created_at" TIMESTAMP(3) NOT NULL DEFAULT (now() AT TIME ZONE 'utc'), + "updated_at" TIMESTAMP(3) NOT NULL DEFAULT (now() AT TIME ZONE 'utc'), + "entrada" TIMESTAMP(3) DEFAULT (now() AT TIME ZONE 'utc'), + "salida" TIMESTAMP(3), + "historial" JSONB, + "observacion" TEXT, + "estado" TEXT DEFAULT 'pendiente', + "fecha_anulado" TIMESTAMP(3), + "empleado_id" BIGINT NOT NULL, + "creador_id" UUID NOT NULL, + "modificado_id" UUID, + "anulador_id" UUID, + + CONSTRAINT "Asistencia_pkey" PRIMARY KEY ("id") +); + +-- CreateIndex +CREATE UNIQUE INDEX "Cliente_cedula_key" ON "Cliente"("cedula"); + +-- AddForeignKey +ALTER TABLE "Planilla" ADD CONSTRAINT "Planilla_empleado_id_fkey" FOREIGN KEY ("empleado_id") REFERENCES "Cliente"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "TareaRealizada" ADD CONSTRAINT "TareaRealizada_empleado_id_fkey" FOREIGN KEY ("empleado_id") REFERENCES "Cliente"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "Asistencia" ADD CONSTRAINT "Asistencia_empleado_id_fkey" FOREIGN KEY ("empleado_id") REFERENCES "Cliente"("id") ON DELETE RESTRICT ON UPDATE CASCADE; diff --git a/api/prisma/migrations/migration_lock.toml b/api/prisma/migrations/migration_lock.toml new file mode 100644 index 0000000..044d57c --- /dev/null +++ b/api/prisma/migrations/migration_lock.toml @@ -0,0 +1,3 @@ +# Please do not edit this file manually +# It should be added in your version-control system (e.g., Git) +provider = "postgresql" diff --git a/api/prisma/schema.prisma b/api/prisma/schema.prisma index 3aca590..d1c3c07 100644 --- a/api/prisma/schema.prisma +++ b/api/prisma/schema.prisma @@ -6,13 +6,12 @@ generator client { datasource db { provider = "postgresql" url = env("DATABASE_URL") - } model Cliente { id BigInt @id @default(autoincrement()) - created_at DateTime @default(dbgenerated("now() AT TIME ZONE 'utc'::text")) - updated_at DateTime @default(dbgenerated("now() AT TIME ZONE 'utc'::text")) + created_at DateTime @default(dbgenerated("(now() AT TIME ZONE 'utc')")) + updated_at DateTime @default(dbgenerated("(now() AT TIME ZONE 'utc')")) @updatedAt name String cedula BigInt @unique ubicacion String @default(".") @@ -28,15 +27,15 @@ model Cliente { } model Planilla { - id BigInt @id @default(autoincrement()) - created_at DateTime @default(dbgenerated("now() AT TIME ZONE 'utc'::text")) - updated_at DateTime @default(dbgenerated("now() AT TIME ZONE 'utc'::text")) - fecha_desde DateTime - fecha_hasta DateTime - titulo String - total Decimal? - estado String @default("pagado") - fecha_anulado DateTime? + id BigInt @id @default(autoincrement()) + created_at DateTime @default(dbgenerated("(now() AT TIME ZONE 'utc')")) + updated_at DateTime @default(dbgenerated("(now() AT TIME ZONE 'utc')")) @updatedAt + fecha_desde DateTime + fecha_hasta DateTime + titulo String + total Decimal? + estado String @default("pagado") + fecha_anulado DateTime? empleado_id BigInt empleado Cliente @relation(fields: [empleado_id], references: [id]) @@ -54,7 +53,7 @@ model TareaRealizada { estado String @default("pendiente") observacion String? fecha DateTime - created_at DateTime @default(dbgenerated("now() AT TIME ZONE 'utc'::text")) + created_at DateTime @default(dbgenerated("(now() AT TIME ZONE 'utc')")) tipo String @default("") fecha_anulado DateTime? @@ -66,9 +65,9 @@ model TareaRealizada { model Asistencia { id BigInt @id @default(autoincrement()) - created_at DateTime @default(dbgenerated("now() AT TIME ZONE 'utc'::text")) - updated_at DateTime @default(dbgenerated("now() AT TIME ZONE 'utc'::text")) - entrada DateTime? @default(dbgenerated("now() AT TIME ZONE 'utc'::text")) + created_at DateTime @default(dbgenerated("(now() AT TIME ZONE 'utc')")) + updated_at DateTime @default(dbgenerated("(now() AT TIME ZONE 'utc')")) @updatedAt + entrada DateTime? @default(dbgenerated("(now() AT TIME ZONE 'utc')")) salida DateTime? historial Json? observacion String? diff --git a/docker-compose.yml b/docker-compose.yml index 8ed7312..4451114 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,10 +1,10 @@ +version: "3.8" + services: agent: image: gitea.interno.com/nucleo000/planilla-agent:latest build: ./agent restart: unless-stopped - # volumes: - # - /srv/planilla/agent:/app networks: [planilla] api: @@ -12,37 +12,29 @@ services: build: ./api restart: unless-stopped environment: - - DATABASE_URL=postgresql://planilla:secret@db:5432/planilla_db - - depends_on: [db] - ports: ["3009:4000"] - # volumes: - # - /srv/planilla/api:/app + DATABASE_URL: "postgresql://planilla:secret@db:5432/planilla_db?schema=public" + depends_on: + - db + ports: + - "3009:4000" networks: [planilla] - # mcp (comentado aún, por si lo activás después) - # mcp: - # image: gitea.interno.com/nucleo000/planilla-mcp:latest - # build: ./mcp - # volumes: - # - /srv/planilla/mcp:/app - # networks: [planilla] - ui: image: gitea.interno.com/nucleo000/planilla-ui:latest build: ./ui restart: unless-stopped - ports: ["3008:80"] - # volumes: - # - /srv/planilla/ui:/app + ports: + - "3008:80" networks: [planilla] worker: image: gitea.interno.com/nucleo000/planilla-worker:latest build: ./worker - depends_on: [db] - # volumes: - # - /srv/planilla/worker:/app + restart: unless-stopped + environment: + DATABASE_URL: "postgresql://planilla:secret@db:5432/planilla_db?schema=public" + depends_on: + - db networks: [planilla] db: @@ -66,7 +58,7 @@ services: - db volumes: - /srv/planilla/pgadmin:/var/lib/pgadmin - user: "5050:5050" # ✅ necesario para evitar error de permisos + user: "5050:5050" networks: [planilla] volumes: diff --git a/estructura.txt b/estructura.txt index 644c259..aa815fe 100644 --- a/estructura.txt +++ b/estructura.txt @@ -32,6 +32,7 @@ C:\no guardar\nucleo V3\planilla\agent\utils\decryptMediaContent.js C:\no guardar\nucleo V3\planilla\agent\utils\processMessage.js C:\no guardar\nucleo V3\planilla\agent\utils\saveMedia.js C:\no guardar\nucleo V3\planilla\api\cron_jobs +C:\no guardar\nucleo V3\planilla\api\dev C:\no guardar\nucleo V3\planilla\api\prisma C:\no guardar\nucleo V3\planilla\api\.env C:\no guardar\nucleo V3\planilla\api\Dockerfile @@ -39,6 +40,7 @@ C:\no guardar\nucleo V3\planilla\api\entrypoint.sh C:\no guardar\nucleo V3\planilla\api\package-lock.json C:\no guardar\nucleo V3\planilla\api\package.json C:\no guardar\nucleo V3\planilla\api\server.js +C:\no guardar\nucleo V3\planilla\api\dev\docker-compose.yml C:\no guardar\nucleo V3\planilla\api\prisma\generated C:\no guardar\nucleo V3\planilla\api\prisma\schema.prisma C:\no guardar\nucleo V3\planilla\api\prisma\generated\client