Разработана автоматизированная система учета для оптовой компании, занимающейся закупкой и продажей продуктов питания. Компания имеет несколько складов, работает с поставщиками и покупателями, оформляет приходные, расходные накладные и документы перемещения товаров между складами.
Ключевая задача: автоматизировать все бизнес-процессы на уровне базы данных — от ввода документов до генерации управленческих отчетов, исключив человеческие ошибки и дублирование данных.
. Проектирование схемы базы данных (ER-диаграмма)
Спроектирована реляционная схема, включающая следующие сущности:
Продукты питания (наименование, единица измерения, цена)
Склады (название, адрес)
Поставщики и покупатели (контрагенты с ИНН)
Приходные накладные (поступление товаров)
Расходные накладные (продажа товаров)
Накладные на перемещение (между складами)
Товарные позиции в каждой накладной (количество, цена, сумма)
Схема БД представлена на ER-диаграмме ниже.
(Сюда вставьте скриншот ER-диаграммы из draw.io)
2. Реализация схемы в PostgreSQL
Все таблицы созданы с использованием типов данных PostgreSQL, настроены первичные и внешние ключи, обеспечена ссылочная целостность данных.
Пример структуры таблиц:-- Таблица продуктов
CREATE TABLE products (
product_id SERIAL PRIMARY KEY,
name VARCHAR(200) NOT NULL,
unit VARCHAR(20),
price NUMERIC(12, 2)
);
-- Таблица складов
CREATE TABLE warehouses (
warehouse_id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL,
address TEXT
);
-- Приходная накладная
CREATE TABLE receipt_docs (
doc_id SERIAL PRIMARY KEY,
doc_number VARCHAR(30) UNIQUE NOT NULL,
doc_date DATE DEFAULT CURRENT_DATE,
supplier_id INT REFERENCES suppliers(supplier_id),
warehouse_id INT REFERENCES warehouses(warehouse_id)
);
-- Товары в приходной накладной
CREATE TABLE receipt_items (
item_id SERIAL PRIMARY KEY,
doc_id INT REFERENCES receipt_docs(doc_id) ON DELETE CASCADE,
product_id INT REFERENCES products(product_id),
quantity NUMERIC(12, 2) NOT NULL,
price NUMERIC(12, 2) NOT NULL
);3. Генерация первичного ключа
Для всех таблиц используется автоинкрементный SERIAL-тип, что гарантирует уникальность каждой записи без участия пользователя.
4. Триггер проверки ИНН контрагентов
Реализован триггер, который автоматически проверяет корректность введенного ИНН (длина и контрольные числа) при добавлении или изменении поставщика/покупателя. Это исключает ввод невалидных данных на этапе сохранения.
sql
CREATE OR REPLACE FUNCTION check_inn()
RETURNS TRIGGER AS $$
BEGIN
-- Проверка длины ИНН (10 для юрлиц, 12 для физлиц)
IF NOT (NEW.inn ~ '^[0-9]{10}$' OR NEW.inn ~ '^[0-9]{12}$') THEN
RAISE EXCEPTION 'ИНН должен содержать 10 или 12 цифр';
END IF;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER trg_check_inn
BEFORE INSERT OR UPDATE ON suppliers
FOR EACH ROW EXECUTE FUNCTION check_inn();
5. Автоматическая нумерация документов
Каждый документ получает уникальный внутренний регистрационный номер в формате:
ПР-2026-0001, Р-2026-0001, ПМ-2026-0001
Нумерация начинается с 1 каждый год и увеличивается на 1. В новом году счет обнуляется.
sql
CREATE OR REPLACE FUNCTION generate_doc_number(p_prefix VARCHAR)
RETURNS VARCHAR AS $$
DECLARE
next_num INT;
BEGIN
SELECT COALESCE(MAX(CAST(SUBSTRING(doc_number FROM '[0-9]+$') AS INT)), 0) + 1
INTO next_num
FROM receipt_docs
WHERE doc_number LIKE p_prefix || '-' || TO_CHAR(CURRENT_DATE, 'YYYY') || '%';
RETURN p_prefix || '-' || TO_CHAR(CURRENT_DATE, 'YYYY') || '-' || LPAD(next_num::TEXT, 4, '0');
END;
$$ LANGUAGE plpgsql;
6. Контроль остатков товаров
При оформлении перемещения или продажи товара система автоматически проверяет, есть ли нужное количество на складе. Если остаток становится отрицательным — операция блокируется.
sql
-- Пример проверки при продаже
CREATE OR REPLACE FUNCTION check_stock_before_sale()
RETURNS TRIGGER AS $$
DECLARE
current_stock NUMERIC;
BEGIN
SELECT quantity INTO current_stock
FROM stock_balance
WHERE product_id = NEW.product_id AND warehouse_id = NEW.warehouse_id;
IF current_stock < NEW.quantity THEN
RAISE EXCEPTION 'Недостаточно товара на складе. Доступно: %, запрошено: %', current_stock, NEW.quantity;
END IF;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
7. Контроль лимита рассрочки
Построена полноценная система учета для оптовой торговой компании.
Все бизнес-правила (нумерация, контроль остатков, проверка ИНН, лимиты рассрочки) вынесены на уровень базы данных, что гарантирует их исполнение даже при работе через разные интерфейсы.
Отчетная часть независима от ввода данных — добавление новых типов документов не ломает существующие отчеты.
Система готова к внедрению в реальный бизнес и масштабированию на дополнительные склады и виды продукции.