Урок 13. Самостоятельная

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

Касса

Форма кассы должна открываться с главной формы через пункт меню Финансы -> Касса.

Форма кассы

Создайте форму кассы с глобальным фильтром по дате операции. По умолчанию должны отображаться операции за текущий месяц.

В запросе для кассы для параметров {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 останется стандартной.

Текст необходимо выровнять по правому краю.

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

Пример тэга <Text> для результирующего поля

Для таблицы задайте свойство MultiSelect со значением True для атрибута Value. Это позволит пользователю выделять несколько строк.

Если пользователи могут менять видимость колонок в таблице DatabaseTable (данная возможность будет рассматриваться в уроке Пользовательские настройки), то видимость результирующих полей следует привязать к видимости соответствующих колонок через get-проперти ColumnVisible.

Выгрузка данных в Excel

Для кнопки "Экспорт в Excel..." используйте картинку из архива и команду типа ExportToExcelCommand.

921B
Open
Иконка для кнопки

Создайте xlsx-файл шаблона для экспорта в Excel кассы за выбранный период. При выгрузке данных у вас должен получаться документ вида:

Карточка кассовой операции

Создайте форму добавления и редактирования кассовой операции вида:

Для поля "Назначение платежа" (OperationComboBox) используйте SQL-запрос:

Запрос возвращает назначения платежей, которые не являются системными и не имеют дочерних назначений.

Дополнительно можете перевести форму списка назначений платежа в режим выбора. При этом для кнопки "Выбрать" на форме списка необходимо реализовать проверку, что выделенное назначение не имеет дочерних элементов и не является служебным или системным.

Так же не забудьте реализовать обновление списка назначений платежей в карточке операции, если на форме списка назначений были изменения.

Отчет по бюджету

Форма отчета по бюджету должна открываться с главной формы (TemplateStart.xml) через пункт меню Отчеты-> Отчет по бюджету.

Основной отчет

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

Для получения данных для отчета используйте SQL-запрос, приведенный ниже.

BudgetReportSelectSqlQuery

Обратите внимание, что для параметров {DateStart} и {DateFinish} используется функция convert_date_filter(), которая приводит дату фильтра к дате со временем в часовой зоне сервера.

В запросе используется функция template.operation_get_child(), которая возвращает массив идентификаторов всех вложенных дочерних элементов выбранного назначения платежа:

Под таблицей отсутствуют результирующие поля, так как в самой таблице есть строка "Прибыль", которая считает итоговое значение.

Для каждого отчета все необходимые запросы лучше группировать в отдельный SqlQueryPermission, для которого создавать отдельную Role. Это позволит в будущем гибче настраивать права доступа к отдельным отчетам.

Создайте xlsx-файл шаблона для экспорта в Excel отчета за выбранный период. При выгрузке данных у вас должен получаться документ вида:

В шаблоне должно быть три блока: "ДОХОД", "РАСХОД" и "Прибыль". Для получения нужных строк из таблицы DatabaseTable используйте get-проперти FilteredColumnValues.

Детализация отчета

Каждый отчет должен иметь форму детализации. На ней пользователь может проверить, как формируется числовое значение позиции основного отчета.

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

Форма детализации отображает список кассовых операции выбранного назначения платежей за указанный период:

Если в основном отчете будет выбрана одна из служебных записей "ДОХОД", "РАСХОД" или "Прибыль", то в детализации будут отображаться кассовые операции на назначения платежей соответствующего типа: доход, расход или одновременно доход и расход.

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

Для получения данных для отчета используйте SQL-запрос, приведенный ниже.

BudgetReportDetailSelectSqlQuery

Обратите внимание, что для параметров {DateStart} и {DateFinish} используется функция convert_date_filter(), которая приводит дату фильтра к дате со временем в часовой зоне сервера.

Из формы детализации отчета пользователь должен попадать в карточку кассовой операции или на форму заказа, если выбрана "Оплата заказа". Это позволит узнать детали операции или скорректировать ее данные. Если в заказе были сохранены изменения, то необходимо обновлять данные в детализации отчета, а так же прокидывать уведомление об изменения на форму основного отчета и на главную форму, чтобы обновлять данные на этих формах.

Создайте xlsx-файл шаблона для экспорта в Excel детализации отчета за выбранный период. При выгрузке данных у вас должен получаться документ вида:

Отлично! Теперь у нас в проекте есть финансовый блок.

Ответы

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

509KB
Open

Last updated