/// <summary>
        /// Register purchase order.<br />
        /// - Check system suspending.<br />
        /// - Check permission.<br />
        /// - Insert new purchase order.<br />
        /// - Generate report.
        /// </summary>
        /// <returns></returns>
        public ActionResult IVS250_cmdConfirm()
        {
            ObjectResultData res = new ObjectResultData();

            try
            {
                IVS250_ScreenParameter prm = GetScreenObject <IVS250_ScreenParameter>();
                if (prm.lstInstrument == null)
                {
                    prm.lstInstrument = new List <doInstrument250>();
                }
                if (prm.SpecifyPOrder250 == null)
                {
                    prm.SpecifyPOrder250 = new doSpecifyPOrder250();
                }
                //Check Suspend
                ICommonHandler ComH = ServiceContainer.GetService <ICommonHandler>() as ICommonHandler;
                if (ComH.IsSystemSuspending())
                {
                    res.AddErrorMessage(MessageUtil.MODULE_COMMON, MessageUtil.MessageList.MSG0049);
                    return(Json(res));
                }
                if (!CheckUserPermission(ScreenID.C_INV_SCREEN_ID_REGISTER_PURCHASE_ORDER, FunctionID.C_FUNC_ID_OPERATE))
                {
                    res.AddErrorMessage(MessageUtil.MODULE_COMMON, MessageUtil.MessageList.MSG0053);
                    return(Json(res));
                }

                foreach (var i in prm.lstInstrument)
                {
                    IInstrumentMasterHandler InsH    = ServiceContainer.GetService <IInstrumentMasterHandler>() as IInstrumentMasterHandler;
                    List <tbm_Instrument>    lstInst = InsH.GetTbm_Instrument(i.InstrumentCode);

                    if (lstInst[0].LineUpTypeCode == LineUpType.C_LINE_UP_TYPE_LOGICAL_DELETE)
                    {
                        res.AddErrorMessage(MessageUtil.MODULE_INVENTORY, MessageUtil.MessageList.MSG4140, new string[] { lstInst[0].InstrumentCode });
                        return(Json(res));
                    }
                }

                using (TransactionScope scope = new TransactionScope())
                {
                    try
                    {
                        IInventoryHandler InvH = ServiceContainer.GetService <IInventoryHandler>() as IInventoryHandler;
                        string            strPurchaseOrderNo = InvH.GeneratePurchaseOrderNo(prm.Supplier.RegionCode);

                        tbt_PurchaseOrder doPurchaseOrder = new tbt_PurchaseOrder();
                        doPurchaseOrder.PurchaseOrderNo     = strPurchaseOrderNo;
                        doPurchaseOrder.PurhcaseOrderType   = prm.SpecifyPOrder250.PurchaseOrderType;
                        doPurchaseOrder.PurchaseOrderStatus = PurchaseOrderStatus.C_PURCHASE_ORDER_STATUS_WAIT_TO_RECEIVE;
                        doPurchaseOrder.SupplierCode        = prm.SpecifyPOrder250.SupplierCode;
                        doPurchaseOrder.TransportType       = prm.SpecifyPOrder250.TransportType;
                        doPurchaseOrder.Currency            = prm.SpecifyPOrder250.Currency;
                        doPurchaseOrder.BankName            = prm.Supplier.BankName;
                        doPurchaseOrder.AccountNo           = prm.Supplier.AccountNo;
                        doPurchaseOrder.AccountName         = prm.Supplier.AccountName;
                        doPurchaseOrder.ShippingDate        = prm.SpecifyPOrder250.AdjustDueDate;
                        doPurchaseOrder.Amount = prm.SpecifyPOrder250.TotalAmount;
                        if (prm.SpecifyPOrder250.PurchaseOrderType == PurchaseOrderType.C_PURCHASE_ORDER_TYPE_DOMESTIC ||
                            (prm.SpecifyPOrder250.PurchaseOrderType == PurchaseOrderType.C_PURCHASE_ORDER_TYPE_SECOM && prm.SpecifyPOrder250.Currency == CurrencyType.C_CURRENCY_TYPE_THB))
                        {
                            doPurchaseOrder.Vat = prm.SpecifyPOrder250.Vat;
                        }
                        doPurchaseOrder.Memo       = prm.SpecifyPOrder250.Memo;
                        doPurchaseOrder.CreateBy   = CommonUtil.dsTransData.dtUserData.EmpNo;
                        doPurchaseOrder.CreateDate = CommonUtil.dsTransData.dtOperationData.ProcessDateTime;
                        doPurchaseOrder.UpdateDate = CommonUtil.dsTransData.dtOperationData.ProcessDateTime;
                        doPurchaseOrder.UpdateBy   = CommonUtil.dsTransData.dtUserData.EmpNo;
                        doPurchaseOrder.WHT        = prm.SpecifyPOrder250.WHT;
                        doPurchaseOrder.Discount   = prm.SpecifyPOrder250.Discount;

                        List <tbt_PurchaseOrder> lst = new List <tbt_PurchaseOrder>();
                        lst.Add(doPurchaseOrder);
                        List <tbt_PurchaseOrder> dolstPurchaseOrder = InvH.InsertTbt_PurchaseOrder(lst);

                        if (dolstPurchaseOrder.Count <= 0)
                        {
                            throw ApplicationErrorException.ThrowErrorException(MessageUtil.MODULE_COMMON, MessageUtil.MessageList.MSG0148, new string[] { TableName.C_TBL_NAME_INV_PURCHASE });
                        }

                        List <tbt_PurchaseOrderDetail> lstDetail = new List <tbt_PurchaseOrderDetail>();

                        //foreach (doInstrument250 i in prm.lstInstrument)
                        foreach (doInstrument250 i in prm.SpecifyPOrder250.InstrumentData) //Modify by Jutarat A. on 28102013
                        {
                            tbt_PurchaseOrderDetail OrderDetail = new tbt_PurchaseOrderDetail();
                            OrderDetail.PurchaseOrderNo   = strPurchaseOrderNo;
                            OrderDetail.InstrumentCode    = i.InstrumentCode;
                            OrderDetail.InstrumentName    = i.InstrumentName; //Add by Jutarat A. on 28102013
                            OrderDetail.Memo              = i.Memo;           //Add by Jutarat A. on 28102013
                            OrderDetail.UnitPrice         = i.UnitPrice;
                            OrderDetail.FirstOrderQty     = i.OrderQty;
                            OrderDetail.ModifyOrderQty    = null;
                            OrderDetail.ReceiveQty        = 0;
                            OrderDetail.CreateBy          = CommonUtil.dsTransData.dtUserData.EmpNo;
                            OrderDetail.CreateDate        = CommonUtil.dsTransData.dtOperationData.ProcessDateTime;
                            OrderDetail.UpdateDate        = CommonUtil.dsTransData.dtOperationData.ProcessDateTime;
                            OrderDetail.UpdateBy          = CommonUtil.dsTransData.dtUserData.EmpNo;
                            OrderDetail.Unit              = i.Unit;
                            OrderDetail.OriginalUnitPrice = i.OriginalUnitPrice;
                            OrderDetail.Amount            = i.Amount;
                            lstDetail.Add(OrderDetail);
                        }
                        List <tbt_PurchaseOrderDetail> doPurchaseOrderDetail = InvH.InsertTbt_PurchaseOrderDetail(lstDetail);

                        if (doPurchaseOrderDetail.Count <= 0)
                        {
                            throw ApplicationErrorException.ThrowErrorException(MessageUtil.MODULE_COMMON, MessageUtil.MessageList.MSG0148, new string[] { TableName.C_TBL_NAME_INV_PURCHASE_DETAIL });
                        }

                        //if (prm.SpecifyPOrder250.PurchaseOrderType == PurchaseOrderType.C_PURCHASE_ORDER_TYPE_SECOM)
                        //{
                        //    IInventoryDocumentHandler handlerInventoryDocument = ServiceContainer.GetService<IInventoryDocumentHandler>() as IInventoryDocumentHandler;
                        //    string reportPath = handlerInventoryDocument.GenerateIVR190FilePath(strPurchaseOrderNo, prm.office.OfficeCode, CommonUtil.dsTransData.dtUserData.EmpNo, CommonUtil.dsTransData.dtOperationData.ProcessDateTime);
                        //    prm.slipNo = strPurchaseOrderNo;
                        //    prm.reportFilePath = reportPath;
                        //}
                        //else if (prm.SpecifyPOrder250.PurchaseOrderType == PurchaseOrderType.C_PURCHASE_ORDER_TYPE_DOMESTIC)
                        //{
                        //    IInventoryDocumentHandler handlerInventoryDocument = ServiceContainer.GetService<IInventoryDocumentHandler>() as IInventoryDocumentHandler;
                        //    string reportPath = handlerInventoryDocument.GenerateIVR191FilePath(strPurchaseOrderNo, prm.office.OfficeCode, CommonUtil.dsTransData.dtUserData.EmpNo, CommonUtil.dsTransData.dtOperationData.ProcessDateTime);
                        //    prm.slipNo = strPurchaseOrderNo;
                        //    prm.reportFilePath = reportPath;
                        //}

                        IInventoryDocumentHandler handlerInventoryDocument = ServiceContainer.GetService <IInventoryDocumentHandler>() as IInventoryDocumentHandler;
                        string reportPath = handlerInventoryDocument.GenerateIVR192FilePath(strPurchaseOrderNo, prm.office.OfficeCode, CommonUtil.dsTransData.dtUserData.EmpNo, CommonUtil.dsTransData.dtOperationData.ProcessDateTime);
                        prm.slipNo         = strPurchaseOrderNo;
                        prm.reportFilePath = reportPath;

                        scope.Complete();
                        res.ResultData = strPurchaseOrderNo;
                        return(Json(res));
                    }
                    catch (Exception ex)
                    {
                        res.AddErrorMessage(ex);
                        return(Json(res));
                    }
                }
            }
            catch (Exception ex)
            {
                res.AddErrorMessage(ex); return(Json(res));
            }
        }
Exemplo n.º 2
0
        /// <summary>
        /// Cancel the slip.
        /// - Check system suspending.<br />
        /// - Check user permission.<br />
        /// - Check stock in date.<br />
        /// - Check quantity of instrument.<br />
        /// - Check register asset flag.<br />
        /// - Delete inventory slip detail and inventory slip.<br />
        /// - Update inventory current.<br />
        /// - Update purchase oreder.<br />
        /// </summary>
        /// <param name="SlipNo"></param>
        /// <param name="strStockInType"></param>
        /// <param name="pOrderNo"></param>
        /// <param name="stockInDate"></param>
        /// <param name="Cond"></param>
        /// <returns></returns>
        public ActionResult CancelSlip(string SlipNo, string strStockInType, string pOrderNo, string stockInDate, IVS011Cancel Cond)
        {
            ObjectResultData res = new ObjectResultData();

            try
            {
                //5.3
                ICommonHandler comh = ServiceContainer.GetService <ICommonHandler>() as ICommonHandler;
                if (comh.IsSystemSuspending())
                {
                    res.AddErrorMessage(MessageUtil.MODULE_COMMON, MessageUtil.MessageList.MSG0049);
                    return(Json(res));
                }
                if (!CheckUserPermission(ScreenID.C_INV_SCREEN_ID_STOCKIN_CANCEL, FunctionID.C_FUNC_ID_OPERATE))
                {
                    res.AddErrorMessage(MessageUtil.MODULE_COMMON, MessageUtil.MessageList.MSG0053);
                    return(Json(res));
                }

                //5.4
                if (!string.IsNullOrEmpty(stockInDate))
                {
                    DateTime dStockInDate = Convert.ToDateTime(stockInDate);
                    if (dStockInDate.Month != DateTime.Now.Month)
                    {
                        res.AddErrorMessage(MessageUtil.MODULE_INVENTORY, MessageUtil.MessageList.MSG4044);
                        res.MessageType = MessageModel.MESSAGE_TYPE.WARNING;
                        return(Json(res));
                    }
                }

                //5.5
                IInventoryHandler InvH = ServiceContainer.GetService <IInventoryHandler>() as IInventoryHandler;

                IVS011_ScreenParameter param = GetScreenObject <IVS011_ScreenParameter>();
                if (param.lstInventory == null)
                {
                    param.lstInventory = new List <doInventorySlipDetailList>();
                }

                #region Monthly Price @ 2015
                List <tbt_InventoryCurrent>     lstInvCurrentPendingUpdate       = new List <tbt_InventoryCurrent>();
                List <tbt_AccountInstock>       lstAccInstockPendingUpdate       = new List <tbt_AccountInstock>();
                List <tbt_AccountSampleInstock> lstAccSampleInstockPendingUpdate = new List <tbt_AccountSampleInstock>();


                foreach (IVS011INST i in Cond.InstrumentList)
                {
                    int transferqty = i.TransferQty;

                    // Remove qty from inventory current which ShelfNo is default (00)
                    if (transferqty > 0)
                    {
                        List <tbt_InventoryCurrent> doInventoryCurrent = InvH.GetTbt_InventoryCurrent(param.office.OfficeCode, InstrumentLocation.C_INV_LOC_INSTOCK, i.SourceAreaCode, ShelfNo.C_INV_SHELF_STOCK_IN_DEFAULT, i.InstrumentCode);

                        if (doInventoryCurrent.Count > 0 && (doInventoryCurrent[0].InstrumentQty ?? 0) > 0)
                        {
                            if ((doInventoryCurrent[0].InstrumentQty ?? 0) >= transferqty)
                            {
                                doInventoryCurrent[0].InstrumentQty = doInventoryCurrent[0].InstrumentQty - transferqty;
                                transferqty = 0;
                            }
                            else
                            {
                                transferqty = transferqty - (doInventoryCurrent[0].InstrumentQty ?? 0);
                                doInventoryCurrent[0].InstrumentQty = 0;
                            }
                            doInventoryCurrent[0].UpdateDate = CommonUtil.dsTransData.dtOperationData.ProcessDateTime;
                            doInventoryCurrent[0].UpdateBy   = CommonUtil.dsTransData.dtUserData.EmpNo;

                            lstInvCurrentPendingUpdate.Add(doInventoryCurrent[0]);
                        }
                    }

                    // Remove qty from inventory current which ShelfNo is normal shelf
                    if (transferqty > 0)
                    {
                        var shelf = InvH.GetShelfOfArea(i.SourceAreaCode, i.InstrumentCode);
                        if (shelf != null && !string.IsNullOrEmpty(shelf.ShelfNo))
                        {
                            List <tbt_InventoryCurrent> doInventoryCurrent = InvH.GetTbt_InventoryCurrent(param.office.OfficeCode, InstrumentLocation.C_INV_LOC_INSTOCK, i.SourceAreaCode, shelf.ShelfNo, i.InstrumentCode);

                            if (doInventoryCurrent.Count > 0 && (doInventoryCurrent[0].InstrumentQty ?? 0) > 0)
                            {
                                if ((doInventoryCurrent[0].InstrumentQty ?? 0) >= transferqty)
                                {
                                    doInventoryCurrent[0].InstrumentQty = doInventoryCurrent[0].InstrumentQty - transferqty;
                                    transferqty = 0;
                                }
                                else
                                {
                                    transferqty = transferqty - (doInventoryCurrent[0].InstrumentQty ?? 0);
                                    doInventoryCurrent[0].InstrumentQty = 0;
                                }
                                doInventoryCurrent[0].UpdateDate = CommonUtil.dsTransData.dtOperationData.ProcessDateTime;
                                doInventoryCurrent[0].UpdateBy   = CommonUtil.dsTransData.dtUserData.EmpNo;

                                lstInvCurrentPendingUpdate.Add(doInventoryCurrent[0]);
                            }
                        }
                    }

                    // Not enough stock used to remove. Cancelling slip denied.
                    if (transferqty > 0)
                    {
                        res.MessageType = MessageModel.MESSAGE_TYPE.WARNING;
                        res.AddErrorMessage(MessageUtil.MODULE_INVENTORY, MessageUtil.MessageList.MSG4045, new string[] { i.InstrumentCode, i.AreaCodeName }, new string[] { i.row_id });
                        return(Json(res));
                    }
                }

                foreach (IVS011INST i in Cond.InstrumentList)
                {
                    if (i.SourceAreaCode == InstrumentArea.C_INV_AREA_NEW_SAMPLE)
                    {
                        // Remove qty from tbt_AccountSampleInStock
                        var accountSampleInStock = InvH.GetTbt_AccountSampleInStock(i.InstrumentCode, InstrumentLocation.C_INV_LOC_INSTOCK, param.office.OfficeCode);

                        // Not enough stock used to remove. Cancelling slip denied.
                        if (accountSampleInStock == null || accountSampleInStock.Count <= 0 || (accountSampleInStock[0].InstrumentQty ?? 0) < i.TransferQty)
                        {
                            res.MessageType = MessageModel.MESSAGE_TYPE.WARNING;
                            res.AddErrorMessage(MessageUtil.MODULE_INVENTORY, MessageUtil.MessageList.MSG4045, new string[] { i.InstrumentCode, i.AreaCodeName }, new string[] { i.row_id });
                            return(Json(res));
                        }

                        accountSampleInStock[0].InstrumentQty = accountSampleInStock[0].InstrumentQty - i.TransferQty;
                        accountSampleInStock[0].UpdateDate    = CommonUtil.dsTransData.dtOperationData.ProcessDateTime;
                        accountSampleInStock[0].UpdateBy      = CommonUtil.dsTransData.dtUserData.EmpNo;

                        lstAccSampleInstockPendingUpdate.Add(accountSampleInStock[0]);
                    }
                    else
                    {
                        // Remove qty from tbt_AccountInStock
                        var accountInStock = InvH.GetTbt_AccountInStock(i.InstrumentCode, InstrumentLocation.C_INV_LOC_INSTOCK, param.office.OfficeCode);

                        // Not enough stock used to remove. Cancelling slip denied.
                        if (accountInStock == null || accountInStock.Count <= 0 || (accountInStock[0].InstrumentQty ?? 0) < i.TransferQty)
                        {
                            res.MessageType = MessageModel.MESSAGE_TYPE.WARNING;
                            res.AddErrorMessage(MessageUtil.MODULE_INVENTORY, MessageUtil.MessageList.MSG4045, new string[] { i.InstrumentCode, i.AreaCodeName }, new string[] { i.row_id });
                            return(Json(res));
                        }

                        accountInStock[0].InstrumentQty = accountInStock[0].InstrumentQty - i.TransferQty;
                        accountInStock[0].UpdateDate    = CommonUtil.dsTransData.dtOperationData.ProcessDateTime;
                        accountInStock[0].UpdateBy      = CommonUtil.dsTransData.dtUserData.EmpNo;

                        lstAccInstockPendingUpdate.Add(accountInStock[0]);
                    }
                }
                #endregion

                List <tbt_InventorySlip> tbtSlip = InvH.GetTbt_InventorySlip(SlipNo);
                if (tbtSlip.Count > 0)
                {
                    // Monthly Price @ 2015 : Allow to register asset anytime until LockFlag = true
                    //if (tbtSlip[0].RegisterAssetFlag == RegisterAssetFlag.C_INV_REGISTER_ASSET_REGISTERED)
                    //{
                    //    res.AddErrorMessage(MessageUtil.MODULE_INVENTORY, MessageUtil.MessageList.MSG4046);
                    //    return Json(res);
                    //}
                    if (tbtSlip[0].LockFlag == true)
                    {
                        res.AddErrorMessage(MessageUtil.MODULE_INVENTORY, MessageUtil.MessageList.MSG4148);
                        return(Json(res));
                    }
                }

                using (TransactionScope scope = new TransactionScope())
                {
                    try
                    {
                        InvH.DeleteTbt_InventorySlipDetail(SlipNo);
                        InvH.DeleteTbt_InventorySlip(SlipNo);

                        #region Monthly Price @ 2015
                        InvH.UpdateTbt_InventoryCurrent(CommonUtil.ConvertToXml_Store <tbt_InventoryCurrent>(lstInvCurrentPendingUpdate));
                        if (lstAccSampleInstockPendingUpdate.Count > 0)
                        {
                            InvH.UpdateTbt_AccountSampleInStock(lstAccSampleInstockPendingUpdate);
                        }
                        if (lstAccInstockPendingUpdate.Count > 0)
                        {
                            InvH.UpdateTbt_AccountInStock(lstAccInstockPendingUpdate);
                        }

                        // Akat K. if stock-in type is Purchase Order then update purchase order
                        if (strStockInType == StockInType.C_INV_STOCKIN_TYPE_PURCHASE)
                        {
                            foreach (doInventorySlipDetailList i in param.lstInventory)
                            {
                                List <tbt_PurchaseOrderDetail> doPurchaseOrderDetail = InvH.GetTbt_PurchaseOrderDetail(pOrderNo, i.InstrumentCode);

                                if (doPurchaseOrderDetail.Count > 0)
                                {
                                    foreach (tbt_PurchaseOrderDetail p in doPurchaseOrderDetail)
                                    {
                                        p.ReceiveQty = p.ReceiveQty - i.TransferQty;
                                        p.UpdateBy   = CommonUtil.dsTransData.dtUserData.EmpNo;
                                        p.UpdateDate = CommonUtil.dsTransData.dtOperationData.ProcessDateTime;
                                    }

                                    InvH.UpdateTbt_PurchaseOrderDetail(CommonUtil.ConvertToXml_Store <tbt_PurchaseOrderDetail>(doPurchaseOrderDetail));
                                }
                            }

                            List <tbt_PurchaseOrder> lstPurchase = InvH.GetTbt_PurchaseOrder(pOrderNo);
                            tbt_PurchaseOrder        Porder      = lstPurchase[0];
                            Porder.PurchaseOrderNo = pOrderNo;

                            List <tbt_PurchaseOrderDetail> tbt_PorderDetail = InvH.GetTbt_PurchaseOrderDetail(pOrderNo, null);
                            int?sumReceiveQty     = (from c in tbt_PorderDetail select c.ReceiveQty).Sum();
                            int?sumModifyOrderQty = (from c in tbt_PorderDetail select c.ModifyOrderQty).Sum();
                            int?sumFirstQty       = (from c in tbt_PorderDetail select c.FirstOrderQty).Sum();
                            int?sumTmpQty         = 0;

                            if (sumReceiveQty == 0)
                            {
                                Porder.PurchaseOrderStatus = PurchaseOrderStatus.C_PURCHASE_ORDER_STATUS_WAIT_TO_RECEIVE;
                            }
                            else
                            {
                                if (sumModifyOrderQty > 0)
                                {
                                    sumTmpQty = sumModifyOrderQty;
                                }
                                else
                                {
                                    sumTmpQty = sumFirstQty;
                                }

                                if (sumTmpQty > sumReceiveQty && sumReceiveQty > 0)
                                {
                                    Porder.PurchaseOrderStatus = PurchaseOrderStatus.C_PURCHASE_ORDER_STATUS_PARTIAL_RECEIVE;
                                }
                            }
                            Porder.UpdateDate = CommonUtil.dsTransData.dtOperationData.ProcessDateTime;
                            Porder.UpdateBy   = CommonUtil.dsTransData.dtUserData.EmpNo;

                            List <tbt_PurchaseOrder> lstOrder = new List <tbt_PurchaseOrder>();
                            lstOrder.Add(lstPurchase[0]);

                            InvH.UpdateTbt_PurchaseOrder(CommonUtil.ConvertToXml_Store <tbt_PurchaseOrder>(lstOrder));
                        }
                        #endregion

                        scope.Complete();

                        res.ResultData = true;
                        return(Json(res));
                    }
                    catch (Exception ex)
                    {
                        res.AddErrorMessage(ex);
                        return(Json(res));
                    }
                }
            }
            catch (Exception ex) { res.AddErrorMessage(ex); return(Json(res)); }
        }