Домашнее задание - Организация интерфейса с пользователем: ввод

Выполняйте только если преподаватель назначил это задание. Срок сдачи сообщит преподаватель.

Резервное практическое задание предназначено для дистанционного закрепления теоретического материала занятия №23 «Организация интерфейса с пользователем: ввод» (§2.2 с.7–8 учебной программы дисциплины «ОП.08 Основы проектирования баз данных»). В рамках задания вам предстоит спроектировать экранную форму ввода для корпоративной системы, составить детальную матрицу маппинга элементов интерфейса на атрибуты реляционной БД и сформировать серверный транзакционный блок сохранения.

Постановка инженерной задачи: Проектирование формы договора аренды коммерческой недвижимости

Вам поручено спроектировать интерфейсную форму ввода для модуля заключения договоров аренды помещений в торгово-деловом центре. Документ должен фиксировать реквизиты договора, арендатора, помещение, даты аренды, сумму и перечень дополнительных услуг.

Реляционная схема целевых таблиц БД (PostgreSQL):

-- Родительская таблица договоров аренды (Master)
CREATE TABLE lease_contracts (
    contract_id BIGSERIAL PRIMARY KEY,
    contract_number VARCHAR(30) NOT NULL UNIQUE,       -- Номер договора (например: АР-2026/089)
    tenant_id INT NOT NULL REFERENCES tenants(id),     -- Арендатор (выбор из справочника)
    room_id INT NOT NULL REFERENCES office_rooms(id),  -- Помещение (выбор из справочника)
    start_date DATE NOT NULL,                          -- Дата начала аренды
    end_date DATE NOT NULL,                            -- Дата окончания аренды
    monthly_rate NUMERIC(12,2) NOT NULL,               -- Месячная ставка аренды (руб)
    security_deposit NUMERIC(12,2) NOT NULL,           -- Обеспечительный платеж (руб)
    auto_renewal BOOLEAN NOT NULL DEFAULT FALSE,       -- Автоматическая пролонгация договора
    payment_day SMALLINT NOT NULL CHECK (payment_day BETWEEN 1 AND 28), -- День ежемесячной оплаты
    comments TEXT,                                     -- Особые условия и примечания
    created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
    CONSTRAINT chk_dates CHECK (end_date > start_date)
);

-- Табличная часть дополнительных услуг к договору (Detail)
CREATE TABLE lease_contract_services (
    service_line_id BIGSERIAL PRIMARY KEY,
    contract_id BIGINT NOT NULL REFERENCES lease_contracts(contract_id) ON DELETE CASCADE,
    service_id INT NOT NULL REFERENCES service_catalog(id), -- Услуга (клининг, паркинг, охрана)
    quantity NUMERIC(6,2) NOT NULL CHECK (quantity > 0),    -- Объем/Количество
    price_per_unit NUMERIC(10,2) NOT NULL,                  -- Тариф за единицу
    total_cost NUMERIC(12,2) NOT NULL                       -- Сумма по услуге
);

Задание 1. Схема компоновки экранной формы (Эскиз интерфейса)

Опишите структуру экранной формы: логическое деление на информационные блоки (карточки), порядок расположения элементов управления, клавиатурный порядок табуляции (Tab Order) и размещение кнопок действий («Заключить договор», «Отмена»).

Задание 2. Спецификация элементов управления и матрица маппинга на атрибуты БД

Заполните спецификацию элементов экранной формы. Для каждого поля укажите:

  1. Визуальный элемент интерфейса (Masked Input, Combobox/Autocomplete, DatePicker, Checkbox, NumberInput, Textarea, Detail Grid);
  2. Имя атрибута и тип данных в реляционной таблице;
  3. Правило маппинга внешних ключей (Display Member vs. Value Member) или формат строковых данных (ISO 8601, raw value);
  4. Правила валидации (клиентская на UI и декларативная в СУБД).

Задание 3. Транзакционный DTO и серверный блок сохранения Master-Detail

1. Представьте пример структуры DTO-объекта (JSON), который экранная форма отправляет на бэкенд при клике кнопки «Заключить договор».
2. Напишите параметризованный SQL-скрипт серверной транзакции (BEGIN ... COMMIT), гарантирующий неделимость сохранения договора вместе со строками услуг и атомарный откат (ROLLBACK) при сбое.

Задание 4. Анализ отказоустойчивости и эргономики UI

Ответьте на контрольные вопросы инженера-проектировщика:

  1. Каким образом элемент интерфейса DatePicker предотвращает нарушение ограничения CHECK (end_date > start_date) на этапе ввода?
  2. Почему для выбора помещения (room_id) недостаточно обычного текстового поля ввода номера офиса? Опишите сценарий потенциального сбоя.
  3. Что должно произойти с экранной формой и кнопкой отправки сразу после клика оператора для предотвращения повторной вставки (Double Submit)?
✓ Ответы успешно сохранены в LocalStorage