воронка продаж
построение по другому полю
3.x

Воронка продаж

Доброго всем времени суток!

Может ли кто-то подсказать: как изменить правило построения воронки продаж по "Сумме" таким образом, чтобы в отчет выводилась сумма не по "Доходу", а по "потенциалу"?
Это расчетное поле в карточке Продажи, потенциал= доход*вероятность.
При этом в нашей базе поле "Потенциал" уже хранится в базе, а не просто выводится в карточке как вычисляемое.
Собственно говоря, было бы удобно оставить и такой принцип расчета как есть, и добавить возможность считать по "потенциалу".

Заранее спасибо

Нравится

2 комментария

Виктория, добрый день.

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

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:

[javascript]
//------------------------------------------------------------------------------
// 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);
}
[/javascript]

9) Изменить в скрипте wnd_PipeLineWorkspaceScript функцию ApplyWorkspaceFilters:

[javascript]
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();
}
[/javascript]

10) В этом же скрипте изменить функцию enmDisplayTypeIDOnChange:

[javascript]
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;
}
[/javascript]

Надеюсь, ничего не забыл :). В случае возникновения дополнительных вопросов - обращайтесь, постараемся помочь.

Олег Лабьяк,
разработчик,
3-я линия Службы поддержки Terrasoft.

Спасибо за инструкции. Конечно, не самое легкое решение, но прийдется делать

Показать все комментарии