コード例 #1
0
        public async Task <IActionResult> ProcessPayroll([FromBody] ProcessPayrollInputDto request)
        {
            try
            {
                var user = await _userManager.FindByEmailFromClaimsPrinciple(HttpContext.User);

                await _payrollService.ProcessPayrollPeriod(request, user.Id);

                return(Ok());
            }
            catch
            {
                return(BadRequest(new ApiResponse(400, "Something went wrong.")));
            }
        }
コード例 #2
0
 public GetSchedulerByUserAndCampaignSpecification(ProcessPayrollInputDto request, int campaignId)
     : base(x =>
            (x.UserProfileId == request.EmployeeId) &&
            (x.CampaignId == campaignId) &&
            (
                (x.Date.HasValue || (x.Date.Value >= request.StartDate && x.Date.Value <= request.EndDate)) ||
                (x.DateMessage1.HasValue || (x.DateMessage1.Value >= request.StartDate && x.DateMessage1.Value <= request.EndDate)) ||
                (x.DateMessage2.HasValue || (x.DateMessage2.Value >= request.StartDate && x.DateMessage2.Value <= request.EndDate)) ||
                (x.DateMessage3.HasValue || (x.DateMessage3.Value >= request.StartDate && x.DateMessage3.Value <= request.EndDate)) ||
                (x.DateMessage4.HasValue || (x.DateMessage4.Value >= request.StartDate && x.DateMessage4.Value <= request.EndDate)) ||
                (x.DateMessage5.HasValue || (x.DateMessage5.Value >= request.StartDate && x.DateMessage5.Value <= request.EndDate))
            )
            )
 {
 }
コード例 #3
0
        public async Task ProcessPayrollPeriod(ProcessPayrollInputDto request, Guid userId)
        {
            if (request.EmployeeId.HasValue)
            {
                if (request.EmployeeId.Value > 0)
                {
                    var campaignAssignmentSpecs = new GetCampaignAssignmentByUserProfileIdSpecification(request.EmployeeId.Value);
                    var campaignAssignment      = await _unitOfWork.Repository <CampaignAssignment>().GetEntityWithSpec(campaignAssignmentSpecs);

                    var schedulerSpecs = new GetSchedulerByUserAndCampaignSpecification(request, campaignAssignment.CampaignId);
                    var schedulers     = await _unitOfWork.Repository <Scheduler>().ListAsync(schedulerSpecs);

                    //Process attendance
                    var attendance = schedulers.Select(s => new
                    {
                        CampaignId    = campaignAssignment.CampaignId,
                        UserProfileId = campaignAssignment.UserProfileId,
                        Points        =
                            ((schedulers.Where(x => x.Date == s.Date).FirstOrDefault()) != null ? 1 : 0) +
                            ((schedulers.Where(x => x.DateMessage1 == s.DateMessage1).Select(s => s.DateMessage1).FirstOrDefault()) != null ? 1 : 0) +
                            ((schedulers.Where(x => x.DateMessage2 == s.DateMessage2).Select(s => s.DateMessage2).FirstOrDefault()) != null ? 1 : 0) +
                            ((schedulers.Where(x => x.DateMessage3 == s.DateMessage3).Select(s => s.DateMessage3).FirstOrDefault()) != null ? 1 : 0) +
                            ((schedulers.Where(x => x.DateMessage4 == s.DateMessage4).Select(s => s.DateMessage4).FirstOrDefault()) != null ? 1 : 0) +
                            ((schedulers.Where(x => x.DateMessage5 == s.DateMessage5).Select(s => s.DateMessage5).FirstOrDefault()) != null ? 1 : 0)
                    }).ToList();

                    //Delete current payroll record for the period
                    var deleteCurrentPayrollSpecs = new GetPayrollForPeriodByUserSpecification(campaignAssignment.UserProfileId, campaignAssignment.CampaignId, request.StartDate, request.EndDate);

                    var payrollRecord = await _unitOfWork.Repository <Payroll>().GetEntityWithSpec(deleteCurrentPayrollSpecs);

                    if (payrollRecord != null)
                    {
                        _unitOfWork.Repository <Payroll>().Delete(payrollRecord);
                        await _unitOfWork.Complete();
                    }

                    var payrollRequest = new Payroll
                    {
                        CampaignId         = campaignAssignment.CampaignId,
                        UserProfileId      = campaignAssignment.UserProfileId,
                        CreatedDate        = DateTime.UtcNow,
                        CreatedBy          = userId.ToString(),
                        DaysActive         = (attendance.Select(s => s.Points).Sum()) / 100,
                        StartDate          = request.StartDate,
                        EndDate            = request.EndDate,
                        IncentiveAmount    = 0,
                        IncentiveCount     = 0,
                        ApptSalesIncentive = 0,
                        BasePayAdjustment  = 0,
                        IncentiveType      = (int)IncentiveType.None,
                        IsCancelled        = false,
                        OtherIncentive     = 0,
                        ReferralIncentive  = 0,
                        RepliesInceentive  = 0,
                        SubTotal           = 0,
                        Total = 0,
                        Wage  = (await _unitOfWork.Repository <UserProfile>().GetByIdAsync(campaignAssignment.UserProfileId)).Wage
                    };

                    _unitOfWork.Repository <Payroll>().Add(payrollRequest);
                    await _unitOfWork.Complete();
                }
                else
                {
                    var userProfiles = await _unitOfWork.Repository <UserProfile>().ListAllAsync();

                    foreach (var profile in userProfiles)
                    {
                        var campaignAssignmentSpecs = new GetCampaignAssignmentByUserProfileIdSpecification(profile.id);
                        var campaignAssignment      = await _unitOfWork.Repository <CampaignAssignment>().GetEntityWithSpec(campaignAssignmentSpecs);

                        request.EmployeeId = profile.id;
                        var schedulerSpecs = new GetSchedulerByUserAndCampaignSpecification(request, campaignAssignment.CampaignId);
                        var schedulers     = await _unitOfWork.Repository <Scheduler>().ListAsync(schedulerSpecs);

                        //Process attendance
                        var attendance = schedulers.Select(s => new
                        {
                            CampaignId    = campaignAssignment.CampaignId,
                            UserProfileId = campaignAssignment.UserProfileId,
                            Points        =
                                ((schedulers.Where(x => x.Date == s.Date).FirstOrDefault()) != null ? 1 : 0) +
                                ((schedulers.Where(x => x.DateMessage1 == s.DateMessage1).Select(s => s.DateMessage1).FirstOrDefault()) != null ? 1 : 0) +
                                ((schedulers.Where(x => x.DateMessage2 == s.DateMessage2).Select(s => s.DateMessage2).FirstOrDefault()) != null ? 1 : 0) +
                                ((schedulers.Where(x => x.DateMessage3 == s.DateMessage3).Select(s => s.DateMessage3).FirstOrDefault()) != null ? 1 : 0) +
                                ((schedulers.Where(x => x.DateMessage4 == s.DateMessage4).Select(s => s.DateMessage4).FirstOrDefault()) != null ? 1 : 0) +
                                ((schedulers.Where(x => x.DateMessage5 == s.DateMessage5).Select(s => s.DateMessage5).FirstOrDefault()) != null ? 1 : 0)
                        }).ToList();

                        //Delete current payroll record for the period
                        var deleteCurrentPayrollSpecs = new GetPayrollForPeriodByUserSpecification(campaignAssignment.UserProfileId, campaignAssignment.CampaignId, request.StartDate, request.EndDate);

                        var payrollRecord = await _unitOfWork.Repository <Payroll>().GetEntityWithSpec(deleteCurrentPayrollSpecs);

                        if (payrollRecord != null)
                        {
                            _unitOfWork.Repository <Payroll>().Delete(payrollRecord);
                            await _unitOfWork.Complete();
                        }

                        var payrollRequest = new Payroll
                        {
                            CampaignId         = campaignAssignment.CampaignId,
                            UserProfileId      = campaignAssignment.UserProfileId,
                            CreatedDate        = DateTime.UtcNow,
                            CreatedBy          = userId.ToString(),
                            DaysActive         = (attendance.Select(s => s.Points).Sum()) / 100,
                            StartDate          = request.StartDate,
                            EndDate            = request.EndDate,
                            IncentiveAmount    = 0,
                            IncentiveCount     = 0,
                            ApptSalesIncentive = 0,
                            BasePayAdjustment  = 0,
                            IncentiveType      = (int)IncentiveType.None,
                            IsCancelled        = false,
                            OtherIncentive     = 0,
                            ReferralIncentive  = 0,
                            RepliesInceentive  = 0,
                            SubTotal           = 0,
                            Total = 0,
                            Wage  = (await _unitOfWork.Repository <UserProfile>().GetByIdAsync(campaignAssignment.UserProfileId)).Wage
                        };

                        _unitOfWork.Repository <Payroll>().Add(payrollRequest);
                        await _unitOfWork.Complete();
                    }
                }
            }
            else
            {
                var userProfiles = await _unitOfWork.Repository <UserProfile>().ListAllAsync();

                foreach (var profile in userProfiles)
                {
                    var campaignAssignmentSpecs = new GetCampaignAssignmentByUserProfileIdSpecification(profile.id);
                    var campaignAssignment      = await _unitOfWork.Repository <CampaignAssignment>().GetEntityWithSpec(campaignAssignmentSpecs);

                    request.EmployeeId = profile.id;
                    var schedulerSpecs = new GetSchedulerByUserAndCampaignSpecification(request, campaignAssignment.CampaignId);
                    var schedulers     = await _unitOfWork.Repository <Scheduler>().ListAsync(schedulerSpecs);

                    //Process attendance
                    var attendance = schedulers.Select(s => new
                    {
                        CampaignId    = campaignAssignment.CampaignId,
                        UserProfileId = campaignAssignment.UserProfileId,
                        Points        =
                            ((schedulers.Where(x => x.Date == s.Date).FirstOrDefault()) != null ? 1 : 0) +
                            ((schedulers.Where(x => x.DateMessage1 == s.DateMessage1).Select(s => s.DateMessage1).FirstOrDefault()) != null ? 1 : 0) +
                            ((schedulers.Where(x => x.DateMessage2 == s.DateMessage2).Select(s => s.DateMessage2).FirstOrDefault()) != null ? 1 : 0) +
                            ((schedulers.Where(x => x.DateMessage3 == s.DateMessage3).Select(s => s.DateMessage3).FirstOrDefault()) != null ? 1 : 0) +
                            ((schedulers.Where(x => x.DateMessage4 == s.DateMessage4).Select(s => s.DateMessage4).FirstOrDefault()) != null ? 1 : 0) +
                            ((schedulers.Where(x => x.DateMessage5 == s.DateMessage5).Select(s => s.DateMessage5).FirstOrDefault()) != null ? 1 : 0)
                    }).ToList();

                    //Delete current payroll record for the period
                    var deleteCurrentPayrollSpecs = new GetPayrollForPeriodByUserSpecification(campaignAssignment.UserProfileId, campaignAssignment.CampaignId, request.StartDate, request.EndDate);

                    var payrollRecord = await _unitOfWork.Repository <Payroll>().GetEntityWithSpec(deleteCurrentPayrollSpecs);

                    if (payrollRecord != null)
                    {
                        _unitOfWork.Repository <Payroll>().Delete(payrollRecord);
                        await _unitOfWork.Complete();
                    }

                    var payrollRequest = new Payroll
                    {
                        CampaignId         = campaignAssignment.CampaignId,
                        UserProfileId      = campaignAssignment.UserProfileId,
                        CreatedDate        = DateTime.UtcNow,
                        CreatedBy          = userId.ToString(),
                        DaysActive         = (attendance.Select(s => s.Points).Sum()) / 100,
                        StartDate          = request.StartDate,
                        EndDate            = request.EndDate,
                        IncentiveAmount    = 0,
                        IncentiveCount     = 0,
                        ApptSalesIncentive = 0,
                        BasePayAdjustment  = 0,
                        IncentiveType      = (int)IncentiveType.None,
                        IsCancelled        = false,
                        OtherIncentive     = 0,
                        ReferralIncentive  = 0,
                        RepliesInceentive  = 0,
                        SubTotal           = 0,
                        Total = 0,
                        Wage  = (await _unitOfWork.Repository <UserProfile>().GetByIdAsync(campaignAssignment.UserProfileId)).Wage
                    };

                    _unitOfWork.Repository <Payroll>().Add(payrollRequest);
                    await _unitOfWork.Complete();
                }
            }
        }