Programmer:Stock Assembly v2

From AutoCount Resource Center
Revision as of 08:32, 7 June 2018 by DanielY (talk | contribs)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

Technical Specification

  1. Quantity of Item must be in base UOM
  2. The Quantity Assigned to Item in Detail (raw material) is the quantity that is consumed by Total quantity of Finished Goods.
    Eg. Finished Goods Qty = 3 Unit
    Raw Material A Qty = 12kg
    12kg of Raw Material A is consumed by 3 Unit Finished Goods
  3. In Application, Finished Goods must be maintained in Item Maintenance and Item BOM Maintenance

References of AutoCount Accounting version 2.0

AutoCount.Accounting.dll
AutoCount.Accounting.UI.dll
AutoCount.dll
AutoCount.MainEntry.dll
AutoCount.UI.dll
AutoCount.Stock.dll
AutoCount.Manufacturing.dll

Sample Code with data model

Create New Stock Assembly & get Sub Item (raw materials) cost

public void CreateNewStockAssembly(AutoCount.Authentication.UserSession userSession, StockAssemblySource source)
{
    AutoCount.Manufacturing.StockAssembly.StockAssemblyCommand cmd =
        AutoCount.Manufacturing.StockAssembly.StockAssemblyCommand.Create(userSession, userSession.DBSetting);
    AutoCount.Manufacturing.StockAssembly.StockAssembly doc = cmd.AddNew();

    doc.DocNo = source.DocNo ?? doc.DocNo;
    doc.DocDate = source.DocDate;
    doc.ItemCode = source.ItemCode;
    doc.Qty = source.Quantity;
    doc.Location = source.Location ?? doc.Location;
    if (source.Project != null)
        doc.ProjNo = source.Project;
    if (source.Department != null)
        doc.DeptNo = source.Department;
    doc.RefDocNo = source.ReferenceNo;

    //If source does not provide Assembly Cost, it will take the original Assembly Cost that is preset in the system
    doc.AssemblyCost = source.AssemblyCost == null
        ? doc.AssemblyCost : AutoCount.Converter.ToNullableDecimal(source.AssemblyCost);

    //Item's UOM is always Base UOM

    //When the Finished Goods is maintained as BOM Item,
    //there are raw materials (sub item) maintained & added accordance to the finished goods
    //So, when Finished Goods is assigned, AutoCount API will auto insert raw materials (sub items) into the detail.
    //A quick & simple solution is to clear all items in detail, before adding items from source into detail
    doc.ClearDetails();

    //There are two types of Cost update;
    //1) UpdateItemCostWithUpToDateCost : Get the latest cost from stock card
    //2) UpdateItemCostWithStandardCost : Get the cost from Item Maintenance, Standard Cost of base UOM
    source.Detail.ForEach(s => AddStockAssemblyDetail(
        s, doc.AddDetail, doc.UpdateItemCostWithStandardCost));

    try
    {
        doc.Save();
        //Log Successful
    }
    catch (AutoCount.AppException ex)
    {
        //Log error
    }
}
private void AddStockAssemblyDetail(StockAssemblyDetailSource source,
                                    Func<AutoCount.Manufacturing.StockAssembly.StockAssemblyDetail> addDetail,
                                    Action<System.Data.DataRow> calcItemCost)
{
    AutoCount.Manufacturing.StockAssembly.StockAssemblyDetail dtl = addDetail();
    dtl.ItemCode = source.ItemCode;
    dtl.Description = source.Description ?? dtl.Description;
    dtl.Location = source.Location ?? dtl.Location;
    if (source.Project != null)
        dtl.ProjNo = source.Project;
    if (source.Department != null)
        dtl.DeptNo = source.Department;
    dtl.Qty = source.Quantity;

    //When UnitCost is null, Calculate Cost using system update Cost.
    if (source.UnitCost.HasValue)
        dtl.ItemCost = source.UnitCost.Value;
    else
        calcItemCost(dtl.Row);

    dtl.OverHeadCost = source.OverheadCost;
    //Item's UOM is always Base UOM
}

Classes of source (data model)

public class StockAssemblySource
{
    public string DocNo { get; set; }
    public DateTime DocDate { get; set; }
    public string Description { get; set; }
    //Finished Goods
    public string ItemCode { get; set; }
    //Finished Goods Assembled Qty
    public decimal Quantity { get; set; }
    public string Location { get; set; }
    public string Project { get; set; }
    public string Department { get; set; }
    public string ReferenceNo { get; set; }
    public decimal? AssemblyCost { get; set; }

    public List<StockAssemblyDetailSource> Detail = new List<StockAssemblyDetailSource>();
}

public class StockAssemblyDetailSource
{
    //Raw Materials
    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 decimal? UnitCost { get; set; }
    public decimal OverheadCost { get; set; }
}

Implementation

PrgApiSTKAsembly1v2.PNG

public void MainEntry(AutoCount.Authentication.UserSession userSession)
{
    StockAssemblySource newDoc = new StockAssemblySource()
    {
        DocDate = new DateTime(2018, 5, 21),
        //Finished Goods
        ItemCode = "FG00001",
        Quantity = 3,
    };

    //Raw Materials
    newDoc.Detail.Add(new StockAssemblyDetailSource() { ItemCode = "RW00001", Description = "Metal", Quantity = 12, UnitCost = 1 });
    newDoc.Detail.Add(new StockAssemblyDetailSource() { ItemCode = "RW00002", Description = "Casing", Quantity = 1, UnitCost = 20, OverheadCost = 30 });
    newDoc.Detail.Add(new StockAssemblyDetailSource() { ItemCode = "RW00003", Description = "WireRed", Quantity = 5, UnitCost = 0.40M });
    newDoc.Detail.Add(new StockAssemblyDetailSource() { ItemCode = "RW00003", Description = "WireBlue", Quantity = 5, OverheadCost = 30 });

    //Warning: API does not check if "FG00001" is maintained in Item BOM.
    //Though Stock Card does record this entry.
    CreateNewStockAssembly(userSession, newDoc);
}

Sample Code for Stock Assembly Transferred from Stock Assembly Order

  • If the transfer quantity of Stock Assembly is greater than the remaining quantity in Stock Assembly Order, an error of "exceeded Qty Limit" will be thrown;
  • and this stock assembly will not be created or updated.
private void NewStockAssemblyTransferFromAssemblyOrder(AutoCount.Authentication.UserSession userSession)
{
    //two parameter of Assembly Order is required, 
    //(1) Assembly Order Document No.
    //(2) Qty of Assembly Order to be transferred to this Stock Assembly
    DataSet ds = LoadAODataSet("AO-000001", userSession);

    if (ds != null)
    {
        AutoCount.Manufacturing.StockAssembly.StockAssemblyCommand cmd =
            AutoCount.Manufacturing.StockAssembly.StockAssemblyCommand.Create(userSession, userSession.DBSetting);

        AutoCount.Manufacturing.StockAssembly.StockAssembly doc = cmd.AddNew();

        //Transfer 2 quantity of Finished Goods from Assembly Order
        doc.TransferFromAO(ds, 2);

        try
        {
            doc.Save();
            //Log success
            AutoCount.AppMessage.ShowMessage($"Assembly Created {doc.DocNo}");
        }
        catch (AutoCount.AppException ex)
        {
            //log fail
            AutoCount.AppMessage.ShowMessage(ex.Message);
        }
    }
    else
    {
        //log fail when DocNo of Assembly Order cannot be found,
        //or connection to database server failed.
    }
}

private DataSet LoadAODataSet(string docNoAO, AutoCount.Authentication.UserSession userSession)
{
    AutoCount.Manufacturing.StockAssemblyOrder.StockAssemblyOrderCommand cmd =
        AutoCount.Manufacturing.StockAssemblyOrder.StockAssemblyOrderCommand.Create(userSession, userSession.DBSetting);

    AutoCount.Manufacturing.StockAssemblyOrder.StockAssemblyOrder ao = cmd.View(docNoAO);

    return ao.StockAssemblyOrderDataSet;
}


See Also

Go to menu

IconAC81.png Go to top
ProgrammerGo.jpg Resources For AutoCount Software Developers