public async Task <LimitTipInfo> UpdateReimbursedAmount(SimpleUser user, ChargeInfo bill) { if (String.IsNullOrEmpty(bill.ChargeId)) { return(null); } var ci = await Context.ChargeInfos.AsNoTracking().Where(c => c.ID == bill.ChargeId).FirstOrDefaultAsync(); if (ci == null) { return(null); } LimitTipInfo li = new LimitTipInfo(); li.LimitAmount = ci.ChargeAmount; var query = from c in Context.ChargeInfos.AsNoTracking() where c.ChargeId == bill.ChargeId && c.ID != bill.ID && c.IsDeleted == false select c; decimal total = await query.SumAsync(c => c.ReimbursedAmount ?? 0); List <int> status = new List <int>() { 0, 16 }; var query2 = from c in Context.ChargeInfos.AsNoTracking() where c.ChargeId == bill.ChargeId && c.ID != bill.ID && c.IsDeleted == false && status.Contains(c.Status) select c; decimal unSubmitAmount = await query2.SumAsync(c => c.ReimbursedAmount ?? 0); li.TotalAmount = total; li.UnSubmitAmount = unSubmitAmount; if ((li.TotalAmount - li.UnSubmitAmount + bill.ReimbursedAmount) > li.LimitAmount) { return(li); } else { ci.LastReimbursedTime = DateTime.Now; ci.ReimbursedAmount = li.TotalAmount - li.UnSubmitAmount + bill.ReimbursedAmount; if (ci.ReimbursedAmount == li.LimitAmount) { ci.IsReimbursed = true; } var entry = Context.ChargeInfos.Attach(ci); entry.Property(c => c.LastReimbursedTime).IsModified = true; entry.Property(c => c.ReimbursedAmount).IsModified = true; entry.Property(c => c.IsReimbursed).IsModified = true; await Context.SaveChangesAsync(); } return(li); }
public async Task <LimitTipInfo> GetLimitTip(string userId, DateTime startTime, DateTime endTime, string ignoreId) { LimitTipInfo li = new LimitTipInfo(); //限额 var s = await Context.LimitInfos.AsNoTracking().Where(x => x.UserId == userId && x.IsDeleted == false).FirstOrDefaultAsync(); if (s != null) { li.LimitAmount = s.Amount; } //已报销 var q = from c in Context.ChargeInfos.AsNoTracking() join f in Context.CostInfos.AsNoTracking() on c.ID equals f.ChargeId join d in Context.DictionaryDefine.AsNoTracking() on new { Type = f.Type.ToString(), GroupId = "CHARGE_COST_TYPE" } equals new { Type = d.Value, d.GroupId } where c.IsDeleted == false && c.CreateTime >= startTime && c.CreateTime < endTime && d.Ext1 == "1" && c.ReimburseUser == userId select new { c = c, f = f }; if (!String.IsNullOrEmpty(ignoreId)) { q = q.Where(c => c.c.ID != ignoreId); } li.TotalAmount = await q.SumAsync(f => f.f.Amount); List <int> status = new List <int>() { 0, 16 }; var q2 = from c in Context.ChargeInfos.AsNoTracking() join f in Context.CostInfos.AsNoTracking() on c.ID equals f.ChargeId join d in Context.DictionaryDefine.AsNoTracking() on new { Type = f.Type.ToString(), GroupId = "CHARGE_COST_TYPE" } equals new { Type = d.Value, d.GroupId } where c.IsDeleted == false && c.CreateTime >= startTime && c.CreateTime < endTime && d.Ext1 == "1" && status.Contains(c.Status) && c.ReimburseUser == userId select new { c = c, f = f }; if (!String.IsNullOrEmpty(ignoreId)) { q2 = q2.Where(c => c.c.ID != ignoreId); } li.UnSubmitAmount = await q2.SumAsync(f => f.f.Amount); return(li); }
public async Task <ResponseMessage <ChargeInfoResponse> > Save(UserInfo user, ChargeInfoRequest request) { ResponseMessage <ChargeInfoResponse> r = new ResponseMessage <ChargeInfoResponse>(); var hasPermission = await _permissionExpansion.HavePermission(user.Id, "FY_BXMD", request.ReimburseDepartment); if (!hasPermission) { r.Code = "403"; r.Message = "没有权限"; return(r); } if (request.FeeList == null) { request.FeeList = new List <CostInfoRequest>(); } if (request.BillList == null) { request.BillList = new List <ReceiptInfoRequest>(); } request.FeeList.ForEach(item => item.ChargeId = request.ID); request.BillList.ForEach(item => item.ChargeId = request.ID); request.BillList.ForEach(item => { if (item.FileScopes == null) { item.FileScopes = new List <FileScopeRequest>(); } item.FileScopes.ForEach(fs => { fs.ReceiptId = item.Id; if (fs.FileList == null) { fs.FileList = new List <FileInfoRequest>(); } fs.FileList.ForEach(f => { if (String.IsNullOrEmpty(f.FileExt)) { f.FileExt = System.IO.Path.GetExtension(f.Name ?? ""); } }); }); }); request.ChargeAmount = request.FeeList.Sum(x => x.Amount); request.BillAmount = request.BillList.Sum(x => x.ReceiptMoney); request.BillCount = request.BillList.Count; if (request.Status == (int)ChargeStatus.Submit) { DateTime dt = DateTime.Now; DateTime start = new DateTime(dt.Year, dt.Month, 1); DateTime end = start.AddMonths(1); LimitTipInfo ti = await _Store.GetLimitTip(request.ReimburseUser, start, end, request.ID); if (ti.LimitAmount > 0) { //费用限制 var dl = await _Store.GetDictionaryDefine("CHARGE_COST_TYPE"); decimal totalLimit = request.FeeList.Where(x => dl.Any(d => d.Value == x.Type.ToString() && d.Ext1 == "1")).Sum(x => x.Amount); decimal ybx = ti.TotalAmount - ti.UnSubmitAmount + totalLimit; if (ybx > ti.LimitAmount) { r.Code = "410"; r.Message = $"费用超出限额:可报销费用总额 {ti.LimitAmount}元,已报销:{ybx}元,超出:{ybx - ti.LimitAmount}元"; return(r); } } } using (var t = await _transaction.BeginTransaction()) { try { if (String.IsNullOrWhiteSpace(request.BranchId)) { var org = await _orgUtils.GetNearParent(request.ReimburseDepartment, orgTypes); if (org != null) { request.BranchId = org.Id; } else { request.BranchId = request.ReimburseDepartment; } } if (String.IsNullOrEmpty(request.Department)) { request.Department = user.OrganizationId; } if (String.IsNullOrWhiteSpace(request.ChargeNo)) { string prefix = await _orgUtils.GetBranchPrefix(request.BranchId, "XYH"); request.BranchPrefix = prefix; int seq = await _Store.GetChargeNo(request.BranchId, prefix, DateTime.Now, request.Type); request.Seq = seq; request.ChargeNo = String.Format("FY{0}{1}{2:D5}", prefix, DateTime.Now.ToString("yyyyMMdd"), seq); } var ci = _mapper.Map <ChargeInfo>(request); //预借款冲减 if (request.Status == (int)ChargeStatus.Submit) { if (!String.IsNullOrEmpty(request.ChargeId)) { var li = await _borrowingStore.UpdateReimbursedAmount(_mapper.Map <SimpleUser>(user), ci); decimal total = li.TotalAmount - li.UnSubmitAmount + (ci.ReimbursedAmount ?? 0); if (li.LimitAmount < total) { r.Code = "410"; r.Message = $"预借款冲减超额:预借款总金额 {li.LimitAmount}元,已报销:{total}元,超出:{total - li.LimitAmount}元"; t.Rollback(); return(r); } } } await _Store.Save(_mapper.Map <SimpleUser>(user), ci); r.Extension = _mapper.Map <ChargeInfoResponse>(ci); t.Commit(); } catch (Exception e) { t.Rollback(); throw; } } return(r); }
public async Task <ResponseMessage> Submit(UserInfo user, string id) { ResponseMessage r = new ResponseMessage(); var cit = await _Store.Get(id); if (cit == null) { r.Code = "404"; r.Message = "报销单不存在"; return(r); } bool hp = false; if (cit.CreateUser == user.Id) { hp = true; } else { hp = await _permissionExpansion.HavePermission(user.Id, PERMISSION_FYGL, cit.ReimburseDepartment); } if (!hp) { r.Code = "403"; r.Message = "没有该报销单的操作权限"; return(r); } DateTime dt = DateTime.Now; DateTime start = new DateTime(dt.Year, dt.Month, 1); DateTime end = start.AddMonths(1); LimitTipInfo ti = await _Store.GetLimitTip(cit.ReimburseUser, start, end, cit.ID); if (ti.LimitAmount > 0) { //费用限制 var bl = await _Store.GetBillList(cit.ID); decimal totalLimit = bl.Where(x => x.TypeInfo.Ext1 == "1").Sum(x => x.Amount); decimal ybx = ti.TotalAmount - ti.UnSubmitAmount + totalLimit; if (ybx > ti.LimitAmount) { r.Code = "410"; r.Message = $"费用超出限额:可报销费用总额 {ti.LimitAmount}元,已报销:{ybx}元,超出:{ybx-ti.LimitAmount}元"; return(r); } } if (!String.IsNullOrEmpty(cit.ChargeId)) { var li = await _borrowingStore.UpdateReimbursedAmount(_mapper.Map <SimpleUser>(user), cit); decimal total = li.TotalAmount - li.UnSubmitAmount + (cit.ReimbursedAmount ?? 0); if (li.LimitAmount < total) { r.Code = "410"; r.Message = $"预借款冲减超额:预借款总金额 {li.LimitAmount}元,已报销:{total}元,超出:{total - li.LimitAmount}元"; return(r); } } await _Store.UpdateStatus(_mapper.Map <SimpleUser>(user), id, (int)ChargeStatus.Submit, null, ModifyTypeEnum.Submit, ModifyTypeConstans.Submit); return(r); }