/// <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); }
/// <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(); }
/// <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(); }
/// <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(); }