ncc-erp / ncc-erp-timesheet

Tool ERP-Timesheet
MIT License
4 stars 8 forks source link

#256 show project non PM #257

Closed pson-ncc closed 1 month ago

pson-ncc commented 1 month ago

Chi tiết

Project Management => Khi chọn All Projects => Show ra tất cả Project kể cả dự án đó ko có PM (hoặc để PM là Null)

Bonus: Hiển thị nếu không có member nào (hiển thị 0 members)

Arrange

Project không PM

Tạo project không có PM -> xoá/đổi role ProjectUser là PM của một Project

Change role SQL:

UPDATE local_timesheet.dbo.ProjectUsers
SET Type = 0 -- member
WHERE UserId = 51257 and ProjectId = 20264;

Validate role SQL:

Select * from ProjectUsers where UserId = 51257 and ProjectId = 20264

Validate data SQL:

-- chọn các project id sao cho số lượng pm = 0 (type PM = 1)
SELECT 
SELECT 
    p.Id, 
    COUNT(pu.Id) as memberCount,
    SUM(CASE WHEN pu.Type = 1 THEN 1 ELSE 0 END) as PMCount
FROM 
    [local_timesheet].[dbo].[Projects] as p
LEFT JOIN 
    [local_timesheet].[dbo].[ProjectUsers] as pu 
    ON p.Id = pu.ProjectId
WHERE p.IsDeleted = 0
GROUP BY p.Id
HAVING SUM(CASE WHEN pu.Type = 1 THEN 1 ELSE 0 END) = 0

Bonus: Project không member

Tạo project không có member -> xoá (mềm) toàn bộ ProjectUser của một Project

View ProjectUsers from 20272

SELECT [Id]
      ,[IsDeleted]
      ,[UserId]
      ,[ProjectId]
      ,[Type]
      ,[IsTemp]
  FROM [local_timesheet].[dbo].[ProjectUsers]
  where ProjectId = 20272

Soft delete

UPDATE local_timesheet.dbo.ProjectUsers
SET IsDeleted = 1
WHERE ProjectId = 20272;

Action

Chọn tất cả project chưa bị xoá mềm (isDeleted = 0)

SQL:

SELECT Count(*)
  FROM [local_timesheet].[dbo].[Projects] as p
  Where p.IsDeleted = 0

Validate

Việc inner join khi các điều kiện join không thoả mãn sẽ không trả về dữ liệu, mặc dù đã lấy được projects, pms, member count

//var results = (from p in projects
//               join members in projectMembers on p.Id equals members.ProjectId
//               join pm in PMs on p.Id equals pm.ProjectId
//               select new GetProjectDto
//               {
//                   CustomerName = p.CustomerName,
//                   Id = p.Id,
//                   Name = p.Name,
//                   Code = p.Code,
//                   Status = p.Status,
//                   ProjectType = p.ProjectType,
//                   Pms = pm.PMs,
//                   ActiveMember = members.Count,
//                   TimeStart = p.TimeStart,
//                   TimeEnd = p.TimeEnd
//               }).ToList();

Hướng giải quyết: sử dụng left outer join với left là project

var results = (from p in projects
              join members in projectMembers 
                    on p.Id equals members.ProjectId into projectMembersGj
              from projectMembersSubGroup in projectMembersGj.DefaultIfEmpty()
              join pms in PMs
                    on p.Id equals pms.ProjectId into projectPmsGj
              from projectPms in projectPmsGj.DefaultIfEmpty()
              select new GetProjectDto
              {
                  CustomerName = p.CustomerName,
                  Id = p.Id,
                  Name = p.Name,
                  Code = p.Code,
                  Status = p.Status,
                  ProjectType = p.ProjectType,
                  Pms = projectPms?.PMs ?? new List<string>(),
                  ActiveMember = projectMembersSubGroup?.Count ?? 0,
                  TimeStart = p.TimeStart,
                  TimeEnd = p.TimeEnd
              }).ToList();