Доброго всем времени суток!
Может ли кто-то подсказать: как изменить правило построения воронки продаж по "Сумме" таким образом, чтобы в отчет выводилась сумма не по "Доходу", а по "потенциалу"?
Это расчетное поле в карточке Продажи, потенциал= доход*вероятность.
При этом в нашей базе поле "Потенциал" уже хранится в базе, а не просто выводится в карточке как вычисляемое.
Собственно говоря, было бы удобно оставить и такой принцип расчета как есть, и добавить возможность считать по "потенциалу".
Заранее спасибо
Нравится
Виктория, добрый день.
На самом деле, для реализации данного функционала необходимо внести достаточно большое количество изменений в конфигурацию. Поэтому очень подробно расписывать не буду, пройдусь только по ключевым моментам.
1) Необходимо добавить новый тип отображения в перечисление enm_PipeLineDisplayType.
2) Добавить в таблицу tbl_PipeLinesPlan два поля для плана и факта по потенциалу: EstimatedPotential и FactPotential.
3) По аналогии с уже существующими полями для расчёта по количеству и доходу, добавить колонки в запрос sq_PipeLinesPlan. При этом колонка EstimatedPotential берётся непосредственно из таблицы, а FactPotential - колонка подзапроса, аналогичная FactOpportunities и FactAmount, которая отличается только тем, что в группе select мы выбираем сумму потенциалов из таблицы tbl_Opportunity.
4) Добавляем поля EstimatedPotential и FactPotential в датасет ds_PipeLinesPlan. Обращаем внимание на свойство "Многострочный заголовок" (по аналогии с полями EstimatedAmount и FactAmount).
5) Добавляем колонки colEstimatedPotential и colFactPotentialDataGridView в реестр wnd_PipeLinesPlanDetailGridArea.
6) Добавить поле edtEstimatedPotential в окно редактирования wnd_PipeLinesPlanEdit.
7) Добавить колонки EstimatedPotential в блоки Insert и Select сервиса isq_CopyPlanStages.
8) Внести следующие изменения в скрипт wnd_PipeLinesPlanEditScript:
//------------------------------------------------------------------------------ // wnd_PipeLinesPlanEditScript //------------------------------------------------------------------------------ var OpportunitiesAndAmountShouldBeAverageThenZero = "Поля '%1', '%2' и '%3' не могут быть меньше нуля."; //------------------------------------------------------------------------------ // Events //------------------------------------------------------------------------------ function wnd_PipeLinesPlanEditOnPrepare(Window) { dlData.Dataset.DataFields('FactAmount').IsEnabled = false; dlData.Dataset.DataFields('FactOpportunities').IsEnabled = false; dlData.Dataset.DataFields('FactPotential').IsEnabled = false; EnableSelectQueryColumns(dlData.Dataset.SelectQuery, false, new Array('FactAmount', 'FactOpportunities', 'FactPotential')); wnd_BaseDBEditOnPrepare(Window); } function btnOKOnClick(Control) { if (edtEstimatedOpportunities.DataField.Value < 0 || edtEstimatedAmount.DataField.Value < 0 || edtEstimatedPotential.DataField.Value < 0) { var Message = FormatStr(OpportunitiesAndAmountShouldBeAverageThenZero, edtEstimatedOpportunities.DataField.Caption, edtEstimatedAmount.DataField.Caption, edtEstimatedPotential.DataField.Caption); ShowInformationDialog(Message); return; } scr_BaseDBEdit.btnOKOnClick(Control); }
9) Изменить в скрипте wnd_PipeLineWorkspaceScript функцию ApplyWorkspaceFilters:
function ApplyWorkspaceFilters(Dataset) { var OwnersArray = GetOpportunityOwnerIDsArray(); var ManagerID = BaseWorkspace.GroupsDataset.Values('ID'); ApplyDatasetFilter(Dataset, 'ManagerID', ManagerID, true) EnableSubselectFilter(Dataset, 'FactOpportunities', OwnersArray); EnableSubselectFilter(Dataset, 'FactAmount', OwnersArray); EnableSubselectFilter(Dataset, 'FactPotential', OwnersArray); var Parameters = Dataset.SelectQuery.Parameters; Parameters('StartDate').Value = PipeLineWorkspace.StartDate.getVarDate(); Parameters('DueDate').Value = PipeLineWorkspace.FinishDate.getVarDate(); }
10) В этом же скрипте изменить функцию enmDisplayTypeIDOnChange:
function enmDisplayTypeIDOnChange(EnumControl) { if (!enmDisplayTypeID.Value) { return; } if (PipeLineWorkspace.LastDisplayTypeID != enmDisplayTypeID.Value.ID) { switch (enmDisplayTypeID.Value.ID) { case (enmAmount): FunnelControl.FactDataFieldName = 'FactAmount'; FunnelControl.PlanDataFieldName = 'EstimatedAmount'; break; case (enmPotential): FunnelControl.FactDataFieldName = 'FactPotential'; FunnelControl.PlanDataFieldName = 'EstimatedPotential'; break; case (enmCount): FunnelControl.FactDataFieldName = 'FactOpportunities'; FunnelControl.PlanDataFieldName = 'EstimatedOpportunities'; } RefreshPipeLine(); } PipeLineWorkspace.LastDisplayTypeID = enmDisplayTypeID.Value.ID; }
Надеюсь, ничего не забыл :). В случае возникновения дополнительных вопросов - обращайтесь, постараемся помочь.
Олег Лабьяк,
разработчик,
3-я линия Службы поддержки Terrasoft.
Спасибо за инструкции. Конечно, не самое легкое решение, но прийдется делать