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

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

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

Нравится

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:

//------------------------------------------------------------------------------
// 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.

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

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