Files
mercadodevida/project/migrations/054_pos_checkout_receipts.js
2026-08-22 22:08:30 +02:00

69 lines
2.6 KiB
JavaScript

/**
* F-186 — Configurable POS receipts and free sale lines.
*
* @param {import('node-pg-migrate').MigrationBuilder} pgm
*/
const DEFAULT_STORE_ID = '00000000-0000-0000-0000-000000000001';
export const up = (pgm) => {
pgm.sql(`
CREATE TABLE IF NOT EXISTS pos_receipt_settings (
store_id uuid PRIMARY KEY REFERENCES pos_stores(id) ON DELETE CASCADE,
prefix text NOT NULL DEFAULT 'TPV',
next_number bigint NOT NULL DEFAULT 1,
padding integer NOT NULL DEFAULT 6,
return_policy text NOT NULL DEFAULT 'Se admiten devoluciones durante 15 días con el ticket de compra.',
updated_at timestamptz NOT NULL DEFAULT now(),
CONSTRAINT pos_receipt_settings_next_positive CHECK (next_number > 0),
CONSTRAINT pos_receipt_settings_padding_check CHECK (padding BETWEEN 1 AND 12),
CONSTRAINT pos_receipt_settings_prefix_check CHECK (prefix ~ '^[A-Za-z0-9_-]{1,16}$')
)
`);
pgm.sql(`
INSERT INTO pos_receipt_settings (store_id)
VALUES ('${DEFAULT_STORE_ID}')
ON CONFLICT (store_id) DO NOTHING
`);
pgm.sql('ALTER TABLE orders_orders ADD COLUMN IF NOT EXISTS receipt_number text');
pgm.sql(`
CREATE UNIQUE INDEX IF NOT EXISTS orders_orders_receipt_number_unique_idx
ON orders_orders (store_id, receipt_number)
WHERE receipt_number IS NOT NULL
`);
pgm.sql('ALTER TABLE orders_items ALTER COLUMN product_id DROP NOT NULL');
pgm.sql('ALTER TABLE orders_items ALTER COLUMN variant_id DROP NOT NULL');
pgm.sql(
'ALTER TABLE orders_items ADD COLUMN IF NOT EXISTS is_free_item boolean NOT NULL DEFAULT false',
);
pgm.sql(`
DO $$
BEGIN
IF NOT EXISTS (
SELECT 1 FROM pg_constraint WHERE conname = 'orders_items_stock_or_free_check'
) THEN
ALTER TABLE orders_items
ADD CONSTRAINT orders_items_stock_or_free_check
CHECK (
(is_free_item AND product_id IS NULL AND variant_id IS NULL)
OR
(NOT is_free_item AND product_id IS NOT NULL AND variant_id IS NOT NULL)
);
END IF;
END $$
`);
};
export const down = (pgm) => {
pgm.sql('ALTER TABLE orders_items DROP CONSTRAINT IF EXISTS orders_items_stock_or_free_check');
pgm.sql('ALTER TABLE orders_items DROP COLUMN IF EXISTS is_free_item');
pgm.sql('ALTER TABLE orders_items ALTER COLUMN variant_id SET NOT NULL');
pgm.sql('ALTER TABLE orders_items ALTER COLUMN product_id SET NOT NULL');
pgm.sql('DROP INDEX IF EXISTS orders_orders_receipt_number_unique_idx');
pgm.sql('ALTER TABLE orders_orders DROP COLUMN IF EXISTS receipt_number');
pgm.dropTable('pos_receipt_settings', { ifExists: true });
};