bmc_hub/migrations/177_supplier_invoice_reminders.sql
Christian 8e8616c835 feat: Enhance vendor and customer linking functionality
- Added endpoints to link and unlink customers to vendors, including validation for relationship types.
- Implemented a UI for managing linked customers in the vendor detail view.
- Introduced a search feature for customers when linking to vendors.
- Updated database schema to support customer-vendor relationships with necessary constraints and indices.
- Added migration scripts for new tables and fields related to supplier invoices and customer-vendor links.
- Modified bottom bar visibility in the frontend for improved user experience.
2026-04-15 09:34:26 +02:00

86 lines
2.9 KiB
PL/PgSQL

-- Migration 177: Supplier invoice reminders
-- Created: 2026-04-13
CREATE TABLE IF NOT EXISTS supplier_invoice_reminders (
id BIGSERIAL PRIMARY KEY,
supplier_invoice_id INTEGER NOT NULL REFERENCES supplier_invoices(id) ON DELETE CASCADE,
reminder_type VARCHAR(30) NOT NULL,
remind_at TIMESTAMP NOT NULL,
status VARCHAR(20) NOT NULL DEFAULT 'pending',
sent_at TIMESTAMP,
channel VARCHAR(20) NOT NULL DEFAULT 'in_app',
payload_json JSONB NOT NULL DEFAULT '{}'::jsonb,
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
);
DO $$
BEGIN
IF NOT EXISTS (
SELECT 1
FROM pg_constraint
WHERE conname = 'chk_supplier_invoice_reminders_type'
) THEN
ALTER TABLE supplier_invoice_reminders
ADD CONSTRAINT chk_supplier_invoice_reminders_type
CHECK (reminder_type IN ('due_soon', 'overdue', 'manual'));
END IF;
END $$;
DO $$
BEGIN
IF NOT EXISTS (
SELECT 1
FROM pg_constraint
WHERE conname = 'chk_supplier_invoice_reminders_status'
) THEN
ALTER TABLE supplier_invoice_reminders
ADD CONSTRAINT chk_supplier_invoice_reminders_status
CHECK (status IN ('pending', 'sent', 'cancelled', 'failed'));
END IF;
END $$;
DO $$
BEGIN
IF NOT EXISTS (
SELECT 1
FROM pg_constraint
WHERE conname = 'chk_supplier_invoice_reminders_channel'
) THEN
ALTER TABLE supplier_invoice_reminders
ADD CONSTRAINT chk_supplier_invoice_reminders_channel
CHECK (channel IN ('in_app', 'email'));
END IF;
END $$;
CREATE INDEX IF NOT EXISTS idx_supplier_invoice_reminders_supplier_invoice_id
ON supplier_invoice_reminders(supplier_invoice_id);
CREATE INDEX IF NOT EXISTS idx_supplier_invoice_reminders_remind_at
ON supplier_invoice_reminders(remind_at);
CREATE INDEX IF NOT EXISTS idx_supplier_invoice_reminders_status
ON supplier_invoice_reminders(status);
CREATE INDEX IF NOT EXISTS idx_supplier_invoice_reminders_payload_json
ON supplier_invoice_reminders USING GIN (payload_json);
CREATE OR REPLACE FUNCTION update_supplier_invoice_reminders_updated_at()
RETURNS TRIGGER AS $$
BEGIN
NEW.updated_at = CURRENT_TIMESTAMP;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
DROP TRIGGER IF EXISTS trg_supplier_invoice_reminders_updated_at ON supplier_invoice_reminders;
CREATE TRIGGER trg_supplier_invoice_reminders_updated_at
BEFORE UPDATE ON supplier_invoice_reminders
FOR EACH ROW
EXECUTE FUNCTION update_supplier_invoice_reminders_updated_at();
COMMENT ON TABLE supplier_invoice_reminders IS 'Scheduled reminders for supplier invoice follow-up';
COMMENT ON COLUMN supplier_invoice_reminders.reminder_type IS 'due_soon, overdue, or manual';
COMMENT ON COLUMN supplier_invoice_reminders.status IS 'pending, sent, cancelled, or failed';
COMMENT ON COLUMN supplier_invoice_reminders.channel IS 'Delivery channel: in_app or email';