Example #1
0
        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);
        }