How to automate the Payroll Jornal Posting in AX 2009?

Hi,

I want to post our customized Payroll Adjustment journal(not in Standard Ax Journal) automatically

I found one class for this journal i.e “PYLEmplJournalCheckTrans”

Normally LedgerJournalCheckPost class is used for posting the Ledger Journal, but I dont have this type of class.

I have only one class “PYLEmplJournalCheckTrans”

How to use this class for posting the payroll journal.

class PYLEmplJournalCheckTrans
{
PYLPayrollJournalId payrollJournalId;
PYLEmplPayrollAdjustment emplPayrollAdjustment;
PYLPayrollJournalTable payrollJournalTable;
PYLPayrollJournalTrans payrollJournalTrans;
PYLEmplPayrollAdjustments emplPayrollAdjustments;
str menuItemName;
LedgerJournalId journalNum;
}
……………………………
void insertAdjustment()
{
int64 maxEntryNo;
PYLPayrollJournalTrans payrollJournalTrans1;
;
#macrolib.PYLLoadMacros;
emplPayrollAdjustments = new PYLEmplPayrollAdjustments();
ttsbegin;
select maxof( EntryNo) from emplPayrollAdjustment;
maxEntryNo = emplPayrollAdjustment.EntryNo;

while select payrollJournalTrans where payrollJournalTrans.JournalId == payrollJournalTable.JournalId
{
maxEntryNo += 1;
emplPayrollAdjustment.EntryNo = maxEntryNo;
emplPayrollAdjustment.PostingType = PYLPostingType::Payroll;
//emplPayrollAdjustment.PostingDate = today();
emplPayrollAdjustment.Amount = payrollJournalTrans.Amount;
emplPayrollAdjustment.Description = payrollJournalTrans.JournalDescription;
emplPayrollAdjustment.Dimension = payrollJournalTrans.dimension;
emplPayrollAdjustment.EmplId = payrollJournalTrans.EmplId;
emplPayrollAdjustment.PayElementCode = payrollJournalTrans.PayElementCode;
emplPayrollAdjustment.PeriodFrom = payrollJournalTrans.PeriodFrom;
emplPayrollAdjustment.PeriodId = payrollJournalTrans.PeriodId;
emplPayrollAdjustment.PeriodTo = payrollJournalTrans.PeriodTo ;
emplPayrollAdjustment.SourceCode = payrollJournalTable.JournalId;
emplPayrollAdjustment.SourceType = PYLSourceType::Journal;
emplPayrollAdjustment.RefDocNumber = payrollJournalTable.JournalId;
emplPayrollAdjustment.PostingDate = payrollJournalTrans.TransDate;
if (this.parmMenuItemName() == “PYLEmplJournalCheckTransPostToGL”)
emplPayrollAdjustment.DirectlyPostedToGL = noyes::Yes;
emplPayrollAdjustment.insert();
}

if (this.parmMenuItemName() == “PYLEmplJournalCheckTransPostToGL”)
{
if ( emplPayrollAdjustments.load(#PYRLDETAILS, “”, “”, dateNull(), dateNull(), PYLSourceType::Journal, payrollJournalTable.JournalId, “”, 0))
do
{
emplPayrollAdjustments.post( NoYes::Yes, emplPayrollAdjustment.DirectlyPostedToGL, emplPayrollAdjustment.PeriodId, emplPayrollAdjustment.PeriodFrom, emplPayrollAdjustment.PeriodTo );
} while ( emplPayrollAdjustments.moveNext() );
else
{
throw(error(strFmt(“Document number %1 payroll adjustments not found.”, payrollJournalTable.JournalId)));
}
journalNum = PYLEmplPayrollLedger::post2GL(emplPayrollAdjustment.EmplId , emplPayrollAdjustment.PeriodId, emplPayrollAdjustment.PeriodFrom, emplPayrollAdjustment.PeriodTo, PYLSourceType::Journal, emplPayrollAdjustment.RefDocNumber );
while select forupdate payrollJournalTrans1
where payrollJournalTrans1.JournalId == payrollJournalTrans.JournalId
{
ttsbegin;
payrollJournalTrans1.JournalNum = journalNum ;
payrollJournalTrans1.update();
ttscommit;
}
}
ttscommit;
}
………………………………………………………
PYLPayrollJournalId parmJournalId(PYLPayrollJournalId _payrollJournalId = payrollJournalId)
{ ;
payrollJournalId = _payrollJournalId;
return payrollJournalId;
}
…………………………………………………
str parmMenuItemName(str _menuItemName = menuItemName)
{ ;
menuItemName = _menuItemName;
return menuItemName;
}
…………………………………………………………………
PYLPayrollJournalTrans parmPayrollJournalTrans(PYLPayrollJournalTrans _payrollJournalTrans = payrollJournalTrans)
{ ;
payrollJournalTrans = _payrollJournalTrans;
return payrollJournalTrans;
}
…………………………………………………………………………
void run()
{
ttsbegin;
try
{
payrollJournalTable = PYLPayrollJournalTable::find(this.parmJournalId());
this.insertAdjustment();
this.updateJournalHeader();
this.updateEmplAllowanceUtilization(); // by AKT for employee entitlements update
info("@PYL1153");
}
catch
{
ttsabort;
throw error("@PYL1154");
}

ttscommit;
}
………………………………………………………………………………
void updateEmplAllowanceUtilization()
{
PYLCalendarLineTable calendarLineTable;
PYLPayElementTable pylPayElementTable;
PYLEmplPayElementsTable pylEmplPayElementsTable;
PYLEmplAllowanceUtilization emplAllowanceUtilization;
Amount amountRemaining;
;
if( payrollJournalTrans.TransDate == dateNull())
throw error(’@CIT173’ );

if(PYLPayElementTable::find(payrollJournalTrans.PayElementCode).Allowance)
{
select firstonly pylEmplPayElementsTable order by EffectiveDate Desc
where pylEmplPayElementsTable.EmplId == payrollJournalTrans.EmplId
&& pylEmplPayElementsTable.PayElementCode == payrollJournalTrans.PayElementCode
&& pylEmplPayElementsTable.EffectiveDate <= payrollJournalTrans.TransDate
&& pylEmplPayElementsTable.Active;
if(pylEmplPayElementsTable.RecId)
{
select sum(UtilizedAmount) from emplAllowanceUtilization group by EmplId,PayElementCode,PeriodFrom
where emplAllowanceUtilization.EmplId == payrollJournalTrans.EmplId
&& emplAllowanceUtilization.PayElementCode == payrollJournalTrans.PayElementCode
&& emplAllowanceUtilization.PeriodFrom >= pylEmplPayElementsTable.EffectiveDate;
amountRemaining =pylEmplPayElementsTable.Amount - emplAllowanceUtilization.UtilizedAmount;
if(payrollJournalTrans.Amount > amountRemaining)
throw error(strfmt("Cannot post for %1 as amount remaining for utilization is %2 only”. ",payrollJournalTrans.Amount,amountRemaining));
//Insert data into PYLEmplAllowanceUtilization
select firstonly calendarLineTable order by Calcode
Where calendarLineTable.CalCode == pylEmplPayElementsTable.PayrollPeriod
&& calendarLineTable.PeriodFrom <= payrollJournalTrans.TransDate
&& calendarLineTable.PeriodTo >= payrollJournalTrans.TransDate;
emplAllowanceUtilization.clear();
emplAllowanceUtilization.initValue();
emplAllowanceUtilization.EmplId = payrollJournalTrans.EmplId ;
emplAllowanceUtilization.PayElementCode = payrollJournalTrans.PayElementCode;
emplAllowanceUtilization.PeriodFrom = payrollJournalTrans.PeriodFrom; // Changed by AJO on 05-07-2011
emplAllowanceUtilization.PeriodTo = payrollJournalTrans.PeriodTo;
emplAllowanceutilization.PeriodId = payrollJournalTrans.PeriodId;
emplAllowanceutilization.EntitlementAmount = pylEmplPayElementsTable.Amount;
emplAllowanceutilization.UtilizedAmount = payrollJournalTrans.Amount;
if(emplAllowanceUtilization.validateWrite())
emplAllowanceUtilization.insert();
} }}
……………………………………………………………….
void updateJournalHeader()
{
PYLPayrollJournalTable _payrollJournalTable;
;
ttsbegin;
select forupdate firstonly _payrollJournalTable where _payrollJournalTable.JournalId == this.parmJournalId();
if(_payrollJournalTable) {
_payrollJournalTable.Posted = NoYes::Yes;
_payrollJournalTable.update(); }
ttscommit;
}
……………………………………………………………………………
Static void main(Args _args)
{
PYLEmplJournalCheckTrans emplJournalCheckTrans;
PYLPayrollJournalTrans payrollJournalTrans;
str menuItemName;
;
EmplJournalCheckTrans = new PYLEmplJournalCheckTrans();
PayrollJournalTrans = _args.record();

Please suggest me