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
 
(24 intermediate revisions by the same user not shown)
Line 1:
==Technical Specification==
==(Not Complete)==
# One AR Deposit allows only one Refund, and one Payment Voucher is created.
 
===Rules in AR Deposit Refund & Forfeit===
# One AR Deposit allows only one Refund
# One AR Deposit allows only one Forfeit
# Refund created in AR Deposit will auto create GL Cash Book Payment Voucher under GL | Cash Book Entry.
 
<br />
===Assemblies version 1.8===
==References of AutoCount Accounting version 1.8, 1.9==
<pre>
{{BaseReferenceAC18}}
BCE.AutoCount.ARAP.dll
'''BCE.AutoCount.ARAP.dll'''
</pre>
<br />
 
==Sample with data model==
===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,
//and exist in the record
if (source.DocumentNo != null)
{
doc = cmd.Edit(source.DocumentNo);
}
 
if (doc == null)
Line 21 ⟶ 26:
//Add New ARDeposit
doc = cmd.AddNew();
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 42 ⟶ 57:
else
{
//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 ⟶ 76:
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)
{
//No refund
doc.HasRefund = false;
}
else
{
doc.HasRefund = true;
if (doc.RefundDocNo != null && doc.RefundDocNo == source.Refund.DocumentNo)
{
//Do nothing when no changed in Refund Document number
//and doc.RefundDocNo is not null
}
else if (source.Refund.DocumentNo == null && doc.RefundDocNo.Length == 0)
{
//Reference to version 1.8.28.184, the RefundDocNo is empty string, instead of "<<New>>".
//To ensure that RefundDocNo is running number, set it to "<<New>>"
doc.RefundDocNo = "<<New>>";
}
else
{
//If source.Refund.DocumentNo is not null, assign source to RefundDocNo;
//Otherwise, use the existing RefundDocNo.
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)
{
//No forfeit
doc.HasForfeited = false;
doc.MasterRow["ForfeitedAmt"] = 0.00M;
doc.ForfeitedDate = null;
}
else
{
doc.HasForfeited = true;
doc.ForFeitedAccNo = source.Forfeit.ForfeitAccNo ?? doc.ForFeitedAccNo;
//Reference to version 1.8.28.184, doc.ForfeitedAmt is read only field,
//but it is a required amount when forfeited is true.
//Therefore, in this case we have to direct update the DataRow
doc.MasterRow["ForfeitedAmt"] = source.Forfeit.ForfeitAmount;
doc.ForfeitedDate = source.Forfeit.ForfeitDate;
}
 
try
{
doc.Save();
BCE.Application.AppMessage.ShowMessage(string.Format("{0}retDocNo is Created.",= doc.DocNo));
//BCE.Application.AppMessage.ShowMessage(string.Format("{0} is Created/Updated.", doc.DocNo));
//Log Success created
}
catch (BCE.Application.AppException ex)
{
//BCE.Application.AppMessage.ShowErrorMessage(ex.Message);
//Log Error saving
}
 
//Return null if document is not created or updated.
//If successfully saved, Document number is returned.
return retDocNo;
}
</syntaxhighlight>
 
====Add Deposit Payment Detail====
<syntaxhighlight lang="csharp">
private void AddARDepositDetail(ARDepositDetailSource source, Func<BCE.AutoCount.ARAP.ARDeposit.ARDepositDetail> addDepositDetail)
{
Line 100 ⟶ 175:
}
</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 112 ⟶ 214:
new BCE.AutoCount.XtraUtils.LookupEditBuilder.DepositPaymentMethodLookupEditBuilder();
 
//The return table contains of 3 columns: (1) PaymentMethod, (2) BankAccount, (3) CurrencyCode (inReference of version 1.8.28.184)
return depositBuilder.BuildDataTable(dbSetting);
}
</syntaxhighlight>
 
===Classes of Deposit source===
==See Also==
<syntaxhighlight lang="csharp">
* [[AR Debtor]]
public class ARDepositSource
* [[AR Invoice]]
{
* [[AR Received Payment]]
public string DocumentNo { get; set; }
* [[AR Debit Note]]
public DateTime DocumentDate { get; set; } = DateTime.Today.Date;
* [[AR Credit Note]]
public string Description { get; set; }
* [[AR Refund]]
public string DepositMethod { get; set; }
* [[AR Deposit]]
* [[AR Deposit (NewUpdate) with Refund & Forfeit]]
 
//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 until this deposit is convert to payment or payment of a sale
//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; }
 
//If this cheque is returned/bounced cheque
//Set the returned/bounced date. Otherwise it is null
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" highlight="44,45">
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" will edit & update this deposit.
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>
<br/>
{{SeeAlsoAPIAccount}}
[[Category:Programmer]]
[[Category:API]]
[[Category:Integrate]]
[[Category:Plug-In]]
{{NavigateDeveloper}}