Рейтинг: 20
не верифицирован
Всего отзывов: 0
  • Работ в портфолио: 1
  • Типовых услуг: 0
  • Работ на продажу: 0
  • Зарегистрирован: 21.02.2021
Был на сайте:

Проект: Информационная система для оптовой торговли продуктами питания(PostgreSQL)

Используемые навыки:

Описание

Разработана автоматизированная система учета для оптовой компании, занимающейся закупкой и продажей продуктов питания. Компания имеет несколько складов, работает с поставщиками и покупателями, оформляет приходные, расходные накладные и документы перемещения товаров между складами.

Ключевая задача: автоматизировать все бизнес-процессы на уровне базы данных — от ввода документов до генерации управленческих отчетов, исключив человеческие ошибки и дублирование данных.

Решение

. Проектирование схемы базы данных (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. Контроль лимита рассрочки

Результат

Построена полноценная система учета для оптовой торговой компании.

Все бизнес-правила (нумерация, контроль остатков, проверка ИНН, лимиты рассрочки) вынесены на уровень базы данных, что гарантирует их исполнение даже при работе через разные интерфейсы.

Отчетная часть независима от ввода данных — добавление новых типов документов не ломает существующие отчеты.

Система готова к внедрению в реальный бизнес и масштабированию на дополнительные склады и виды продукции.

Презентация проекта

09aef94a_e38b_41c0_ac6a_fdc30af30bb4.jpg
a7338c7f_c536_41f0_950a_7a1a2af399d0.jpg

Оценили проект:

0