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;