AR Deposit - Create New or Update with Refund & Forfeit: Difference between revisions

no edit summary
(Created page with "==(Not Complete)== ===Rules in AR Deposit Refund & Forfeit=== # One AR Deposit allows only one Refund # One AR Deposit allows only one Forfeit ===Assemblies version 1.8=== <...")
 
No edit summary
Line 1:
{{NavigateDeveloper}}
==(Not Complete)==
 
===Rules in AR Deposit Refund & Forfeit===
# One AR Deposit allows only one Refund
Line 12 ⟶ 11:
===Add New or Edit Existing AR Deposit with Deposit Refund and Forfeit===
<syntaxhighlight lang="csharp">
public voidstring AddUpdateDepositWithRefundForfeit(ARDepositSource source, BCE.Data.DBSetting dbSetting)
{
BCE.AutoCount.ARAP.ARDeposit.ARDepositCommand cmd = BCE.AutoCount.ARAP.ARDeposit.ARDepositCommand.Create(dbSetting);
BCE.AutoCount.ARAP.ARDeposit.ARDeposit doc = cmd.Edit(source.DocumentNo)null;
//Only possible to edit a document when document number is provided
if (source.DocumentNo != null)
{
doc = cmd.Edit(source.DocumentNo);
}
 
if (doc == null)
Line 21 ⟶ 25:
//Add New ARDeposit
doc = cmd.AddNew();
return UpdateARDeposit(doc, source, dbSetting);
}
else
Line 27 ⟶ 31:
//Edit existing ARDeposit
doc.ClearDetails();
UpdateARDeposit(doc, source, dbSetting.ClearRefundDetails();
return UpdateARDeposit(doc, source, dbSetting);
}
}
</syntaxhighlight>
 
====Update AR Deposit with Refund and Forfeit====
<syntaxhighlight lang="csharp">
/// <summary>
private void UpdateARDeposit(BCE.AutoCount.ARAP.ARDeposit.ARDeposit doc, ARDepositSource source, BCE.Data.DBSetting dbSetting)
///
/// </summary>
/// <param name="doc"></param>
/// <param name="source"></param>
/// <param name="dbSetting"></param>
/// <returns>DocNo</returns>
private string UpdateARDeposit(BCE.AutoCount.ARAP.ARDeposit.ARDeposit doc, ARDepositSource source, BCE.Data.DBSetting dbSetting)
{
string retDocNo = null;
if (IsValidDepositMethod(source.DepositMethod, dbSetting))
{
Line 44 ⟶ 58:
BCE.Application.AppMessage.ShowErrorMessage(string.Format("Invalid Deposit Payment Method of \"{0}\"", source.DepositMethod));
//log error on Deposit Payment Method error
return retDocNo;
}
 
Line 61 ⟶ 75:
doc.ProjNo = source.Project;
doc.DeptNo = source.Department;
//Deposit Payment Detail
source.PaymentDetail.ForEach(s => AddARDepositDetail(s, doc.AddDetail));
 
//Refund
source.Detail.ForEach(s => AddARDepositDetail(s, doc.AddDetail));
if (source.Refund == null)
{
doc.HasRefund = false;
}
else
{
doc.HasRefund = true;
if (doc.RefundDocNo == source.Refund.DocumentNo)
{
}
else if (source.Refund.DocumentNo == null && doc.RefundDocNo.Length == 0)
{
doc.RefundDocNo = "<<New>>";
}
else
{
doc.RefundDocNo = source.Refund.DocumentNo ?? doc.RefundDocNo;
}
 
doc.RefundName = source.Refund.Description;
doc.RefundDate = source.Refund.RefundDate;
//Deposit Refund Payment Detail
source.Refund.PaymentDetail.ForEach(s => AddARRefundDetail(s, doc.AddRefundDetail));
}
 
//Forfeit
if (source.Forfeit == null)
{
doc.HasForfeited = false;
doc.MasterRow["ForfeitedAmt"] = 0.00M;
doc.ForfeitedDate = null;
}
else
{
doc.HasForfeited = true;
doc.ForFeitedAccNo = source.Forfeit.ForfeitAccNo ?? doc.ForFeitedAccNo;
doc.MasterRow["ForfeitedAmt"] = source.Forfeit.ForfeitAmount;
doc.ForfeitedDate = source.Forfeit.ForfeitDate;
}
 
try
{
doc.Save();
BCE.Application.AppMessage.ShowMessage(string.Format("{0} is Created/Updated.", doc.DocNo));
retDocNo = doc.DocNo;
//Log Success created
}
Line 75 ⟶ 131:
//Log Error saving
}
 
return retDocNo;
}
</syntaxhighlight>
 
====Add Deposit Payment Detail====
<syntaxhighlight lang="csharp">
private void AddARDepositDetail(ARDepositDetailSource source, Func<BCE.AutoCount.ARAP.ARDeposit.ARDepositDetail> addDepositDetail)
{
Line 100 ⟶ 161:
}
</syntaxhighlight>
====Add Deposit Refund Payment Detail====
<syntaxhighlight lang="csharp">
private void AddARRefundDetail(ARDepositDetailSource source, Func<BCE.AutoCount.ARAP.ARDeposit.ARDepositRefundDetail> addRefundDetail)
{
BCE.AutoCount.ARAP.ARDeposit.ARDepositRefundDetail dtl = addRefundDetail();
dtl.PaymentMethod = source.PaymentMethod;
dtl.ChequeNo = source.ChequeNo;
dtl.PaymentAmount = source.DepositAmount;
dtl.BankCharge = source.BankCharge;
dtl.BankChargeTaxType = source.BankChargeTaxCode;
dtl.BankChargeTaxRefNo = source.BankChargeBillNoForGst;
dtl.PaymentBy = source.PaymentBy;
 
//Returned Cheque
if (source.ReturnChequeDate.HasValue)
{
dtl.IsReturnedCheque = true;
dtl.ReturnedChequeDate = source.ReturnChequeDate.Value;
}
else
{
dtl.IsReturnedCheque = false;
}
}
</syntaxhighlight>
 
====Check Deposit Payment Method Validity====
<syntaxhighlight lang="csharp">
private bool IsValidDepositMethod(string depositMethod, BCE.Data.DBSetting dbSetting)
Line 116 ⟶ 204:
}
</syntaxhighlight>
 
===Classes of Deposit source===
<syntaxhighlight lang="csharp">
public class ARDepositSource
{
public string DocumentNo { get; set; }
public DateTime DocumentDate { get; set; } = DateTime.Today.Date;
public string Description { get; set; }
public string DepositMethod { get; set; }
 
// Currency Code that is used to pay the deposit
public string CurrencyCode { get; set; }
public string CustomerAccount { get; set; }
public string CustomerName { get; set; }
public string Attention { get; set; }
public string Phone { get; set; }
public string Fax { get; set; }
public string Project { get; set; }
public string Department { get; set; }
// IsSecurityDeposit is to decide whether this deposit is subject to GST
// true: not subject to GST and is meant to be refund
// false: subject to GST and is considered as "Advance Payment"
public bool IsSecurityDeposit { get; set; }
public ARDepositRefundSource Refund { get; set; }
public ARDepositForfeitSource Forfeit { get; set; }
 
public List<ARDepositDetailSource> PaymentDetail = new List<ARDepositDetailSource>();
}
public class ARDepositDetailSource
{
public string PaymentMethod { get; set; }
public string ChequeNo { get; set; }
public decimal DepositAmount { get; set; }
public decimal BankCharge { get; set; }
public string BankChargeTaxCode { get; set; }
public string BankChargeBillNoForGst { get; set; }
public string PaymentBy { get; set; }
/// <summary>
/// If this cheque is returned/bounced cheque
/// Set the returned/bounced date. Otherwise it is null
/// </summary>
public DateTime? ReturnChequeDate { get; set; }
}
</syntaxhighlight>
 
====Deposit Refund Source====
<syntaxhighlight lang="csharp">
public class ARDepositRefundSource
{
public string DocumentNo { get; set; }
public string Description { get; set; }
public DateTime RefundDate { get; set; }
public List<ARDepositRefundDetailSource> PaymentDetail { get; set; } = new List<ARDepositRefundDetailSource>();
}
 
public class ARDepositRefundDetailSource : ARDepositDetailSource
{ }
</syntaxhighlight>
 
====Deposit Forfeit source====
<syntaxhighlight lang="csharp">
public class ARDepositForfeitSource
{
public string ForfeitAccNo { get; set; }
public decimal ForfeitAmount { get; set; }
public DateTime ForfeitDate { get; set; }
}
</syntaxhighlight>
 
===Implementation===
<syntaxhighlight lang="csharp">
public void MainEntry(BCE.Data.DBSetting dbSetting)
{
string docNo = "";
//Example of First Deposit with Refund and with New Document Number
ARDepositSource newDoc = new ARDepositSource()
{
//DEPOSIT RECEIVED must be a Payment Method created for Deposit Account
DepositMethod = "DEPOSIT RECEIVED",
Description = "DEPOSIT",
DocumentDate = new DateTime(2017, 11, 25)
};
 
newDoc.PaymentDetail.Add(new ARDepositDetailSource()
{
PaymentMethod = "BANK",
ChequeNo = "CHQ00021",
PaymentBy = "CHEQUE",
DepositAmount = 500
});
 
newDoc.Refund = new ARDepositRefundSource()
{
Description = "Refund of Deposit",
RefundDate = new DateTime(2017, 11, 26)
};
 
newDoc.Refund.PaymentDetail.Add(new ARDepositRefundDetailSource()
{
//Return to customer
PaymentMethod = "BANK",
ChequeNo = "C00101",
PaymentBy = "Bank Transfer",
DepositAmount = 200
});
 
docNo = AddUpdateDepositWithRefundForfeit(newDoc, dbSetting);
 
//Add Forfeit amount to 1st Deposit with Refund
newDoc = new ARDepositSource()
{
//DEPOSIT RECEIVED must be a Payment Method created for Deposit Account
DepositMethod = "DEPOSIT RECEIVED",
Description = "DEPOSIT",
//Assign an existing document number to "DocumentNo"
DocumentNo = docNo,
DocumentDate = new DateTime(2017, 11, 25)
};
 
newDoc.PaymentDetail.Add(new ARDepositDetailSource()
{
PaymentMethod = "BANK",
ChequeNo = "CHQ00021",
PaymentBy = "CHEQUE",
DepositAmount = 500
});
 
newDoc.Refund = new ARDepositRefundSource()
{
Description = "Refund of Deposit",
RefundDate = new DateTime(2017, 11, 26)
};
 
newDoc.Refund.PaymentDetail.Add(new ARDepositRefundDetailSource()
{
//Return to customer
PaymentMethod = "BANK",
ChequeNo = "C00101",
PaymentBy = "Bank Transfer",
DepositAmount = 250
});
//Forfeit
newDoc.Forfeit = new ARDepositForfeitSource()
{
//Forfeit AccNo can be maintained in Tools | Option
//G/L | Default Accounts
//If Default Account is maintained, ForfeitAccNo can be null
ForfeitAccNo = "550-0000",
ForfeitAmount = 100,
ForfeitDate = new DateTime(2017, 12, 2)
};
 
AddUpdateDepositWithRefundForfeit(newDoc, dbSetting);
}
</syntaxhighlight>
 
 
 
 
==See Also==
Line 125 ⟶ 371:
* [[AR Refund]]
* [[AR Deposit]]
* [[AR Deposit (NewUpdate)- Create New or Update with Refund & Forfeit]]
 
[[Category:Programmer]]