public async Task <StockIssueDocketTypeModel> GetDetail(int _id)
 {
     return(iMapper.Map <StockIssueDocketTypeModel>(await svcStockIssueDocketType.GetDetail(_id)));
 }
        public async Task <int> Add(ExportStockModel _model)
        {
            if (_model == null || _model.IssueDocket == null || _model.DocketDetails == null)
            {
                scopeContext.AddError("Lỗi dữ liệu đầu vào");
                return(0);
            }
            if (_model.IssueDocket.StockIssueDocketTypeId <= 0)
            {
                scopeContext.AddError("Chưa chọn loại phiếu nhập");
                return(0);
            }
            if (_model.IssueDocket.WarehouseId <= 0)
            {
                scopeContext.AddError("Chưa chọn kho nhập");
                return(0);
            }
            // lấy loại phiếu thu
            var issueDocketType = await svcStockIssueDocketType.GetDetail(_model.IssueDocket.StockIssueDocketTypeId);

            var receiptType = 0;

            if (issueDocketType != null && issueDocketType.ReceiptNeeded)
            {
                receiptType = issueDocketType.ReceiptTypeId;
            }

            // bắt đầu tạo phiếu
            using (var transaction = context.Database.BeginTransaction())
            {
                StockIssueDocket issueDocket = iMapper.Map <StockIssueDocket>(_model.IssueDocket);
                issueDocket.CustomerId   = _model.Receipt.PartnerId;
                issueDocket.CustomerName = _model.Receipt.PartnerName;
                ExpenditureDocket receipt = null;
                if (receiptType > 0)
                {
                    receipt             = iMapper.Map <ExpenditureDocket>(_model.Receipt);
                    receipt.Amount      = issueDocket.Amount;
                    receipt.Vat         = issueDocket.Vat;
                    receipt.WarehouseId = issueDocket.WarehouseId;
                    receipt.CreatedUser = scopeContext.UserCode;
                    receipt.IsReceipt   = true;
                }
                List <StockIssueDocketDetail>  docketDetails = iMapper.Map <List <StockIssueDocketDetail> >(_model.DocketDetails);
                List <ExpenditureDocketDetail> expendDetails = new List <ExpenditureDocketDetail>();
                decimal orderVAT         = 0;
                decimal orderAmount      = 0;
                decimal orderTotalAmount = 0;

                List <ProductInstockModel> productInstock = new List <ProductInstockModel>();
                foreach (var item in docketDetails)
                {
                    if (receiptType > 0)
                    {
                        item.Amount      = item.Quantity * item.UnitPrice;
                        item.Vat         = item.Amount * (item.VatPercent / (decimal)100);
                        item.TotalAmount = item.Amount + item.Vat;
                        ExpenditureDocketDetail exDetail = new ExpenditureDocketDetail
                        {
                            ExpenditureDocketId = receipt.Id,
                            Amount      = item.Amount,
                            Vat         = item.Vat,
                            TotalAmount = item.TotalAmount
                        };
                        expendDetails.Add(exDetail);
                        orderVAT         += item.Vat;
                        orderAmount      += item.Amount;
                        orderTotalAmount += item.TotalAmount;
                    }
                    else
                    {
                        item.UnitPrice   = 0;
                        item.Amount      = 0;
                        item.Vat         = 0;
                        item.TotalAmount = 0;
                    }

                    #region Trừ vào danh sách tồn - Tạm thời chưa chuyển đổi sang số lượng theo đơn vị tính chuẩn
                    var idx = productInstock.FindIndex(p => p.ProductId == item.ProductId);
                    if (idx >= 0)
                    {
                        productInstock[idx].Quantity += item.Quantity;
                    }
                    else
                    {
                        productInstock.Add(new ProductInstockModel()
                        {
                            ProductId     = item.ProductId,
                            ProductName   = "",
                            Quantity      = item.Quantity,
                            ProductUnitId = item.ProductUnitId
                        });
                    }
                    #endregion
                }
                // insert
                if (receiptType > 0)
                {
                    issueDocket.Vat         = orderVAT;
                    issueDocket.Amount      = orderAmount;
                    issueDocket.TotalAmount = orderTotalAmount;
                    issueDocket.Id          = await svcStockIssueDocket.Add(issueDocket);

                    receipt.Vat           = orderVAT;
                    receipt.Amount        = orderAmount;
                    receipt.TotalAmount   = orderTotalAmount;
                    receipt.StockDocketId = issueDocket.Id;
                    receipt.Id            = await svcExpenditureDocket.Add(receipt);
                }
                else
                {
                    issueDocket.Vat         = 0;
                    issueDocket.Amount      = 0;
                    issueDocket.TotalAmount = 0;
                    issueDocket.Id          = await svcStockIssueDocket.Add(issueDocket);
                }
                foreach (var item in docketDetails)
                {
                    item.StockIssueDocketId = issueDocket.Id;
                    item.Id = await svcStockIssueDocketDetail.Add(item);
                }
                foreach (var item in expendDetails)
                {
                    item.ExpenditureDocketId = receipt.Id;
                    item.Id = await svcExpenditureDocketDetail.Add(item);
                }

                #region Cập nhật vào bảng tồn
                foreach (var current in productInstock)
                {
                    var instock = await svcCurrentInStock.GetList(issueDocket.WarehouseId, current.ProductId);

                    if (instock == null || instock.Count == 0)
                    {
                        CurrentInStock cis = new CurrentInStock()
                        {
                            Amount        = 0 - current.Quantity,
                            AmountExpect  = 0 - current.Quantity,
                            ProductId     = current.ProductId,
                            ProductUnitId = current.ProductUnitId,
                            WarehouseId   = issueDocket.WarehouseId
                        };
                        cis.Id = await svcCurrentInStock.Add(cis);
                    }
                    else
                    {
                        CurrentInStock cis = instock[0];
                        cis.Amount       -= current.Quantity;
                        cis.AmountExpect -= current.Quantity;
                        await svcCurrentInStock.Modify(cis);
                    }
                }
                #endregion
                transaction.Commit();
                return(issueDocket.Id);
            }
        }