Exemplo n.º 1
0
        public override IModel CreateModel(SqlDataReader dr)
        {
            BusinessInvoice businessinvoice = new BusinessInvoice();

            int indexBusinessInvoiceId = dr.GetOrdinal("BusinessInvoiceId");
            businessinvoice.BusinessInvoiceId = Convert.ToInt32(dr[indexBusinessInvoiceId]);

            int indexInvoiceId = dr.GetOrdinal("InvoiceId");
            if (dr["InvoiceId"] != DBNull.Value)
            {
                businessinvoice.InvoiceId = Convert.ToInt32(dr[indexInvoiceId]);
            }

            int indexRefInvoiceId = dr.GetOrdinal("RefInvoiceId");
            if (dr["RefInvoiceId"] != DBNull.Value)
            {
                businessinvoice.RefInvoiceId = Convert.ToInt32(dr[indexRefInvoiceId]);
            }

            int indexContractId = dr.GetOrdinal("ContractId");
            if (dr["ContractId"] != DBNull.Value)
            {
                businessinvoice.ContractId = Convert.ToInt32(dr[indexContractId]);
            }

            int indexSubContractId = dr.GetOrdinal("SubContractId");
            if (dr["SubContractId"] != DBNull.Value)
            {
                businessinvoice.SubContractId = Convert.ToInt32(dr[indexSubContractId]);
            }

            int indexAssetId = dr.GetOrdinal("AssetId");
            if (dr["AssetId"] != DBNull.Value)
            {
                businessinvoice.AssetId = Convert.ToInt32(dr[indexAssetId]);
            }

            int indexIntegerAmount = dr.GetOrdinal("IntegerAmount");
            if (dr["IntegerAmount"] != DBNull.Value)
            {
                businessinvoice.IntegerAmount = Convert.ToDecimal(dr[indexIntegerAmount]);
            }

            int indexNetAmount = dr.GetOrdinal("NetAmount");
            if (dr["NetAmount"] != DBNull.Value)
            {
                businessinvoice.NetAmount = Convert.ToDecimal(dr[indexNetAmount]);
            }

            int indexUnitPrice = dr.GetOrdinal("UnitPrice");
            if (dr["UnitPrice"] != DBNull.Value)
            {
                businessinvoice.UnitPrice = Convert.ToDecimal(dr[indexUnitPrice]);
            }

            int indexMUId = dr.GetOrdinal("MUId");
            if (dr["MUId"] != DBNull.Value)
            {
                businessinvoice.MUId = Convert.ToInt32(dr[indexMUId]);
            }

            int indexMarginRatio = dr.GetOrdinal("MarginRatio");
            if (dr["MarginRatio"] != DBNull.Value)
            {
                businessinvoice.MarginRatio = Convert.ToDecimal(dr[indexMarginRatio]);
            }

            int indexVATRatio = dr.GetOrdinal("VATRatio");
            if (dr["VATRatio"] != DBNull.Value)
            {
                businessinvoice.VATRatio = Convert.ToDecimal(dr[indexVATRatio]);
            }

            int indexVATBala = dr.GetOrdinal("VATBala");
            if (dr["VATBala"] != DBNull.Value)
            {
                businessinvoice.VATBala = Convert.ToDecimal(dr[indexVATBala]);
            }

            return businessinvoice;
        }
Exemplo n.º 2
0
        public ResultModel Load(UserModel user, int refInvoiceId)
        {
            ResultModel result = new ResultModel();
            try
            {
                string cmdText = string.Format("select * from dbo.Inv_BusinessInvoice where RefInvoiceId ={0}", refInvoiceId);

                DataTable dt = SqlHelper.ExecuteDataTable(ConnectString, cmdText, null, CommandType.Text);

                List<BusinessInvoice> businessInvoices = new List<BusinessInvoice>();

                foreach (DataRow dr in dt.Rows)
                {
                    BusinessInvoice businessinvoice = new BusinessInvoice();
                    businessinvoice.BusinessInvoiceId = Convert.ToInt32(dr["BusinessInvoiceId"]);

                    if (dr["InvoiceId"] != DBNull.Value)
                    {
                        businessinvoice.InvoiceId = Convert.ToInt32(dr["InvoiceId"]);
                    }
                    if (dr["RefInvoiceId"] != DBNull.Value)
                    {
                        businessinvoice.RefInvoiceId = Convert.ToInt32(dr["RefInvoiceId"]);
                    }
                    if (dr["ContractId"] != DBNull.Value)
                    {
                        businessinvoice.ContractId = Convert.ToInt32(dr["ContractId"]);
                    }
                    if (dr["SubContractId"] != DBNull.Value)
                    {
                        businessinvoice.SubContractId = Convert.ToInt32(dr["SubContractId"]);
                    }
                    if (dr["AssetId"] != DBNull.Value)
                    {
                        businessinvoice.AssetId = Convert.ToInt32(dr["AssetId"]);
                    }
                    if (dr["IntegerAmount"] != DBNull.Value)
                    {
                        businessinvoice.IntegerAmount = Convert.ToDecimal(dr["IntegerAmount"]);
                    }
                    if (dr["NetAmount"] != DBNull.Value)
                    {
                        businessinvoice.NetAmount = Convert.ToDecimal(dr["NetAmount"]);
                    }
                    if (dr["UnitPrice"] != DBNull.Value)
                    {
                        businessinvoice.UnitPrice = Convert.ToDecimal(dr["UnitPrice"]);
                    }
                    if (dr["MUId"] != DBNull.Value)
                    {
                        businessinvoice.MUId = Convert.ToInt32(dr["MUId"]);
                    }
                    if (dr["MarginRatio"] != DBNull.Value)
                    {
                        businessinvoice.MarginRatio = Convert.ToDecimal(dr["MarginRatio"]);
                    }
                    if (dr["VATRatio"] != DBNull.Value)
                    {
                        businessinvoice.VATRatio = Convert.ToDecimal(dr["VATRatio"]);
                    }
                    if (dr["VATBala"] != DBNull.Value)
                    {
                        businessinvoice.VATBala = Convert.ToDecimal(dr["VATBala"]);
                    }
                    businessInvoices.Add(businessinvoice);
                }
                result.AffectCount = dt.Rows.Count;
                result.Message = "获取列表成功";
                result.ResultStatus = 0;
                result.ReturnValue = businessInvoices;
            }
            catch (Exception ex)
            {
                result.Message = ex.Message;
            }

            return result;
        }
Exemplo n.º 3
0
        public ResultModel CreateReplaceFinal(UserModel user, Operate.Model.Invoice invoice, BusinessInvoice invoiceBusiness, List<BusinessInvoiceDetail> details)
        {
            ResultModel result = new ResultModel();

            StockLogDAL stockLogDAL = new StockLogDAL();

            foreach (BusinessInvoiceDetail detail in details)
            {
                result = stockLogDAL.Get(user, detail.StockLogId);
                if (result.ResultStatus != 0)
                    return result;

                StockLog stockLog = result.ReturnValue as StockLog;
                if (stockLog == null || stockLog.StockLogId <= 0)
                {
                    result.ResultStatus = -1;
                    result.Message = "当前合约不存在该笔库存";
                    return result;
                }
                detail.IntegerAmount = stockLog.GrossAmount;
            }

            decimal sumNetAmount = details.Sum(temp => temp.NetAmount);
            if (sumNetAmount != invoiceBusiness.NetAmount)
            {
                result.ResultStatus = -1;
                result.Message = "明细净重之和与总净重不相等";
                return result;
            }

            decimal sumBala = details.Sum(temp => temp.Bala);
            if (sumBala != invoice.InvoiceBala)
            {
                result.ResultStatus = -1;
                result.Message = "明细金额之和与总金额不相等";
                return result;
            }

            decimal sumUnitBala = Math.Round(details.Sum(temp => temp.UnitPrice * temp.NetAmount),2,MidpointRounding.AwayFromZero);
            decimal avgPrice = Math.Round(sumUnitBala / sumNetAmount, 4, MidpointRounding.AwayFromZero);

            invoiceBusiness.UnitPrice = avgPrice;
            invoiceBusiness.IntegerAmount = details.Sum(temp => temp.IntegerAmount);

            result = this.CreateBusinessInvoice(user, invoice, invoiceBusiness, details, InvoiceTypeEnum.ReplaceFinalInvoice);

            return result;
        }
Exemplo n.º 4
0
 public ResultModel CreateSuppleFinal(UserModel user, Operate.Model.Invoice invoice, BusinessInvoice invoiceBusiness, List<BusinessInvoiceDetail> details)
 {
     return this.CreateBusinessInvoice(user, invoice, invoiceBusiness, details, InvoiceTypeEnum.SuppleFinalInvoice);
 }
Exemplo n.º 5
0
        public ResultModel CreateDirect(UserModel user, Operate.Model.Invoice invoice, BusinessInvoice invoiceBusiness, List<BusinessInvoiceDetail> details)
        {
            ResultModel result = new ResultModel();

            ContractSubDAL subDAL = new ContractSubDAL();
            result = subDAL.Get(user, invoiceBusiness.SubContractId);
            if(result.ResultStatus!=0)
                return result;

            ContractSub sub = result.ReturnValue as ContractSub;
            if (sub == null || sub.SubId <= 0)
            {
                result.ResultStatus = -1;
                result.Message = "子合约不存在";
                return result;
            }

            StockLogDAL stockLogDAL = new StockLogDAL();
            //明细表数据:毛重、金额计算
            foreach (BusinessInvoiceDetail detail in details)
            {
                detail.Bala = Math.Round(detail.NetAmount * detail.UnitPrice, 2, MidpointRounding.AwayFromZero);

                if (sub.TradeBorder == (int)TradeBorderEnum.内贸)
                {
                    //内贸毛重==净重
                    detail.IntegerAmount = detail.NetAmount;
                }
                else
                {
                    //整笔开票情况下,外贸毛重等于库存流水毛重;分笔开票情况下,等于净重。
                    result = stockLogDAL.Get(user, detail.StockLogId);
                    if (result.ResultStatus != 0)
                        return result;

                    StockLog stockLog = result.ReturnValue as StockLog;
                    if (stockLog == null || stockLog.StockLogId <= 0)
                    {
                        result.ResultStatus = -1;
                        result.Message = "当前合约不存在该笔库存";
                        return result;
                    }

                    if (stockLog.NetAmount == detail.NetAmount)
                    {
                        detail.IntegerAmount = stockLog.GrossAmount;
                    }
                    else
                    {
                        detail.IntegerAmount = detail.NetAmount;
                    }
                }
            }

            //主表数据:毛重、净重、均价、总额计算
            decimal sumGrossAmount = details.Sum(temp => temp.IntegerAmount);
            invoiceBusiness.IntegerAmount = sumGrossAmount;

            decimal sumNetAmount = details.Sum(temp => temp.NetAmount);
            if (sumNetAmount != invoiceBusiness.NetAmount)
            {
                result.ResultStatus = -1;
                result.Message = "明细净重之和与总净重不相等";
                return result;
            }

            decimal sumBala = details.Sum(temp => temp.Bala);
            if (Math.Abs(sumBala - invoice.InvoiceBala) >= 1)
            {
                result.ResultStatus = -1;
                result.Message = "明细金额之和与总金额不相等";
                return result;
            }

            decimal avgPrice = Math.Round(sumBala / sumNetAmount, 4, MidpointRounding.AwayFromZero);
            if (avgPrice != invoiceBusiness.UnitPrice)
            {
                result.ResultStatus = -1;
                result.Message = "计算均价错误";
                return result;
            }

            //验证是否已开临票
            //result = this.businessinvoiceDAL.LoadBySubId(user, invoiceBusiness.SubContractId, InvoiceTypeEnum.ProvisionalInvoice);
            //if (result.ResultStatus != 0)
            //    return result;

            //List<Model.BusinessInvoice> proInvoices = result.ReturnValue as List<Model.BusinessInvoice>;
            //if (proInvoices == null)
            //{
            //    result.ResultStatus = -1;
            //    result.Message = "验证是否拥有临票失败";
            //    return result;
            //}
            //if (proInvoices.Count > 0)
            //{
            //    result.ResultStatus = -1;
            //    result.Message = "当前合约已拥有临票,直接终票失败";
            //    return result;
            //}

            result = this.CreateBusinessInvoice(user, invoice, invoiceBusiness, details, InvoiceTypeEnum.DirectFinalInvoice);

            return result;
        }
Exemplo n.º 6
0
        public ResultModel CreateProvisional(UserModel user, Operate.Model.Invoice invoice, BusinessInvoice invoiceBusiness, List<BusinessInvoiceDetail> details)
        {
            ResultModel result = new ResultModel();

            StockLogDAL stockLogDAL = new StockLogDAL();

            foreach (BusinessInvoiceDetail detail in details)
            {
                detail.UnitPrice = invoiceBusiness.UnitPrice;
                result = stockLogDAL.Get(user, detail.StockLogId);
                if (result.ResultStatus != 0)
                    return result;

                StockLog stockLog = result.ReturnValue as StockLog;
                if (stockLog == null || stockLog.StockLogId <= 0)
                {
                    result.ResultStatus = -1;
                    result.Message = "当前合约不存在该笔库存";
                    return result;
                }
                detail.IntegerAmount = stockLog.GrossAmount;
            }

            invoiceBusiness.IntegerAmount = details.Sum(temp => temp.IntegerAmount);

            //验证是否已开直接终票
            result = this.businessinvoiceDAL.LoadBySubId(user, invoiceBusiness.SubContractId, InvoiceTypeEnum.DirectFinalInvoice);
            if (result.ResultStatus != 0)
                return result;

            List<BusinessInvoice> dirInvoices = result.ReturnValue as List<BusinessInvoice>;
            if (dirInvoices == null)
            {
                result.ResultStatus = -1;
                result.Message = "验证是否拥有直接终票失败";
                return result;
            }
            if (dirInvoices.Count > 0)
            {
                result.ResultStatus = -1;
                result.Message = "当前合约已拥有直接终票,临票失败";
                return result;
            }

            result = this.CreateBusinessInvoice(user, invoice, invoiceBusiness, details, InvoiceTypeEnum.ProvisionalInvoice);

            return result;
        }
Exemplo n.º 7
0
        public ResultModel CreateBusinessInvoice(UserModel user, Operate.Model.Invoice invoice, BusinessInvoice invoiceBusiness, List<BusinessInvoiceDetail> details, InvoiceTypeEnum invoiceType)
        {
            ResultModel result = new ResultModel();

            try
            {
                BusinessInvoiceDAL businessInvoiceDAL = new BusinessInvoiceDAL();
                InvoiceDAL invoiceDAL = new InvoiceDAL();
                BusinessInvoiceDetailDAL detailDAL = new BusinessInvoiceDetailDAL();
                ContractSubDAL subDAL = new ContractSubDAL();
                StockReceiptDetailDAL stockReceiptDetailDAL = new StockReceiptDetailDAL();
                SubDetailDAL subDetailDAL = new SubDetailDAL();

                using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required))
                {
                    //验证子合约
                    result = subDAL.Get(user, invoiceBusiness.SubContractId);
                    if (result.ResultStatus != 0)
                        return result;

                    ContractSub sub = result.ReturnValue as ContractSub;
                    if (sub == null || sub.SubId <= 0)
                    {
                        result.ResultStatus = -1;
                        result.Message = "子合约不存在";
                        return result;
                    }

                    if (sub.SubStatus != StatusEnum.已生效)
                    {
                        result.ResultStatus = -1;
                        result.Message = "子合约非已生效状态,不能新增临票";
                        return result;
                    }

                    //获取子合约明细
                    result = subDetailDAL.GetDetailBySubId(user, sub.SubId);
                    if (result.ResultStatus != 0)
                        return result;

                    SubDetail subDetail = result.ReturnValue as SubDetail;
                    if (subDetail == null || subDetail.SubDetailId <= 0)
                    {
                        result.ResultStatus = -1;
                        result.Message = "子合约明细获取失败";
                        return result;
                    }

                    //获取子合约下所有
                    result = this.businessinvoiceDAL.LoadBySubId(user, invoiceBusiness.SubContractId, invoiceType);
                    if (result.ResultStatus != 0)
                        return result;

                    List<BusinessInvoice> bis = result.ReturnValue as List<BusinessInvoice>;
                    decimal sumNetAmount = bis.Sum(temp => temp.NetAmount);
                    decimal maxNetAmount = sub.SignAmount * (1 + subDetail.MoreOrLess);
                    //if (maxNetAmount < sumNetAmount + invoiceBusiness.NetAmount)
                    //{
                    //    result.ResultStatus = -1;
                    //    result.Message = "开票重量超额";
                    //    return result;
                    //}

                    //新增发票主表
                    int invoiceId = 0;
                    invoice.InvoiceType = (int)invoiceType;
                    invoice.InvoiceStatus = StatusEnum.已录入;
                    Corporation outCorp = UserProvider.Corporations.FirstOrDefault(temp => temp.CorpId == invoice.OutCorpId);
                    if (outCorp == null || outCorp.CorpId <= 0)
                    {
                        result.ResultStatus = -1;
                        result.Message = "开票公司信息错误";
                        return result;
                    }
                    invoice.OutCorpName = outCorp.CorpName;

                    Corporation inCorp = UserProvider.Corporations.FirstOrDefault(temp => temp.CorpId == invoice.InCorpId);
                    if (inCorp == null || inCorp.CorpId <= 0)
                    {
                        result.ResultStatus = -1;
                        result.Message = "收票公司信息错误";
                        return result;
                    }
                    invoice.InCorpName = inCorp.CorpName;

                    result = invoiceDAL.Insert(user, invoice);
                    if (result.ResultStatus != 0)
                        return result;

                    if (result.ReturnValue == null || !int.TryParse(result.ReturnValue.ToString(), out invoiceId))
                    {
                        result.ResultStatus = -1;
                        result.Message = "发票添加失败";
                        return result;
                    }

                    //新增业务发票表
                    int businessInvoiceId = 0;
                    invoiceBusiness.InvoiceId = invoiceId;
                    result = businessInvoiceDAL.Insert(user, invoiceBusiness);
                    if (result.ResultStatus != 0)
                        return result;

                    if (result.ReturnValue == null || !int.TryParse(result.ReturnValue.ToString(), out businessInvoiceId))
                    {
                        result.ResultStatus = -1;
                        result.Message = "新增发票失败";
                        return result;
                    }

                    //新增业务发票明细
                    StockLogDAL stockLogDAL = new StockLogDAL();
                    StockDAL stockDAL = new StockDAL();
                    foreach (BusinessInvoiceDetail detail in details)
                    {
                        if (detail.NetAmount != 0 && detail.StockId > 0)
                        {
                            //验证库存
                            result = stockDAL.Get(user, detail.StockId);
                            if (result.ResultStatus != 0)
                                return result;
                            Stock stock = result.ReturnValue as Stock;
                            if (stock == null || stock.StockId <= 0)
                            {
                                result.ResultStatus = -1;
                                result.Message = "发票库存获取失败";
                                return result;
                            }

                            //验证库存流水
                            result = stockLogDAL.Get(user, detail.StockLogId);
                            if (result.ResultStatus != 0)
                                return result;

                            StockLog stockLog = result.ReturnValue as StockLog;
                            if (stockLog == null || stockLog.StockLogId <= 0)
                            {
                                result.ResultStatus = -1;
                                result.Message = "新增发票流水获取失败";
                                return result;
                            }

                            //基本验证
                            if (stockLog.StockId != stock.StockId)
                            {
                                result.ResultStatus = -1;
                                result.Message = "库存与库存流水不匹配";
                                return result;
                            }

                            //验证流水合约与发票合约是否相同
                            if (stockLog.SubContractId != invoiceBusiness.SubContractId)
                            {
                                result.ResultStatus = -1;
                                result.Message = "合约与库存流水不匹配";
                                return result;
                            }

                            detail.DetailStatus = StatusEnum.已生效;
                            detail.InvoiceId = invoiceId;
                            detail.BusinessInvoiceId = businessInvoiceId;
                            detail.StockId = stockLog.StockId;
                            detail.StockLogId = stockLog.StockLogId;

                            if (invoice.InvoiceType == (int)InvoiceTypeEnum.SuppleFinalInvoice)
                            {
                                //获取当前流水回执信息
                                result = stockReceiptDetailDAL.LoadByStockLogId(user, stockLog.StockLogId);
                                List<StockReceiptDetail> stockReceiptDetails = result.ReturnValue as List<StockReceiptDetail>;
                                if (stockReceiptDetails == null)
                                {
                                    result.ResultStatus = -1;
                                    result.Message = "当前流水未回执,不能补零";
                                    return result;
                                }

                                decimal sumQtyMiss = stockReceiptDetails.Sum(temp => temp.QtyMiss);
                                detail.IntegerAmount = sumQtyMiss;
                                detail.NetAmount = sumQtyMiss;
                            }
                            //else
                            //{
                            //    detail.IntegerAmount = stockLog.GrossAmount;
                            //    detail.NetAmount = stockLog.NetAmount;
                            //}
                            result = detailDAL.Insert(user, detail);
                            if (result.ResultStatus != 0)
                                return result;
                        }
                    }

                    invoice.InvoiceId = invoiceId;
                    if (result.ResultStatus == 0) result.ReturnValue = invoice;

                    scope.Complete();
                }
            }
            catch (Exception ex)
            {
                result.ResultStatus = -1;
                result.Message = ex.Message;
            }

            return result;
        }
Exemplo n.º 8
0
 public ResultModel UpdateSuppleFinal(UserModel user, Operate.Model.Invoice invoice, BusinessInvoice replaceBusiness, List<BusinessInvoiceDetail> details)
 {
     return this.UpdateBusinessInvoice(user, invoice, replaceBusiness, details);
 }
Exemplo n.º 9
0
        public ResultModel UpdateProvisional(UserModel user, Operate.Model.Invoice invoice, BusinessInvoice provisionalInvoice, List<BusinessInvoiceDetail> details)
        {
            ResultModel result = new ResultModel();

            StockLogDAL stockLogDAL = new StockLogDAL();

            foreach (BusinessInvoiceDetail detail in details)
            {
                detail.UnitPrice = provisionalInvoice.UnitPrice;
                result = stockLogDAL.Get(user, detail.StockLogId);
                if (result.ResultStatus != 0)
                    return result;

                StockLog stockLog = result.ReturnValue as StockLog;
                if (stockLog == null || stockLog.StockLogId <= 0)
                {
                    result.ResultStatus = -1;
                    result.Message = "当前合约不存在该笔库存";
                    return result;
                }
                detail.IntegerAmount = stockLog.GrossAmount;
            }
            provisionalInvoice.IntegerAmount = details.Sum(temp => temp.IntegerAmount);

            result = this.UpdateBusinessInvoice(user, invoice, provisionalInvoice, details);

            return result;
        }
Exemplo n.º 10
0
        public ResultModel UpdateDirect(UserModel user, Operate.Model.Invoice invoice, BusinessInvoice invoiceBusiness, List<BusinessInvoiceDetail> details)
        {
            ResultModel result = new ResultModel();
            ContractSubDAL subDAL = new ContractSubDAL();
            result = subDAL.Get(user, invoiceBusiness.SubContractId);
            if (result.ResultStatus != 0)
                return result;

            ContractSub sub = result.ReturnValue as ContractSub;
            if (sub == null || sub.SubId <= 0)
            {
                result.ResultStatus = -1;
                result.Message = "子合约不存在";
                return result;
            }

            StockLogDAL stockLogDAL = new StockLogDAL();
            //明细表数据:毛重、金额计算
            foreach (BusinessInvoiceDetail detail in details)
            {
                detail.Bala = Math.Round(detail.NetAmount * detail.UnitPrice, 2, MidpointRounding.AwayFromZero);

                if (sub.TradeBorder == (int)TradeBorderEnum.内贸)
                {
                    //内贸毛重==净重
                    detail.IntegerAmount = detail.NetAmount;
                }
                else
                {
                    //整笔开票情况下,外贸毛重等于库存流水毛重;分笔开票情况下,等于净重。
                    result = stockLogDAL.Get(user, detail.StockLogId);
                    if (result.ResultStatus != 0)
                        return result;

                    StockLog stockLog = result.ReturnValue as StockLog;
                    if (stockLog == null || stockLog.StockLogId <= 0)
                    {
                        result.ResultStatus = -1;
                        result.Message = "当前合约不存在该笔库存";
                        return result;
                    }

                    if (stockLog.NetAmount == detail.NetAmount)
                    {
                        detail.IntegerAmount = stockLog.GrossAmount;
                    }
                    else
                    {
                        detail.IntegerAmount = detail.NetAmount;
                    }
                }
            }

            //主表数据:毛重、净重、均价、总额计算
            decimal sumGrossAmount = details.Sum(temp => temp.IntegerAmount);
            invoiceBusiness.IntegerAmount = sumGrossAmount;

            decimal sumNetAmount = details.Sum(temp => temp.NetAmount);
            if (sumNetAmount != invoiceBusiness.NetAmount)
            {
                result.ResultStatus = -1;
                result.Message = "明细净重之和与总净重不相等";
                return result;
            }

            decimal sumBala = details.Sum(temp => temp.Bala);
            if (Math.Abs(sumBala - invoice.InvoiceBala) >=1)
            {
                result.ResultStatus = -1;
                result.Message = "明细金额之和与总金额不相等";
                return result;
            }

            decimal avgPrice = Math.Round(sumBala / sumNetAmount, 4, MidpointRounding.AwayFromZero);
            if (avgPrice != invoiceBusiness.UnitPrice)
            {
                result.ResultStatus = -1;
                result.Message = "计算均价错误";
                return result;
            }

            return this.UpdateBusinessInvoice(user, invoice, invoiceBusiness, details);
            //ResultModel result = new ResultModel();

            //try
            //{
            //    DAL.BusinessInvoiceDAL businessInvoiceDAL = new BusinessInvoiceDAL();
            //    NFMT.Operate.DAL.InvoiceDAL invoiceDAL = new Operate.DAL.InvoiceDAL();
            //    DAL.BusinessInvoiceDetailDAL detailDAL = new BusinessInvoiceDetailDAL();

            //    using (System.Transactions.TransactionScope scope = new TransactionScope(TransactionScopeOption.Required))
            //    {
            //        //验证发票
            //        if (invoiceBusiness.BusinessInvoiceId <= 0)
            //        {
            //            result.Message = "直发票不存在";
            //            return result;
            //        }

            //        result = businessinvoiceDAL.Get(user, invoiceBusiness.BusinessInvoiceId);
            //        if (result.ResultStatus != 0)
            //            return result;

            //        NFMT.Invoice.Model.BusinessInvoice resultBusinessInvoice = result.ReturnValue as NFMT.Invoice.Model.BusinessInvoice;
            //        if (resultBusinessInvoice == null || resultBusinessInvoice.BusinessInvoiceId <= 0)
            //        {
            //            result.ResultStatus = -1;
            //            result.Message = "发票不存在";
            //            return result;
            //        }

            //        //更新发票
            //        resultBusinessInvoice.IntegerAmount = invoiceBusiness.IntegerAmount;
            //        resultBusinessInvoice.NetAmount = invoiceBusiness.NetAmount;
            //        resultBusinessInvoice.VATRatio = invoiceBusiness.VATRatio;
            //        resultBusinessInvoice.VATBala = invoiceBusiness.VATBala;
            //        resultBusinessInvoice.UnitPrice = invoiceBusiness.UnitPrice;

            //        resultBusinessInvoice.Status = StatusEnum.已录入;

            //        result = businessinvoiceDAL.Update(user, resultBusinessInvoice);
            //        if (result.ResultStatus != 0)
            //            return result;

            //        //获取发票主表
            //        result = invoiceDAL.Get(user, resultBusinessInvoice.InvoiceId);
            //        if (result.ResultStatus != 0)
            //            return result;

            //        NFMT.Operate.Model.Invoice resultInvoice = result.ReturnValue as NFMT.Operate.Model.Invoice;
            //        if (resultInvoice == null || resultInvoice.InvoiceId <= 0)
            //        {
            //            result.ResultStatus = -1;
            //            result.Message = "发票不存在";
            //            return result;
            //        }

            //        //更新发票
            //        resultInvoice.InvoiceDate = invoice.InvoiceDate;
            //        resultInvoice.InvoiceName = invoice.InvoiceName;
            //        resultInvoice.InvoiceBala = invoice.InvoiceBala;
            //        resultInvoice.OutCorpId = invoice.OutCorpId;
            //        resultInvoice.InCorpId = invoice.InCorpId;
            //        resultInvoice.Memo = invoice.Memo;

            //        result = invoiceDAL.Update(user, resultInvoice);
            //        if (result.ResultStatus != 0)
            //            return result;

            //        //获取发票明细
            //        result = detailDAL.Load(user, resultBusinessInvoice.BusinessInvoiceId);
            //        if (result.ResultStatus != 0)
            //            return result;

            //        List<Model.BusinessInvoiceDetail> resultDetails = result.ReturnValue as List<Model.BusinessInvoiceDetail>;
            //        if (resultDetails == null)
            //        {
            //            result.ResultStatus = -1;
            //            result.Message = "获取发票明细失败";
            //            return result;
            //        }

            //        //作废发票明细
            //        foreach (Model.BusinessInvoiceDetail detail in resultDetails)
            //        {
            //            if (detail.DetailStatus == StatusEnum.已生效)
            //                detail.DetailStatus = StatusEnum.已录入;

            //            result = detailDAL.Invalid(user, detail);
            //            if (result.ResultStatus != 0)
            //                return result;
            //        }

            //        //新增发票明细
            //        foreach (Model.BusinessInvoiceDetail detail in details)
            //        {
            //            if (detail.NetAmount > 0 && detail.Bala > 0 && detail.StockId > 0)
            //            {
            //                detail.DetailStatus = StatusEnum.已生效;
            //                detail.InvoiceId = invoice.InvoiceId;
            //                detail.BusinessInvoiceId = invoiceBusiness.BusinessInvoiceId;
            //                result = detailDAL.Insert(user, detail);
            //                if (result.ResultStatus != 0)
            //                    return result;
            //            }
            //        }

            //        scope.Complete();
            //    }
            //}
            //catch (Exception ex)
            //{
            //    result.ResultStatus = -1;
            //    result.Message = ex.Message;
            //}

            //return result;
        }
Exemplo n.º 11
0
        public ResultModel UpdateBusinessInvoice(UserModel user, Operate.Model.Invoice invoice, BusinessInvoice invoiceBusiness, List<BusinessInvoiceDetail> details)
        {
            ResultModel result = new ResultModel();

            try
            {
                BusinessInvoiceDAL businessInvoiceDAL = new BusinessInvoiceDAL();
                InvoiceDAL invoiceDAL = new InvoiceDAL();
                BusinessInvoiceDetailDAL detailDAL = new BusinessInvoiceDetailDAL();
                StockReceiptDetailDAL stockReceiptDetailDAL = new StockReceiptDetailDAL();

                using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required))
                {
                    //验证发票
                    if (invoiceBusiness.BusinessInvoiceId <= 0)
                    {
                        result.Message = "发票不存在";
                        return result;
                    }

                    result = businessinvoiceDAL.Get(user, invoiceBusiness.BusinessInvoiceId);
                    if (result.ResultStatus != 0)
                        return result;

                    BusinessInvoice resultBusinessInvoice = result.ReturnValue as BusinessInvoice;
                    if (resultBusinessInvoice == null || resultBusinessInvoice.BusinessInvoiceId <= 0)
                    {
                        result.ResultStatus = -1;
                        result.Message = "发票不存在";
                        return result;
                    }

                    //更新发票
                    resultBusinessInvoice.IntegerAmount = invoiceBusiness.IntegerAmount;
                    resultBusinessInvoice.NetAmount = invoiceBusiness.NetAmount;
                    resultBusinessInvoice.VATRatio = invoiceBusiness.VATRatio;
                    resultBusinessInvoice.VATBala = invoiceBusiness.VATBala;
                    resultBusinessInvoice.UnitPrice = invoiceBusiness.UnitPrice;

                    resultBusinessInvoice.Status = StatusEnum.已录入;

                    result = businessinvoiceDAL.Update(user, resultBusinessInvoice);
                    if (result.ResultStatus != 0)
                        return result;

                    //获取发票主表
                    result = invoiceDAL.Get(user, resultBusinessInvoice.InvoiceId);
                    if (result.ResultStatus != 0)
                        return result;

                    Operate.Model.Invoice resultInvoice = result.ReturnValue as Operate.Model.Invoice;
                    if (resultInvoice == null || resultInvoice.InvoiceId <= 0)
                    {
                        result.ResultStatus = -1;
                        result.Message = "发票不存在";
                        return result;
                    }

                    //更新发票
                    resultInvoice.InvoiceDate = invoice.InvoiceDate;
                    resultInvoice.InvoiceName = invoice.InvoiceName;
                    resultInvoice.InvoiceBala = invoice.InvoiceBala;
                    resultInvoice.OutCorpId = invoice.OutCorpId;
                    resultInvoice.InCorpId = invoice.InCorpId;
                    resultInvoice.Memo = invoice.Memo;

                    result = invoiceDAL.Update(user, resultInvoice);
                    if (result.ResultStatus != 0)
                        return result;

                    //获取发票明细
                    result = detailDAL.Load(user, resultBusinessInvoice.BusinessInvoiceId);
                    if (result.ResultStatus != 0)
                        return result;

                    List<BusinessInvoiceDetail> resultDetails = result.ReturnValue as List<BusinessInvoiceDetail>;
                    if (resultDetails == null)
                    {
                        result.ResultStatus = -1;
                        result.Message = "获取发票明细失败";
                        return result;
                    }

                    //作废发票明细
                    foreach (BusinessInvoiceDetail detail in resultDetails)
                    {
                        if (detail.DetailStatus == StatusEnum.已生效)
                            detail.DetailStatus = StatusEnum.已录入;

                        result = detailDAL.Invalid(user, detail);
                        if (result.ResultStatus != 0)
                            return result;
                    }

                    //新增发票明细
                    StockLogDAL stockLogDAL = new StockLogDAL();
                    StockDAL stockDAL = new StockDAL();
                    foreach (BusinessInvoiceDetail detail in details)
                    {
                        if (detail.NetAmount != 0 && detail.StockId > 0)
                        {
                            //验证库存
                            result = stockDAL.Get(user, detail.StockId);
                            if (result.ResultStatus != 0)
                                return result;
                            Stock stock = result.ReturnValue as Stock;
                            if (stock == null || stock.StockId <= 0)
                            {
                                result.ResultStatus = -1;
                                result.Message = "发票库存获取失败";
                                return result;
                            }

                            //验证库存流水
                            result = stockLogDAL.Get(user, detail.StockLogId);
                            if (result.ResultStatus != 0)
                                return result;

                            StockLog stockLog = result.ReturnValue as StockLog;
                            if (stockLog == null || stockLog.StockLogId <= 0)
                            {
                                result.ResultStatus = -1;
                                result.Message = "新增发票流水获取失败";
                                return result;
                            }

                            //基本验证
                            if (stockLog.StockId != stock.StockId)
                            {
                                result.ResultStatus = -1;
                                result.Message = "库存与库存流水不匹配";
                                return result;
                            }

                            //验证流水合约与发票合约是否相同
                            if (stockLog.SubContractId != resultBusinessInvoice.SubContractId)
                            {
                                result.ResultStatus = -1;
                                result.Message = "合约与库存流水不匹配";
                                return result;
                            }

                            detail.DetailStatus = StatusEnum.已生效;
                            detail.InvoiceId = resultInvoice.InvoiceId;
                            detail.BusinessInvoiceId = resultBusinessInvoice.BusinessInvoiceId;
                            detail.StockId = stockLog.StockId;
                            detail.StockLogId = stockLog.StockLogId;

                            if (resultInvoice.InvoiceType == (int)InvoiceTypeEnum.SuppleFinalInvoice)
                            {
                                //获取当前流水回执信息
                                result = stockReceiptDetailDAL.LoadByStockLogId(user, stockLog.StockLogId);
                                List<StockReceiptDetail> stockReceiptDetails = result.ReturnValue as List<StockReceiptDetail>;
                                if (stockReceiptDetails == null)
                                {
                                    result.ResultStatus = -1;
                                    result.Message = "当前流水未回执,不能补零";
                                    return result;
                                }

                                decimal sumQtyMiss = stockReceiptDetails.Sum(temp => temp.QtyMiss);
                                detail.IntegerAmount = sumQtyMiss;
                                detail.NetAmount = sumQtyMiss;
                            }
                            else
                            {
                                detail.IntegerAmount = stockLog.GrossAmount;
                                detail.NetAmount = stockLog.NetAmount;
                            }

                            result = detailDAL.Insert(user, detail);
                            if (result.ResultStatus != 0)
                                return result;
                        }
                    }

                    if (result.ResultStatus == 0)
                        result.ReturnValue = resultInvoice;
                    scope.Complete();
                }
            }
            catch (Exception ex)
            {
                result.ResultStatus = -1;
                result.Message = ex.Message;
            }

            return result;
        }