/// <summary>
        /// 开票
        /// </summary>
        public void Submit()
        {
            var user           = Formula.FormulaHelper.GetUserInfo();
            var marketEntities = this.GetMarketContext();

            var receipt = marketEntities.Set <S_C_Receipt>().Find(this.ReceiptID);

            if (receipt == null)
            {
                throw new Formula.Exceptions.BusinessException("未找到ID为【" + this.ReceiptID + "】的收款项,无法完成补开流程");
            }
            if (this.State != InvoiceApplyState.Wait.ToString())
            {
                throw new Formula.Exceptions.BusinessException("只能对流程通过且未进行开票动作的发票进行开票操作");
            }
            var invoice = new S_C_Invoice();

            marketEntities.S_C_Invoice.Add(invoice);
            invoice.PayerUnitIDName = this.PayerUnitName;
            invoice.PayerUnit       = this.PayerUnitName;
            invoice.PayerUnitID     = this.PayerUnit;
            invoice.Amount          = Convert.ToDecimal(this.Amount);
            var customerInfo = marketEntities.S_F_Customer.FirstOrDefault(c => c.ID == this.PayerUnit);

            if (customerInfo == null)
            {
                throw new Formula.Exceptions.BusinessValidationException("没有找到指定的客户信息,无法开票");
            }
            invoice.CustomerFullID     = customerInfo.FullID;
            invoice.ContractInfoID     = this.Contract;
            invoice.InvoiceType        = this.InvoiceType;
            invoice.InvoiceDate        = DateTime.Now;
            invoice.CreateDate         = DateTime.Now;
            invoice.CreateUser         = user.UserName;
            invoice.CreateUserID       = user.UserID;
            invoice.InvoiceMaker       = user.UserName;
            invoice.InvoiceCode        = this.InvoiceCode;
            invoice.InvoiceMakerID     = user.UserID;
            invoice.InvoiceMakerIDName = user.UserName;
            invoice.BankName           = this.BankName;
            invoice.BankAccount        = this.BankAccount;
            invoice.TaxAccount         = this.TaxAccount;
            invoice.InvoiceName        = this.InvoiceName;
            invoice.TaxRate            = this.TaxRate;
            invoice.ClearAmount        = this.ClearValue;
            invoice.TaxesAmount        = this.TaxValue;
            invoice.TaxName            = this.TaxName;
            invoice.State = InvoiceState.Normal.ToString();
            invoice.Save();
            foreach (var item in this.T_C_InvoiceMakeUpApply_Detail.ToList())
            {
                var relationValue = item.ApplyInvoiceAmount.HasValue ? item.ApplyInvoiceAmount.Value : 0;
                invoice.RelateToReceiptObject(item.PlanReceiptID, relationValue);
            }

            this.State = InvoiceApplyState.Complete.ToString();
            receipt.RelateToInvoice(invoice);
        }
Beispiel #2
0
        /// <summary>
        /// 开票
        /// </summary>
        public void Submit()
        {
            var user           = Formula.FormulaHelper.GetUserInfo();
            var marketEntities = this.GetMarketContext();

            if (this.State != InvoiceApplyState.Wait.ToString())
            {
                throw new Formula.Exceptions.BusinessException("只能对流程通过且未进行开票动作的发票进行开票操作");
            }
            var invoice = new S_C_Invoice();

            marketEntities.S_C_Invoice.Add(invoice);
            invoice.ID = this.ID;
            invoice.PayerUnitIDName = this.PayerUnitName;
            invoice.PayerUnit       = this.PayerUnitName;
            invoice.PayerUnitID     = this.PayerUnit;
            invoice.Amount          = -Convert.ToDecimal(this.Amount);//红冲票对应收款为相反数
            var customerInfo = marketEntities.S_F_Customer.FirstOrDefault(c => c.ID == this.PayerUnit);

            if (customerInfo == null)
            {
                throw new Formula.Exceptions.BusinessValidationException("没有找到指定的客户信息,无法开票");
            }
            invoice.CustomerFullID     = customerInfo.FullID;
            invoice.ContractInfoID     = this.Contract;
            invoice.InvoiceDate        = DateTime.Now;
            invoice.CreateDate         = DateTime.Now;
            invoice.CreateUser         = user.UserName;
            invoice.CreateUserID       = user.UserID;
            invoice.InvoiceMaker       = user.UserName;
            invoice.InvoiceCode        = this.InvoiceCode;
            invoice.InvoiceType        = Market.Logic.InvoiceType.CreditNote.ToString();
            invoice.InvoiceMakerID     = user.UserID;
            invoice.InvoiceMakerIDName = user.UserName;
            invoice.TaxRate            = this.TaxRate;
            invoice.BankName           = this.BankName;
            invoice.BankAccount        = this.BankAccount;
            invoice.TaxAccount         = this.TaxAccount;
            invoice.InvoiceName        = this.InvoiceName;
            invoice.State = InvoiceState.Normal.ToString();
            invoice.Save();//  invoice.Amount = -Convert.ToDecimal(this.Amount);//红冲票对应收款为相反数 save没问题!


            foreach (var item in this.T_C_CreditNoteApply_Detail.ToList())
            {
                var relationValue = item.CreditValue.HasValue ? item.CreditValue.Value : 0;
                var entities      = this.GetMarketContext();
                var plan          = entities.S_C_ManageContract_ReceiptObj.SingleOrDefault(d => d.ID == item.PlanReceiptID);
                if (plan == null)
                {
                    throw new Formula.Exceptions.BusinessException("未能找到ID为【" + item.PlanReceiptID + "】的计划收款对象,无法进行关联操作");
                }

                RelateToReceiptObject(invoice, plan, relationValue);
            }
            this.State = InvoiceApplyState.Complete.ToString();
        }
Beispiel #3
0
        /// <summary>
        /// 将发票对象关联到计划收款对象
        /// </summary>
        /// <param name="receiptObj">计划收款对象</param>
        /// <param name="relateValue">关联金额(默认为0,当为0时,且offset为false,关联金额自动等于计划收款金额。当默认为0,且offset为true,关联金额则取发票和计划收款的金额小的金额)</param>
        /// <param name="offSet">是否冲销关联</param>
        public void RelateToReceiptObject(S_C_Invoice invoice, S_C_ManageContract_ReceiptObj receiptObj, decimal relateValue = 0, bool offSet = false)
        {
            var marketEntites = invoice.GetMarketContext();

            marketEntites.S_C_Invoice_ReceiptObject.Delete(d => d.ReceiptObjectID == receiptObj.ID && d.S_C_InvoiceID == invoice.ID);
            var relation = marketEntites.S_C_Invoice_ReceiptObject.Create();

            relation.ID              = FormulaHelper.CreateGuid();
            relation.S_C_InvoiceID   = invoice.ID;
            relation.ReceiptObjectID = receiptObj.ID;
            relation.ContractInfoID  = invoice.ContractInfoID;
            relation.ModifyDate      = DateTime.Now;
            var userInfo = FormulaHelper.GetUserInfo();

            relation.ModifyUserName = userInfo.UserName;
            relation.ModifyUserID   = userInfo.UserID;
            relation.S_C_Invoice    = invoice;
            if (relateValue == 0)
            {
                relateValue = Convert.ToDecimal(receiptObj.ReceiptValue);
            }

            //if (!offSet)
            {
                if (relateValue > this.Amount)//不用invoice.Amount因为invoice.Amount已经是负数
                {
                    throw new Formula.Exceptions.BusinessException("收款对应到发票的金额,不能高于发票金额");
                }

                if (relateValue > receiptObj.FactInvoiceValue)
                {
                    throw new Formula.Exceptions.BusinessException("【" + receiptObj.Name + "】对应到发票的金额,不能高于已开票金额");
                }
            }
            //else
            //{
            //    if (relateValue > receiptObj.ReceiptValue)
            //        relateValue = Convert.ToDecimal(receiptObj.ReceiptValue);
            //    if (relateValue > this.Amount)
            //        relateValue = Convert.ToDecimal(this.Amount);
            //}

            relation.RelationValue = -relateValue;
            marketEntites.S_C_Invoice_ReceiptObject.Add(relation);
            receiptObj.SummaryInvoiceValue();
        }
Beispiel #4
0
        /// <summary>
        /// 将收款对象关联到发票对象
        /// </summary>
        /// <param name="invoice">发票对象</param>
        /// <param name="relateValue">关联金额(默认为0,当为0时,且offset为false,关联金额自动等于收款金额。当默认为0,且offset为true,关联金额则取发票和收款的金额小的金额)</param>
        /// <param name="offSet">是否冲销关联</param>
        public void RelateToInvoice(S_C_Invoice invoice, decimal relateValue = 0, bool offSet = false)
        {
            if (relateValue == 0)
            {
                relateValue = Convert.ToDecimal(invoice.MaxReceiptWriteOff);
            }

            //是否是以冲销帐方式来关联发票与收款的关系
            //如果不以冲销帐来关联,则关联金额不允许大于开票金额,也不允许大于收款金额
            //如果是以冲销帐方式来关联则根据小金额来关联发票
            if (!offSet)
            {
                if (relateValue > invoice.MaxReceiptWriteOff)
                {
                    throw new Formula.Exceptions.BusinessException("收款对应到发票的金额,不能高于发票可冲销金额【" + invoice.MaxReceiptWriteOff + "】");
                }
                if (relateValue > this.MaxInvoiceWriteoff)
                {
                    relateValue = this.MaxInvoiceWriteoff;
                }
            }
            else
            {
                if (relateValue > invoice.MaxReceiptWriteOff)
                {
                    relateValue = Convert.ToDecimal(invoice.MaxReceiptWriteOff);
                }
                if (relateValue > this.MaxInvoiceWriteoff)
                {
                    relateValue = Convert.ToDecimal(this.MaxInvoiceWriteoff);
                }
                if (this.MaxInvoiceWriteoff <= 0)
                {
                    throw new Formula.Exceptions.BusinessException("收款可对账金额【" + this.MaxInvoiceWriteoff + "】小于等于0,无法再次进行对账");
                }
                if (invoice.MaxReceiptWriteOff <= 0)
                {
                    throw new Formula.Exceptions.BusinessException("发票可对账金额【" + invoice.MaxReceiptWriteOff + "】小于等于0,无法再次进行对账");
                }
            }
            if (relateValue <= 0)
            {
                return;
            }
            var marketEntities = this.GetMarketContext();
            var relation       = this.S_C_InvoiceReceiptRelation.FirstOrDefault(d => d.InvoiceID == invoice.ID);

            if (relation == null)
            {
                relation                = marketEntities.S_C_InvoiceReceiptRelation.Create();
                relation.ID             = FormulaHelper.CreateGuid();
                relation.InvoiceID      = invoice.ID;
                relation.ReceiptID      = this.ID;
                relation.ContractInfoID = this.ContractInfoID;
                marketEntities.S_C_InvoiceReceiptRelation.Add(relation);
            }
            relation.RelationValue += relateValue;
            if (this.ContractInfoID != invoice.ContractInfoID)
            {
                throw new Formula.Exceptions.BusinessException("非同一合同下的发票和收款不能进行关联");
            }
            if (invoice.S_C_ManageContract == null)
            {
                throw new Formula.Exceptions.BusinessException("对冲的发票未绑定合同信息,无法进行关联");
            }
            invoice.S_C_ManageContract.SummaryContractData();
        }