RSS

Etiket arşivi: position could not found

İş akışlarında boş pozisyon değerlerinin atlanarak iş akışının bir sonraki pozisyona gönderilmesi

Merhaba,

İş akışlarında bugün karşılaştığım bir durumu ve buna uyguladğım çözümü paylaşmak istiyorum. Müşterimde iş akışlarında genel olarak hiyerarşi modeli kullanılmaktadır. Bu model ile iş akışında onay adımları kullanıcının durdurma kuralına göre uyuşan tüm üst seviyedeki yöneticileri için oluşmaktadır. Kullanıcının üst seviyedeki yöneticilerinden birisinin işten ayrılması sonucu ilgili pozisyon boş kalabilmekte ve iş akışlarında “pozisyon bulunamadı” ya da “kullanıcı bulunamadı” vb hatalar görülmektedir. Bu boş pozisyonun AX tarafından algılanmayıp bir sonraki pozisyondaki kullanıcıyı bulması için aşağıda adımları belirtilen değişiklikleri yaptım. Testlerim sonucu çalışıyor görünüyor.

1- AOT –> Classes –> WorkflowLimitHierarchyProvider

2- Yeni butonu ile aşağıdaki metodu ekledim.


// Changed on 10 Oca 2012 at 13:11:29 by mesut
// Eğer bir pozisyonda çalışan yoksa bir üst pozisyona bakar.
public HRPPartyPositionTableRelationship getNextPositionTable(HRPPartyPositionTableRelationship _positionTable)
{
HRPPartyPositionTableRelationship positionTable;

ValidFromDateTime _perDate = DateTimeUtil::getSystemDateTime();
;

if (_positionTable.RecId == 0)
{
throw error("@SYS119263"); // employee not found
}

select firstonly positionTable where positionTable.PositionId == _positionTable.ReportsToPosition
&& positionTable.hrmReferenceType == HRMVirtualNetworkReferenceType::Employee
&& positionTable.ValidFromDateTime <= _perDate
&& positionTable.ValidToDateTime   >= _perDate
&& positionTable.ReportsToPosition != "";

if (positionTable.RecId == 0)
{
throw error("@SYS119263"); // postion not found
}

if(positionTable.Reference)
return positionTable;
else
return this.getNextPositionTable(positionTable);
}

3 – WorkflowLimitHierarchyProvider.getNode() metodunda aşağıdaki eklemeyi yaptım.


private WorkflowLimitHierarchyProviderNode getNode(PositionId _position, WorkflowHierarchyLevel _level)
{
ExpressionDataSource nodeDataSource;
HRPLimitTableMap limitMapTable;
HRPLimitTypeTable limitTypeTable;
HRPPartyPositionTableRelationship positionTable;
HRPPartyJobTableRelationship jobTable;
userId user;
WorkflowHierarchyLevel level = _level + 1;
FromDateTime _perDate = DateTimeUtil::getSystemDateTime();
;

positionTable = HRPPartyPositionTableRelationship::find(_position);

// ETG MB start 10012012 ----------------------------> THIS SECTION WAS ADDED AS A NEW<-----------------------
if(!positionTable.Reference)
{
positionTable = this.getNextPositionTable(positionTable);
}
// ETG MB end ----------------------------> THIS SECTION WAS ADDED AS A NEW<-----------------------

if (positionTable.RecId == 0)
{
throw error("@SYS119263"); // position not found
}

if (positionTable.hrmReferenceType != HRMVirtualNetworkReferenceType::Employee)
{
throw error("@SYS120049"); // Employee Type not found
}

user = SysCompanyUserInfo::emplId2UserId(positionTable.Reference);
if (!user)
{
throw error("@SYS119264"); // user not found
}

jobTable = HRPPartyJobTableRelationship::find(positionTable.JobId);
if (jobTable.RecId == 0)
{
throw error("@SYS119262"); //job not found
}

nodeDataSource = ExpressionDataSource::newDataSourceValue(dataSource.parmName());
nodeDataSource.addField(ExpressionField::newFieldValue(#Workflow_PositionTitle, extendedtypestr(PersonTitle), positionTable.Title));
nodeDataSource.addField(ExpressionField::newFieldValue(#Workflow_JobTitle, extendedtypestr(PersonTitle), jobTable.Title));
nodeDataSource.addField(ExpressionField::newFieldValue(#Workflow_LineManagerLevel, extendedtypestr(WorkflowHierarchyLevel), level));

while select limitTypeTable
{
limitMapTable = HRPLimitTableRelationship::getActiveLimitEmpl(limitTypeTable.LimitId, positionTable.Reference);
nodeDataSource.addField(ExpressionField::newFieldValue(#Workflow_Limit + limitTypeTable.LimitId, extendedtypestr(HRPLimitValue), limitMapTable.LimitValue));
}

return WorkflowLimitHierarchyProviderNode::newProviderNode(
positionTable.Reference,
user,
level,
nodeDataSource);
}

NOT: Yazıda belirtilen kodun, değiştirilmeden veya değiştirilerek, development/test/canlı ortamlarında kullanılması sonucu oluşabilecek olumlu/olumsuz durumlarda tüm sorumluluk kodu kullanan kişiye aittir.

Mesut BOZTAŞ

Dynamics AX ERP Danışmanı ve
İstanbul Ticaret Üni. Y.Lisans öğrencisi

İstanbul 2012

http://www.etg-it.com

 

Etiketler: , , ,

 
%d blogcu bunu beğendi: