Programmer:Delivery Order

From AutoCount Resource Center

Technical Specification

  1. NetTotal must not be negative amount
  2. Document NetTotal amount is read-only, as the net total must be the sum of detail total (sub-total).
  3. Changing Unit Price of Item Package directly will affect the accuracy of Sales Analysis and Profit Margin Report.
    To change the Price of an Item Package, it is required to change at the detail level.

Assemblies version 1.8, 1.9

BCE.AutoCount.dll
BCE.AutoCount.CommonAccounting.dll
BCE.AutoCount.MainEntry.dll
BCE.Utils.dll
BCE.Utils.UI.dll
BCE.AutoCount.Invoicing.dll
BCE.AutoCount.Invoicing.Sales.dll

Sample with data model

Create New Sale Delivery Order

public void NewSaleDeliveryOrder(BCE.Data.DBSetting dbSetting, SaleDeliveryOrderSource source)
{
    BCE.AutoCount.Invoicing.Sales.DeliveryOrder.DeliveryOrderCommand cmd = BCE.AutoCount.Invoicing.Sales.DeliveryOrder.DeliveryOrderCommand.Create(dbSetting);
    BCE.AutoCount.Invoicing.Sales.DeliveryOrder.DeliveryOrder doc = cmd.AddNew();

    doc.DebtorCode = source.CustomerCode;
    doc.DocNo = source.DocumentNo;
    doc.DocDate = source.DocumentDate;
    doc.Description = source.Description;
    doc.CurrencyRate = source.CurrencyRate;
    doc.Agent = source.SalesPerson;
    //Set whether to apply which rounding methodo of either Document or 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 => AddSaleDeliveryOrderDetail(s, doc.AddDetail));

    try
    {
        doc.Save();
        //log success
        BCE.Application.AppMessage.ShowMessage(string.Format("{0} is created.", doc.DocNo));
    }
    catch (BCE.Application.AppException ex)
    {
        //log ex.Message
        BCE.Application.AppMessage.ShowMessage(ex.Message);
    }
}

private void AddSaleDeliveryOrderDetail(SaleDeliveryOrderDetail sourceDtl,
    Func<BCE.AutoCount.Invoicing.Sales.DeliveryOrder.DeliveryOrderDetail> addToDoc)
{
    BCE.AutoCount.Invoicing.Sales.DeliveryOrder.DeliveryOrderDetail dtl = addToDoc();

    dtl.AccNo = sourceDtl.Account;
    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 SaleDeliveryOrderSource
{
    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 BCE.AutoCount.Document.DocumentRoundingMethod RoundMethod { get; set; } = 
        BCE.AutoCount.Document.DocumentRoundingMethod.LineByLine_Ver2;
    public bool Inclusive { get; set; } = false;
    public List<SaleDeliveryOrderDetail> Details { get; set; } = new List<SaleDeliveryOrderDetail>();
}

public class SaleDeliveryOrderDetail
{
    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(BCE.Data.DBSetting dbSetting)
{
    SaleDeliveryOrderSource newDoc = new SaleDeliveryOrderSource()
    {
        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 SaleDeliveryOrderDetail() { Description = "Particulars" });
    newDoc.Details.Add(new SaleDeliveryOrderDetail(){ ItemCode = "FG00001", Quantity = 1, UnitPrice = 50.20M, GSTCode = "SR-S" });
    newDoc.Details.Add(new SaleDeliveryOrderDetail(){ ItemCode = "FG00001", Quantity = 2, UnitPrice = 50.20M, Discount = "5%", GSTCode = "SR-S" });
    newDoc.Details.Add(new SaleDeliveryOrderDetail(){ ItemCode = "FG00001", Quantity = 1, GSTCode = "SR-S", Amount = 50.20M });

    newDoc.Details.Add(new SaleDeliveryOrderDetail() { 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 SaleDeliveryOrderDetail(){ Description = "Misc. Charges", GSTCode = "SR-S", Amount = 30 });
    newDoc.Details.Add(new SaleDeliveryOrderDetail(){ Account = "500-0000", Description = "Transport", Amount = 50, GSTCode = "SR-S" });

    NewSaleDeliveryOrder(dbSetting, newDoc);
}
Non-Stock Item can either with or without ItemCode, it depends on the setting & preference in customer Account Book.


Transfer from Sales Order with ItemCode and Item Package

public void TransferFromSalesOrderWithItemPackage(BCE.Data.DBSetting dbSetting)
{
    string docNo = "SO-00001";
    BCE.AutoCount.Invoicing.Sales.TransferFrom transferFrom = BCE.AutoCount.Invoicing.Sales.TransferFrom.SalesOrder;

    BCE.AutoCount.Invoicing.Sales.DeliveryOrder.DeliveryOrderCommand cmd =
        BCE.AutoCount.Invoicing.Sales.DeliveryOrder.DeliveryOrderCommand.Create(dbSetting);
    BCE.AutoCount.Invoicing.Sales.DeliveryOrder.DeliveryOrder doc = cmd.AddNew();
    BCE.AutoCount.Invoicing.Sales.DeliveryOrder.DeliveryOrderDetail dtl;

    //Transfer Item Package
    //PackA is Package Code
    if (!doc.PartialTransfer(transferFrom, docNo, "PackA", 1))
    {
        //Log error - failed
    }

    //Transfer Item Package with DtlKey in SODtl
    //When there are 2 or more same Package Code in Sales Order,
    //using DtlKey to ensure a specific Item (Item Package) is transferred
    //Without DtlKey, it will go by sequence of the item.
    if (!doc.PartialTransfer(transferFrom, docNo, "PackB", 1, 13485))
    {
        //Log error - failed
    }

    //Transfer ItemCode from S/O
    //FG0001 is the ItemCode
    //UNIT is the UOM
    //1 is qty to transfer
    //0 is FocQty to transfer
    if (!doc.PartialTransfer(transferFrom, docNo, "FG0001", "UNIT", 1, 0))
    {
        //Log error
    }

    //Transfer ItemCode from S/O with specific DtlKey in SODtl
    if (!doc.PartialTransfer(transferFrom, docNo, "FG0002", "UNIT", 1, 0, 13487))
    {
        //Log error
    }


    //Add new Item Package in Delivery Order
    dtl = doc.AddPackage("PackC");
    dtl.Qty = 2;

    //Do not change UnitPrice at Package level, as the UnitPrice of package must be the sum of items' unit price.
    //When the unit price of the package is taken from the Package Maintenance, it is not required to change.
    //However, if the unit price is from the source,
    //change unit Price of items in Package in Package Detail
    foreach (System.Data.DataRow row in doc.DataTablePackageDetail.Rows)
    {
        //Write a function to assign price to the ItemCode
        //Eg.
        //row["UnitPrice"] = GetPackageItemsPrice(row["ItemCode"].ToString());
    }

    //Add new ItemCode in Delivery Order
    dtl = doc.AddDetail();
    dtl.ItemCode = "FG0003";
    dtl.UOM = "UNIT";
    dtl.Qty = 2;
    dtl.UnitPrice = 50.00M;

    try
    {
        doc.Save();
        //Success
    }
    catch (BCE.Application.AppException ex)
    {
        BCE.Application.AppMessage.ShowErrorMessage(ex.Message);
        //Fail
    }
}

See Also

Go to menu

Go to top
Resources For AutoCount Software Developers