AR Received Payment: Difference between revisions

no edit summary
mNo edit summary
No edit summary
 
(28 intermediate revisions by the same user not shown)
Line 1:
==Technical Specification==
{{NavigateDeveloper}}
# Payment '''Knockoff Date''' must be equal or greater than the '''Payment Date'''.
==Incomplete==
# Payment net total must be greater than 0.
# Payment net total must be the sum of Payment Amount in '''Payment Detail'''
# Total of '''knockoff Amount''' must not exceed the sum of Payment Amount.
# '''Payment Method''' is created in ''General Maintenance | '''Payment Method Maintenance'''''.
 
===AssembliesReferences of AutoCount Accounting version 1.8=, 1.9==
{{BaseReferenceAC18}}
<pre>
'''BCE.AutoCount.ARAP.dll'''
</pre>
 
==AR Payment API Usage==
===New===
<syntaxhighlight lang="csharp">
public void NewARPayment(BCE.Data.DBSetting dbSetting)
{
BCE.AutoCount.ARAP.ARPayment.ARPaymentDataAccess cmd = BCE.AutoCount.ARAP.ARPayment.ARPaymentDataAccess.Create(dbSetting);
BCE.AutoCount.ARAP.ARPayment.ARPaymentEntity doc = cmd.NewARPayment();
 
//If you want to set your own Payment Voucher number, uncomment doc.DocNo, otherwise, the system will use running number.
//doc.DocNo = “RC-0001″;
doc.DebtorCode = "300-A001";
 
// Add one payment detail
BCE.AutoCount.ARAP.ARPayment.ARPaymentDTLEntity paymentDetail = doc.NewDetail();
paymentDetail.PaymentMethod = "CASH";
paymentDetail.PaymentAmt = 100;
paymentDetail.ChequeNo = "MBB 123456";
 
//Knockoff Invoice
//doc.KnockOff(BCE.AutoCount.Document.DocumentType.ARInvoice, "IV-0001", 100);
 
try
{
cmd.SaveARPayment(doc, BCE.AutoCount.Authentication.UserAuthentication.GetOrCreate(dbSetting).LoginUserID);
BCE.Application.AppMessage.ShowMessage($"Success: {doc.DocNo}");
}
catch (BCE.Application.AppException ex)
{
BCE.Application.AppMessage.ShowMessage(ex.Message);
}
}
</syntaxhighlight>
===Edit===
<syntaxhighlight lang="csharp">
public void EditARPayment(BCE.Data.DBSetting dbSetting)
{
BCE.AutoCount.ARAP.ARPayment.ARPaymentDataAccess cmd = BCE.AutoCount.ARAP.ARPayment.ARPaymentDataAccess.Create(dbSetting);
BCE.AutoCount.ARAP.ARPayment.ARPaymentEntity doc = cmd.GetARPayment("RC-0001");
 
//If doc (arPayment) is null, doc (arPayment) does not exist in AR Payment;
//Then exit this function
if (doc == null)
return;
 
doc.ClearDetails();
BCE.AutoCount.ARAP.ARPayment.ARPaymentDTLEntity paymentDetail = doc.NewDetail();
paymentDetail.PaymentMethod = "CARD";
paymentDetail.PaymentAmt = 600;
cmd.SaveARPayment(doc, BCE.AutoCount.Authentication.UserAuthentication.GetOrCreate(dbSetting).LoginUserID);
}
</syntaxhighlight>
 
===Cancel===
<syntaxhighlight lang="csharp">
private void CancelARPayment(BCE.Data.DBSetting dbSetting)
{
BCE.AutoCount.ARAP.ARPayment.ARPaymentDataAccess cmd = BCE.AutoCount.ARAP.ARPayment.ARPaymentDataAccess.Create(dbSetting);
cmd.CancelARPayment("RC-0001", BCE.AutoCount.Authentication.UserAuthentication.GetOrCreate(dbSetting).LoginUserID);
}
</syntaxhighlight>
 
===Delete===
<syntaxhighlight lang="csharp">
private void DeleteARPayment(BCE.Data.DBSetting dbSetting)
{
BCE.AutoCount.ARAP.ARPayment.ARPaymentDataAccess cmd = BCE.AutoCount.ARAP.ARPayment.ARPaymentDataAccess.Create(dbSetting);
cmd.DeleteARPayment("RC-0001", BCE.AutoCount.Authentication.UserAuthentication.GetOrCreate(dbSetting).LoginUserID);
}
</syntaxhighlight>
 
===Knockoff===
<syntaxhighlight lang="csharp">
doc.KnockOff(knockoff.DocType, knockoff.DocNo, knockoff.Amount, knockoff.Date.Value);
</syntaxhighlight>
See [[AR Received Payment#Create New ARPayment|Example of ARPayment Knockoff]]
<br /><br />
 
==Sample Code with Data for Testing==
This sample code provides the example of creating new AR Payment with tested data.
 
===Source Data (Example for reference Only)===
==Sample Code==
'''Source Data''' is implemented to hold data that is to be updated into AutoCount Accounting.
===Source Data Modal (Example Only)===
The Source Data designed here is for reference only.
'''Source''' is the '''DataModel''' of your source data that is implemented to update data to AutoCount Accounting.
You may either create your own data source, or read from your database and assign value to transaction/document of AutoCount Accounting without source data.
The Source DataModal designed here is for reference only.
You may either create your own data source modal, or read from your database and assign value to transaction/document of AutoCount Accounting without source data modal.
 
<syntaxhighlight lang="csharp">
Line 24 ⟶ 104:
public string Description { get; set; }
public string DepositMethod { get; set; }
 
//When not defined (null), system will apply the Debtor Account's default currency code
//PaymentCurrencyCode will be the currency code of Debtor's Account.
//Need to define only when PaymentCurrencyCode is different from Debtor's Account Currency
public string PaymentCurrencyCode { get; set; }
 
//Require PaymentToHomeCurrencyRate,
//when PaymentCurrencyCode is in Foreign Currency
public decimal? PaymentToHomeCurrencyRate { get; set; }
 
//Require PaymentToDebtorCurrencyRate,
//when PaymentCurrencyCode is different from Debtor CurrencyCode
public decimal? PaymentToDebtorCurrencyRate { get; set; }
 
public string Project { get; set; }
public string Department { get; set; }
 
public List<ARPaymentDetailSource> PaymentDetail = new List<ARPaymentDetailSource>();
public List<ARPaymentKnockoffPaymentKnockoffSource> PaymentKnockoff = new List<ARPaymentKnockoffPaymentKnockoffSource>();
}
 
Line 40 ⟶ 129:
public string ChequeNo { get; set; }
public decimal PaymentAmount { 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; }
}
 
public class ARPaymentKnockoffPaymentKnockoffSource
{
//Document Type of ARPayment knockoff
public const string ARInvoiceDocType = BCE.AutoCount.Document.DocumentType.ARInvoice;
public const string ARDebitNoteDocType = BCE.AutoCount.Document.DocumentType.ARDN;
 
//Must assign with valid document type
//in this class, you may find both possible document type for ARPayment Knockoff
//(1) ARInvoiceDocType, and (2) ARDebitNoteDocType
public string DocType { get; set; }
 
//The DocNo must already exist in the respective document type
public string DocNo { get; set; }
 
//The amount to be used to knockoff invoice,
//the total must not be more than sum of Payment Amount
public decimal Amount { get; set; }
 
public DateTime? DBDate { get; set; }
//When knockoff date is null,
//system will use Payment Date as knockoff date
public DateTime? Date { get; set; }
}
</syntaxhighlight>
Line 67 ⟶ 167:
public void NewARPayment(ARPaymentSource source, BCE.Data.DBSetting dbSetting)
{
//Get the login user id
string userID = BCE.AutoCount.Authentication.UserAuthentication.GetOrCreate(dbSetting).LoginUserID;
 
//Create command object of ARPayment
BCE.AutoCount.ARAP.ARPayment.ARPaymentDataAccess cmd =
BCE.AutoCount.ARAP.ARPayment.ARPaymentDataAccess.Create(dbSetting);
 
//Create a new ARPayment transaction
BCE.AutoCount.ARAP.ARPayment.ARPaymentEntity doc = cmd.NewARPayment();
 
//Assign value to master table
doc.DebtorCode = source.DebtorCode;
doc.DocNo = source.DocumentNo ?? doc.DocNo;
doc.DocNo2 = source.ReceiptNo2 ?? doc.DocNo2;
doc.DocDate = source.DocumentDate;
doc.CurrencyCode = source.PaymentCurrencyCode ?? doc.CurrencyCode;
Line 82 ⟶ 188:
doc.DeptNo = source.Department;
 
//Loop and assign value to payment detail
source.PaymentDetail.ForEach(s => AddARPaymentDetail(s, doc.NewDetail));
 
//Knockoff document
foreach (ARPaymentKnockoff knockoff in source.PaymentKnockoff)
foreach (PaymentKnockoffSource knockoff in source.PaymentKnockoff)
{
if (knockoff.Date.HasValue)
//DBDateTime is an AutoCount Accounting data type for DateTime
{
//The difference of DBDateTime and DateTime is DBDateTime supports DBNull.Value input
doc.KnockOff(knockoff.DocType, knockoff.DocNo, knockoff.Amount, knockoff.DBDateDate.Value);
}
else
{
//If Knockoff date is not defined, system will assign Payment Date to Knockoff Date
doc.KnockOff(knockoff.DocType, knockoff.DocNo, knockoff.Amount);
}
}
 
Line 102 ⟶ 216:
}
}
</syntaxhighlight>
 
====Add New AR Payment Detail====
<syntaxhighlight lang="csharp">
private void AddARPaymentDetail(ARPaymentDetailSource source, Func<BCE.AutoCount.ARAP.ARPayment.ARPaymentDTLEntity> addPaymentDetail)
{
BCE.AutoCount.ARAP.ARPayment.ARPaymentDTLEntity dtl = addPaymentDetail();
dtl.PaymentMethod = source.PaymentMethod;
dtl.ChequeNo = source.ChequeNo ?? dtl.ChequeNo;
dtl.PaymentAmt = source.PaymentAmount;
dtl.BankCharge = source.BankCharge ?? dtl.BankCharge;
dtl.BankChargeTaxType = source.BankChargeTaxCode ?? dtl.BankChargeTaxType;
dtl.BankChargeTaxRefNo = source.BankChargeBillNoForGst ?? dtl.BankChargeTaxRefNo;
dtl.PaymentBy = source.PaymentBy ?? source.PaymentBy;
 
if (source.ReturnChequeDate.HasValue)
Line 123 ⟶ 239:
</syntaxhighlight>
 
===Example of AR Payment in Home currency only===
====Test Data Result Screenshot====
[[File:ProgrammerNewARPayment1.PNG|link=]]
====Test Data====
<syntaxhighlight lang="csharp">
public void MainEntry(BCE.Data.DBSetting dbSetting)
{
ARPaymentSource source = new ARPaymentSource()
{
//Home Currency Debtor, payment with home currency
DebtorCode = "300-A001",
Description = "Payment Received",
DocumentDate = new DateTime(2017, 12, 20),
};
 
source.PaymentDetail.Add(new ARPaymentDetailSource()
==See Also==
{
* [[AR Debtor]]
PaymentMethod = "BANK",
* [[AR Invoice]]
ChequeNo = "CHQ00012",
* [[AR Received Payment]]
PaymentAmount = 100,
* [[AR Debit Note]]
BankCharge = 0.50M
* [[AR Credit Note]]
});
* [[AR Refund]]
* [[AR Deposit]]
* [[AR Deposit - Create New or Update with Refund & Forfeit]]
 
//Document type is required for document knockoff
source.PaymentKnockoff.Add(new PaymentKnockoffSource()
{
DocType = PaymentKnockoffSource.ARInvoiceDocType,
DocNo = "I-000002",
Amount = 70
});
source.PaymentKnockoff.Add(new PaymentKnockoffSource()
{
DocType = PaymentKnockoffSource.ARInvoiceDocType,
DocNo = "I-000003",
Amount = 30
});
 
//Create New ARPayment in AutoCount Accounting
NewARPayment(source, dbSetting);
}
</syntaxhighlight>
----
 
===Example of Foreign Customer and payment in customer currency===
====Test Data Result Screenshot====
[[File:ProgrammerNewARPayment2.PNG|link=]]<br/>
A payment of SGD100.00 knockoff 2 outstanding invoices, which both invoices currency rate is 3.2.
 
[[File:ProgrammerNewARPayment3.PNG|link=]]<br />
AutoCount Accounting auto generate Loss in foreign currency transaction.<br />
This is because the currency rate when invoice was issued is 3.2, whereas the payment currency rate is 3.1.
====Test Data====
<syntaxhighlight lang="csharp">
public void MainEntry(BCE.Data.DBSetting dbSetting)
{
ARPaymentSource source = new ARPaymentSource()
{
//Singapore customer, payment in Singapore Dollar
DebtorCode = "300-S001",
Description = "Payment Received - Test Data",
DocumentDate = new DateTime(2017, 12, 21),
 
//If Payment Currency is same as Debtor Currency,
//"PaymentCurrencyCode" can be excluded
PaymentCurrencyCode = "SGD",
PaymentToHomeCurrencyRate = 3.1M,
};
 
source.PaymentDetail.Add(new ARPaymentDetailSource()
{
PaymentMethod = "BANK",
ChequeNo = "SGB0009",
PaymentAmount = 100, //Currency in SGD
});
 
//Document type is required for document knockoff
source.PaymentKnockoff.Add(new PaymentKnockoffSource()
{
DocType = PaymentKnockoffSource.ARInvoiceDocType,
DocNo = "I-000017",
Amount = 70
});
source.PaymentKnockoff.Add(new PaymentKnockoffSource()
{
DocType = PaymentKnockoffSource.ARInvoiceDocType,
DocNo = "I-000018",
Amount = 30
});
 
NewARPayment(source, dbSetting);
}
</syntaxhighlight>
 
<br />
{{SeeAlsoAPIAccount}}
[[Category:Programmer]]
[[Category:API]]
[[Category:Integrate]]
[[Category:Plug-In]]
{{NavigateDeveloper}}