Programmer:Sales Invoice v2: Difference between revisions
Content added Content deleted
No edit summary |
No edit summary |
||
(2 intermediate revisions by the same user not shown) | |||
Line 1: | Line 1: | ||
==Technical Specification== |
|||
===Rules in Sale Invoice=== |
|||
# NetTotal must not be negative amount |
# NetTotal must not be negative amount |
||
# Negative Quantity is allowed, if it does not violate the NetTotal rule. |
# Negative Quantity is allowed, if it does not violate the NetTotal rule. |
||
==Assemblies version 2.0== |
|||
{{BaseReferenceAC20}} |
{{BaseReferenceAC20}} |
||
'''AutoCount.Invoicing.dll''' |
'''AutoCount.Invoicing.dll''' |
||
'''AutoCount.Invoicing.Sales.dll''' |
'''AutoCount.Invoicing.Sales.dll''' |
||
==Sample with data model== |
|||
===Create New Sale Invoice=== |
===Create New Sale Invoice=== |
||
<syntaxhighlight lang="csharp"> |
<syntaxhighlight lang="csharp"> |
||
public void NewSaleInvoice(AutoCount.Authentication.UserSession userSession, SaleInvoiceSource source) |
public void NewSaleInvoice(AutoCount.Authentication.UserSession userSession, SaleInvoiceSource source) |
||
{ |
{ |
||
string newDocStr = "<<New>>"; |
|||
AutoCount.Invoicing.Sales.Invoice.InvoiceCommand cmd = |
AutoCount.Invoicing.Sales.Invoice.InvoiceCommand cmd = |
||
AutoCount.Invoicing.Sales.Invoice.InvoiceCommand.Create(userSession, userSession.DBSetting); |
AutoCount.Invoicing.Sales.Invoice.InvoiceCommand.Create(userSession, userSession.DBSetting); |
||
Line 17: | Line 19: | ||
doc.DebtorCode = source.CustomerCode; |
doc.DebtorCode = source.CustomerCode; |
||
//if source.DocumentNo is null, then set DocNo as newDocStr |
|||
doc.DocNo = source.DocumentNo ?? newDocStr; |
|||
doc.DocDate = source.DocumentDate; |
doc.DocDate = source.DocumentDate; |
||
doc.Description = source.Description; |
doc.Description = source.Description; |
||
Line 107: | Line 110: | ||
===Implementation=== |
===Implementation=== |
||
[[File: |
[[File:ProgrammerNewIVv2.png|link=]] |
||
<syntaxhighlight lang="csharp"> |
<syntaxhighlight lang="csharp"> |
||
public void MainEntry(AutoCount.Authentication.UserSession userSession) |
public void MainEntry(AutoCount.Authentication.UserSession userSession) |
Latest revision as of 02:47, 3 August 2020
Technical Specification
- NetTotal must not be negative amount
- Negative Quantity is allowed, if it does not violate the NetTotal rule.
Assemblies version 2.0
AutoCount.Accounting.dll AutoCount.Accounting.UI.dll AutoCount.dll AutoCount.MainEntry.dll AutoCount.UI.dll AutoCount.Invoicing.dll AutoCount.Invoicing.Sales.dll
Sample with data model
Create New Sale Invoice
public void NewSaleInvoice(AutoCount.Authentication.UserSession userSession, SaleInvoiceSource source)
{
string newDocStr = "<<New>>";
AutoCount.Invoicing.Sales.Invoice.InvoiceCommand cmd =
AutoCount.Invoicing.Sales.Invoice.InvoiceCommand.Create(userSession, userSession.DBSetting);
AutoCount.Invoicing.Sales.Invoice.Invoice doc = cmd.AddNew();
doc.DebtorCode = source.CustomerCode;
//if source.DocumentNo is null, then set DocNo as newDocStr
doc.DocNo = source.DocumentNo ?? newDocStr;
doc.DocDate = source.DocumentDate;
doc.Description = source.Description;
doc.CurrencyRate = source.CurrencyRate;
doc.Agent = source.SalesPerson;
//Set to apply rounding method of either by Document or by Each Line,
//this may affect different result in GST Calculation due to decimal point.
doc.RoundingMethod = source.RoundMethod;
//Document Level Inclusive Tax
doc.InclusiveTax = source.Inclusive;
source.Details.ForEach(s => AddSaleInvoiceDetail(s, doc.AddDetail));
try
{
doc.Save();
//log success
//AutoCount.AppMessage.ShowMessage(string.Format("{0} is created.", doc.DocNo));
}
catch (AutoCount.AppException ex)
{
//log ex.Message
//AutoCount.AppMessage.ShowMessage(ex.Message);
}
}
private void AddSaleInvoiceDetail(SaleInvoiceDetail sourceDtl,
Func<AutoCount.Invoicing.Sales.Invoice.InvoiceDetail> addToDoc)
{
AutoCount.Invoicing.Sales.Invoice.InvoiceDetail dtl = addToDoc();
dtl.AccNo = sourceDtl.Account;
//When ItemCode is assigned, AccNo will be refreshed based on ItemGroup's SaleAccNo;
//If ItemGroup is not maintained, then default Sale AccNo will be assigned.
dtl.ItemCode = sourceDtl.ItemCode;
dtl.Description = sourceDtl.Description ?? dtl.Description;
if (sourceDtl.Project != null)
dtl.ProjNo = sourceDtl.Project;
if (sourceDtl.Department != null)
dtl.DeptNo = sourceDtl.Department;
if (sourceDtl.Location != null)
dtl.Location = sourceDtl.Location;
dtl.Qty = sourceDtl.Quantity ?? dtl.Qty;
dtl.UOM = sourceDtl.Uom ?? dtl.UOM;
dtl.UnitPrice = sourceDtl.UnitPrice ?? dtl.UnitPrice;
dtl.Discount = sourceDtl.Discount ?? dtl.Discount;
dtl.SubTotal = sourceDtl.Amount ?? dtl.SubTotal;
if (sourceDtl.GSTCode != null)
dtl.TaxType = sourceDtl.GSTCode;
dtl.TaxAdjustment = sourceDtl.GSTAdjustment;
}
Classes of source
public class SaleInvoiceSource
{
public string CustomerCode { get; set; }
public string DocumentNo { get; set; }
public DateTime DocumentDate { get; set; }
public string Description { get; set; }
public decimal CurrencyRate { get; set; } = 1;
public string SalesPerson { get; set; }
public AutoCount.Document.DocumentRoundingMethod RoundMethod { get; set; } =
AutoCount.Document.DocumentRoundingMethod.LineByLine_Ver2;
public bool Inclusive { get; set; } = false;
public List<SaleInvoiceDetail> Details { get; set; } = new List<SaleInvoiceDetail>();
}
public class SaleInvoiceDetail
{
public string Account { get; set; }
public string ItemCode { get; set; }
public string Description { get; set; }
public string Location { get; set; }
public string Project { get; set; }
public string Department { get; set; }
public decimal? Quantity { get; set; }
public string Uom { get; set; }
public decimal? UnitPrice { get; set; }
public string Discount { get; set; }
public decimal? Amount { get; set; }
public string GSTCode { get; set; }
public decimal GSTAdjustment { get; set; }
}
Implementation
public void MainEntry(AutoCount.Authentication.UserSession userSession)
{
SaleInvoiceSource newDoc = new SaleInvoiceSource()
{
CustomerCode = "300-A001",
Description = "SALES INVOICE GENERATED",
//If let AutoCount auto assign running number, assign "<<New>>" is unnecessary
//DocumentNo = "<<New>>",
DocumentDate = new DateTime(2017, 11, 30),
Inclusive = true
};
//There are many ways which data input can be entered into details, here are some of the common input.
newDoc.Details.Add(new SaleInvoiceDetail() { Description = "Particulars" });
newDoc.Details.Add(new SaleInvoiceDetail() { ItemCode = "FG00001", Quantity = 1, UnitPrice = 50.20M, GSTCode = "SR-S" });
newDoc.Details.Add(new SaleInvoiceDetail() { ItemCode = "FG00001", Quantity = 2, UnitPrice = 50.20M, Discount = "5%", GSTCode = "SR-S" });
newDoc.Details.Add(new SaleInvoiceDetail() { ItemCode = "FG00001", Quantity = 1, GSTCode = "SR-S", Amount = 50.20M });
//Return stock is allowed, if the NetTotal is larger or equal to Zero after deduction.
newDoc.Details.Add(new SaleInvoiceDetail() { ItemCode = "FG00002", Quantity = -1, GSTCode = "SR-S", Amount = -60.20M });
newDoc.Details.Add(new SaleInvoiceDetail() { ItemCode = "FG00002", Quantity = -1, UnitPrice = 60.20M, Discount = "5%", GSTCode = "SR-S" });
newDoc.Details.Add(new SaleInvoiceDetail() { Description = "Non-Stock Items" });
//When AccNo & ItemCode both are not defined, system will retrieve from default Sale Account.
//If default Sale Account is not maintained in Tools | Options, system will throw error on saving.
newDoc.Details.Add(new SaleInvoiceDetail() { Description = "Misc. Charges", GSTCode = "SR-S", Amount = 30 });
newDoc.Details.Add(new SaleInvoiceDetail() { Account = "500-0000", Description = "Transport", Amount = 50, GSTCode = "SR-S" });
NewSaleInvoice(userSession, newDoc);
}
Non-Stock Item can either with or without ItemCode, it depends on the setting & preference of customer Account Book. |
See Also
- Programmer:Quotation v2
- Programmer:Sales Order v2
- Programmer:Delivery Order v2
- Programmer:Sales Invoice v2
- Programmer:Cash Sale with Payment v2
Go to top
|
Resources For AutoCount Software Developers
|