Урок 13. Самостоятельная
Last updated
Last updated
В этом уроке вы самостоятельно реализуете модуль кассы для проведения финансовых операций, добавите отчет по бюджету с детализацией и настроите выгрузку отчета в Excel документ.
Если хотите начать практику с этого урока, то вам необходимо развернуть учебный проект по инструкции в статье Разворачивание проекта.
При разворачивании проекта используйте backup базы данных, который можете найти в архиве из раздела Ответы прошлого урока. Скопируйте папки Forms, Workflow и Patterns в папку с развернутым проектом, например, в папку D:\WT\Projects\Template\Projects\1. Template.
Инструкция по подключению шаблонов находится по ссылке.
Форма кассы должна открываться с главной формы через пункт меню Финансы -> Касса.
Создайте форму кассы с глобальным фильтром по дате операции. По умолчанию должны отображаться операции за текущий месяц.
В запросе для кассы для параметров {DateStart}
и {DateFinish}
используйте функцию convert_date_filter(), которая приводит дату фильтра к дате со временем в часовой зоне сервера.
Таблица кассовых операций должна содержать колонки:
RowNumber (№) - порядковый номер строки;
CashId - идентификатор кассовой операции из таблицы template.cash;
OrderId - идентификатор заказа из таблицы template.order. Актуально только для операций "Оплата заказа";
Date (Дата операции) - дата в формате "dd.MM.yyyy HH:mm";
AccountTitle (Счет) - наименование счета;
OperationTitle (Назначение платежа) - наименование назначения платежа;
Income (Приход) - сумма кассовой операции или оплаты заказа, если тип назначение платежа "Доход";
Expense (Расход) - сумма кассовой операции, если тип назначение платежа "Расход";
ClientTitle (Клиент) - имя клиента.
Операции системного назначения "Оплата заказа" можно создавать, редактировать и удалять только из карточки заказа.
При попытке открыть для редактирование операцию "Оплата заказа" должна открываться карточка заказа, в котором эта оплата была создана. При сохранении изменений в заказе и его оплатах данные на форме кассы должны обновляться. Так же необходимо прокидывать уведомление об изменении заказов на главную форму, чтобы обновлять список заказов.
Остальные операции редактируются в карточке кассовой операции.
При попытке удалить операцию "Оплата заказа" из кассы необходимо уведомлять пользователя о невозможности действия и предлагать перейти в заказ.
Удаление кассовой операции делать через поля deleted и date_deleted - это позволит не терять данные.
Чтобы текст на кнопках не наезжал на иконку, добавьте в начало текста несколько пробелов.
Для иконки используйте тэг <Image>
, а для выравнивания - <ImageAlign>
.
Под таблицей создайте результирующие поля (TextBox), которые будут привязаны к столбцам Income (Приход) и Expense (Расход).
Для задания левой координаты объекта TextBox используйте get-проперти ColumnLeft, которое вернет левую координату столбца таблицы относительно контейнера, в котором располагается таблица.
Если таблица имеет горизонтальную полосу прокрутки, то следует использовать get-проперти ColumnOffset, которое вернет левую координату столбца таблицы относительно контейнера, в котором располагается таблица, с учетом сдвига полосы прокрутки по горизонтали.
Для задания ширины объекта TextBox используйте get-проперти ColumnWidth, которое вернет ширину определенного столбца.
Высоту объектов TextBox задайте равной 35 и переведите их в многострочный режим, указав тэг <Multiline>
со значением True. Если это не сделать, высота объекта TextBox останется стандартной.
Текст необходимо выровнять по правому краю.
Результирующие поля должны быть только для чтения и отображать две суммы. Первая сумма - сумма значений выделенных ячеек в столбце. Вторая сумма - сумма значений всех ячеек в столбце.
Для таблицы задайте свойство MultiSelect со значением True для атрибута Value
. Это позволит пользователю выделять несколько строк.
Если пользователи могут менять видимость колонок в таблице DatabaseTable (данная возможность будет рассматриваться в уроке Пользовательские настройки), то видимость результирующих полей следует привязать к видимости соответствующих колонок через get-проперти ColumnVisible.
Для кнопки "Экспорт в Excel..." используйте картинку из архива и команду типа ExportToExcelCommand.
Создайте xlsx-файл шаблона для экспорта в Excel кассы за выбранный период. При выгрузке данных у вас должен получаться документ вида:
Создайте форму добавления и редактирования кассовой операции вида:
Для поля "Назначение платежа" (OperationComboBox) используйте SQL-запрос:
Запрос возвращает назначения платежей, которые не являются системными и не имеют дочерних назначений.
Дополнительно можете перевести форму списка назначений платежа в режим выбора. При этом для кнопки "Выбрать" на форме списка необходимо реализовать проверку, что выделенное назначение не имеет дочерних элементов и не является служебным или системным.
Так же не забудьте реализовать обновление списка назначений платежей в карточке операции, если на форме списка назначений были изменения.
Форма отчета по бюджету должна открываться с главной формы (TemplateStart.xml) через пункт меню Отчеты-> Отчет по бюджету.
Отчет должен быть выполнен в виде таблицы с представлением данных в виде дерева. Реализуйте фильтр по дате кассовой операции, в котором по умолчанию должен стоять текущий месяц.
Для получения данных для отчета используйте SQL-запрос, приведенный ниже.
Под таблицей отсутствуют результирующие поля, так как в самой таблице есть строка "Прибыль", которая считает итоговое значение.
Для каждого отчета все необходимые запросы лучше группировать в отдельный SqlQueryPermission, для которого создавать отдельную Role. Это позволит в будущем гибче настраивать права доступа к отдельным отчетам.
Создайте xlsx-файл шаблона для экспорта в Excel отчета за выбранный период. При выгрузке данных у вас должен получаться документ вида:
В шаблоне должно быть три блока: "ДОХОД", "РАСХОД" и "Прибыль". Для получения нужных строк из таблицы DatabaseTable используйте get-проперти FilteredColumnValues.
Каждый отчет должен иметь форму детализации. На ней пользователь может проверить, как формируется числовое значение позиции основного отчета.
По двойному клику на любой строчке в таблице отчета должна открываться форма детализации, в которую необходимо передавать выбранный период и идентификатор выбранного назначения платежа или служебной записи.
Форма детализации отображает список кассовых операции выбранного назначения платежей за указанный период:
Если в основном отчете будет выбрана одна из служебных записей "ДОХОД", "РАСХОД" или "Прибыль", то в детализации будут отображаться кассовые операции на назначения платежей соответствующего типа: доход, расход или одновременно доход и расход.
Под таблицей должно быть результирующее поле, чтобы пользователь видел сумму всех строк детализации и мог ее сравнить с суммой из строки основного отчета.
Для получения данных для отчета используйте SQL-запрос, приведенный ниже.
Из формы детализации отчета пользователь должен попадать в карточку кассовой операции или на форму заказа, если выбрана "Оплата заказа". Это позволит узнать детали операции или скорректировать ее данные. Если в заказе были сохранены изменения, то необходимо обновлять данные в детализации отчета, а так же прокидывать уведомление об изменения на форму основного отчета и на главную форму, чтобы обновлять данные на этих формах.
Создайте xlsx-файл шаблона для экспорта в Excel детализации отчета за выбранный период. При выгрузке данных у вас должен получаться документ вида:
Отлично! Теперь у нас в проекте есть финансовый блок.
В архиве присутствуют xml-файлы форм и серверный xml-файл, а также бэкап базы данных - с помощью файлов можете проверить себя.