AR Deposit - Create New or Update with Refund & Forfeit: Difference between revisions
Content added Content deleted
mNo edit summary |
m (→Implementation) |
||
Line 319: | Line 319: | ||
DepositMethod = "DEPOSIT RECEIVED", |
DepositMethod = "DEPOSIT RECEIVED", |
||
Description = "DEPOSIT", |
Description = "DEPOSIT", |
||
//Assign an existing document number to "DocumentNo" |
//Assign an existing document number to "DocumentNo" will edit & update this deposit. |
||
DocumentNo = docNo, |
DocumentNo = docNo, |
||
DocumentDate = new DateTime(2017, 11, 25) |
DocumentDate = new DateTime(2017, 11, 25) |
Revision as of 14:15, 20 December 2017
Go to top
|
Resources For AutoCount Software Developers
|
Rules in AR Deposit Refund & Forfeit
- One AR Deposit allows only one Refund, and one Payment Voucher is created.
- 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.
Assemblies version 1.8
BCE.AutoCount.ARAP.dll
Add New or Edit Existing AR Deposit with Deposit Refund and Forfeit
public string 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 = 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)
{
//Add New ARDeposit
doc = cmd.AddNew();
}
else
{
//Edit existing ARDeposit
doc.ClearDetails();
doc.ClearRefundDetails();
}
return UpdateARDeposit(doc, source, dbSetting);
}
Update AR Deposit with Refund and Forfeit
/// <summary>
///
/// </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))
{
if (doc.DepositPaymentMethod != source.DepositMethod)
doc.DepositPaymentMethod = source.DepositMethod;
}
else
{
BCE.Application.AppMessage.ShowErrorMessage(string.Format("Invalid Deposit Payment Method of \"{0}\"", source.DepositMethod));
//log error on Deposit Payment Method error
return retDocNo;
}
if (doc.DocNo != source.DocumentNo)
doc.DocNo = source.DocumentNo ?? doc.DocNo;
if (doc.DocDate != source.DocumentDate)
doc.DocDate = source.DocumentDate;
doc.Description = source.Description ?? doc.Description;
doc.CurrencyCode = source.CurrencyCode ?? doc.CurrencyCode;
doc.DebtorCode = source.CustomerAccount;
doc.DebtorName = source.CustomerName;
doc.Attention = source.Attention;
doc.Phone1 = source.Phone;
doc.Fax1 = source.Fax;
doc.ProjNo = source.Project;
doc.DeptNo = source.Department;
//Deposit Payment Detail
source.PaymentDetail.ForEach(s => AddARDepositDetail(s, doc.AddDetail));
//Refund
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
}
catch (BCE.Application.AppException ex)
{
BCE.Application.AppMessage.ShowErrorMessage(ex.Message);
//Log Error saving
}
return retDocNo;
}
Add Deposit Payment Detail
private void AddARDepositDetail(ARDepositDetailSource source, Func<BCE.AutoCount.ARAP.ARDeposit.ARDepositDetail> addDepositDetail)
{
BCE.AutoCount.ARAP.ARDeposit.ARDepositDetail dtl = addDepositDetail();
dtl.PaymentMethod = source.PaymentMethod;
dtl.ChequeNo = source.ChequeNo;
dtl.PaymentAmt = 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.IsRCHQ = true;
dtl.RCHQDate = source.ReturnChequeDate.Value;
}
else
{
dtl.IsRCHQ = false;
}
}
Add Deposit Refund Payment Detail
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;
}
}
Check Deposit Payment Method Validity
private bool IsValidDepositMethod(string depositMethod, BCE.Data.DBSetting dbSetting)
{
return GetDepositPaymentMethod(dbSetting).AsEnumerable()
.Count(r => r.Field<string>("PaymentMethod") == depositMethod) > 0;
}
private DataTable GetDepositPaymentMethod(BCE.Data.DBSetting dbSetting)
{
BCE.AutoCount.XtraUtils.LookupEditBuilder.DepositPaymentMethodLookupEditBuilder depositBuilder =
new BCE.AutoCount.XtraUtils.LookupEditBuilder.DepositPaymentMethodLookupEditBuilder();
//The return table contains of 3 columns: (1) PaymentMethod, (2) BankAccount, (3) CurrencyCode (in version 1.8.28.184)
return depositBuilder.BuildDataTable(dbSetting);
}
Classes of Deposit source
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; }
//If this cheque is returned/bounced cheque
//Set the returned/bounced date. Otherwise it is null
public DateTime? ReturnChequeDate { get; set; }
}
Deposit Refund Source
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
{ }
Deposit Forfeit source
public class ARDepositForfeitSource
{
public string ForfeitAccNo { get; set; }
public decimal ForfeitAmount { get; set; }
public DateTime ForfeitDate { get; set; }
}
Implementation
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);
}