You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
90 lines
5.9 KiB
90 lines
5.9 KiB
CREATE TABLE "plan_suscripcion" (
|
|
"id" text PRIMARY KEY NOT NULL,
|
|
"codigo" text NOT NULL,
|
|
"nombre" text NOT NULL,
|
|
"descripcion" text,
|
|
"nivel" integer NOT NULL,
|
|
"precio_centimos" integer NOT NULL,
|
|
"moneda" text DEFAULT 'eur' NOT NULL,
|
|
"periodicidad" text NOT NULL,
|
|
"intervalos" integer DEFAULT 1 NOT NULL,
|
|
"referencia_precio_externa" text,
|
|
"prestaciones" jsonb DEFAULT '[]'::jsonb NOT NULL,
|
|
"estado" text DEFAULT 'borrador' NOT NULL,
|
|
"creado_en" timestamp with time zone DEFAULT now() NOT NULL,
|
|
"actualizado_en" timestamp with time zone DEFAULT now() NOT NULL,
|
|
CONSTRAINT "plan_suscripcion_codigo_unique" UNIQUE("codigo"),
|
|
CONSTRAINT "plan_suscripcion_referencia_precio_externa_unique" UNIQUE("referencia_precio_externa"),
|
|
CONSTRAINT "plan_suscripcion_periodicidad_conocida" CHECK ("plan_suscripcion"."periodicidad" in ('dia', 'semana', 'mes', 'ano')),
|
|
CONSTRAINT "plan_suscripcion_estado_conocido" CHECK ("plan_suscripcion"."estado" in ('borrador', 'disponible', 'retirado')),
|
|
CONSTRAINT "plan_suscripcion_nivel_positivo" CHECK ("plan_suscripcion"."nivel" > 0),
|
|
CONSTRAINT "plan_suscripcion_precio_no_negativo" CHECK ("plan_suscripcion"."precio_centimos" >= 0),
|
|
CONSTRAINT "plan_suscripcion_intervalos_positivos" CHECK ("plan_suscripcion"."intervalos" > 0),
|
|
CONSTRAINT "plan_suscripcion_moneda_iso" CHECK ("plan_suscripcion"."moneda" ~ '^[a-z]{3}$'),
|
|
CONSTRAINT "plan_suscripcion_codigo_no_vacio" CHECK (btrim("plan_suscripcion"."codigo") <> ''),
|
|
CONSTRAINT "plan_suscripcion_nombre_no_vacio" CHECK (btrim("plan_suscripcion"."nombre") <> ''),
|
|
CONSTRAINT "plan_suscripcion_prestaciones_array" CHECK (jsonb_typeof("plan_suscripcion"."prestaciones") = 'array')
|
|
);
|
|
--> statement-breakpoint
|
|
CREATE TABLE "carrito_producto" (
|
|
"carrito_id" text NOT NULL,
|
|
"producto_id" text NOT NULL,
|
|
"cantidad" integer DEFAULT 1 NOT NULL,
|
|
"anadido_en" timestamp with time zone DEFAULT now() NOT NULL,
|
|
CONSTRAINT "carrito_producto_carrito_id_producto_id_pk" PRIMARY KEY("carrito_id","producto_id"),
|
|
CONSTRAINT "carrito_producto_cantidad_positiva" CHECK ("carrito_producto"."cantidad" > 0)
|
|
);
|
|
--> statement-breakpoint
|
|
CREATE TABLE "pedido_linea" (
|
|
"pedido_id" text NOT NULL,
|
|
"codigo" text NOT NULL,
|
|
"producto_id" text,
|
|
"tipo" text NOT NULL,
|
|
"nombre" text NOT NULL,
|
|
"descripcion" text,
|
|
"cantidad" integer NOT NULL,
|
|
"precio_unitario_centimos" integer NOT NULL,
|
|
"total_centimos" integer NOT NULL,
|
|
"moneda" text NOT NULL,
|
|
"modalidad" text NOT NULL,
|
|
"datos" jsonb DEFAULT '{}'::jsonb NOT NULL,
|
|
CONSTRAINT "pedido_linea_pedido_id_codigo_pk" PRIMARY KEY("pedido_id","codigo"),
|
|
CONSTRAINT "pedido_linea_cantidad_positiva" CHECK ("pedido_linea"."cantidad" > 0),
|
|
CONSTRAINT "pedido_linea_tipo_conocido" CHECK ("pedido_linea"."tipo" in ('pack_canciones', 'libro', 'partitura', 'midi', 'stems', 'servicio', 'suscripcion')),
|
|
CONSTRAINT "pedido_linea_modalidad_conocida" CHECK ("pedido_linea"."modalidad" in ('pago_unico', 'suscripcion')),
|
|
CONSTRAINT "pedido_linea_importes_validos" CHECK ("pedido_linea"."precio_unitario_centimos" >= 0 and "pedido_linea"."total_centimos" = "pedido_linea"."precio_unitario_centimos" * "pedido_linea"."cantidad"),
|
|
CONSTRAINT "pedido_linea_moneda_iso" CHECK ("pedido_linea"."moneda" ~ '^[a-z]{3}$'),
|
|
CONSTRAINT "pedido_linea_datos_objeto" CHECK (jsonb_typeof("pedido_linea"."datos") = 'object')
|
|
);
|
|
--> statement-breakpoint
|
|
CREATE TABLE "producto" (
|
|
"id" text PRIMARY KEY NOT NULL,
|
|
"codigo" text NOT NULL,
|
|
"tipo" text NOT NULL,
|
|
"nombre" text NOT NULL,
|
|
"descripcion" text,
|
|
"estado" text DEFAULT 'borrador' NOT NULL,
|
|
"precio_centimos" integer NOT NULL,
|
|
"moneda" text DEFAULT 'eur' NOT NULL,
|
|
"metadatos" jsonb DEFAULT '{}'::jsonb NOT NULL,
|
|
"creado_en" timestamp with time zone DEFAULT now() NOT NULL,
|
|
"actualizado_en" timestamp with time zone DEFAULT now() NOT NULL,
|
|
CONSTRAINT "producto_codigo_unique" UNIQUE("codigo"),
|
|
CONSTRAINT "producto_tipo_conocido" CHECK ("producto"."tipo" in ('libro', 'partitura', 'midi', 'stems', 'servicio')),
|
|
CONSTRAINT "producto_estado_conocido" CHECK ("producto"."estado" in ('borrador', 'disponible', 'retirado')),
|
|
CONSTRAINT "producto_precio_no_negativo" CHECK ("producto"."precio_centimos" >= 0),
|
|
CONSTRAINT "producto_moneda_iso" CHECK ("producto"."moneda" ~ '^[a-z]{3}$'),
|
|
CONSTRAINT "producto_codigo_no_vacio" CHECK (btrim("producto"."codigo") <> ''),
|
|
CONSTRAINT "producto_nombre_no_vacio" CHECK (btrim("producto"."nombre") <> ''),
|
|
CONSTRAINT "producto_metadatos_objeto" CHECK (jsonb_typeof("producto"."metadatos") = 'object')
|
|
);
|
|
--> statement-breakpoint
|
|
ALTER TABLE "suscripcion" ADD COLUMN "plan_id" text;--> statement-breakpoint
|
|
ALTER TABLE "carrito_producto" ADD CONSTRAINT "carrito_producto_carrito_id_carrito_id_fk" FOREIGN KEY ("carrito_id") REFERENCES "public"."carrito"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
|
|
ALTER TABLE "carrito_producto" ADD CONSTRAINT "carrito_producto_producto_id_producto_id_fk" FOREIGN KEY ("producto_id") REFERENCES "public"."producto"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
|
|
ALTER TABLE "pedido_linea" ADD CONSTRAINT "pedido_linea_pedido_id_pedido_id_fk" FOREIGN KEY ("pedido_id") REFERENCES "public"."pedido"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
|
|
ALTER TABLE "pedido_linea" ADD CONSTRAINT "pedido_linea_producto_id_producto_id_fk" FOREIGN KEY ("producto_id") REFERENCES "public"."producto"("id") ON DELETE set null ON UPDATE no action;--> statement-breakpoint
|
|
CREATE INDEX "plan_suscripcion_estado_nivel" ON "plan_suscripcion" USING btree ("estado","nivel");--> statement-breakpoint
|
|
CREATE INDEX "pedido_linea_tipo" ON "pedido_linea" USING btree ("tipo");--> statement-breakpoint
|
|
CREATE INDEX "producto_tipo_estado" ON "producto" USING btree ("tipo","estado");--> statement-breakpoint
|
|
ALTER TABLE "suscripcion" ADD CONSTRAINT "suscripcion_plan_id_plan_suscripcion_id_fk" FOREIGN KEY ("plan_id") REFERENCES "public"."plan_suscripcion"("id") ON DELETE restrict ON UPDATE no action; |