public async Task <UpdateKycStatusErrorCode> UpdateKycInfoAsync(KycInformation model)
        {
            if (model.KycStatus == KycStatus.Rejected && string.IsNullOrEmpty(model.Comment))
            {
                return(UpdateKycStatusErrorCode.CommentRequired);
            }

            var current = await _kycInformationRepository.GetByPartnerId(model.PartnerId);

            if (current == null)
            {
                return(UpdateKycStatusErrorCode.KycDoesNotExist);
            }

            model.Timestamp = DateTime.UtcNow;

            switch (current.KycStatus)
            {
            case KycStatus.Pending when model.KycStatus != KycStatus.InReview:
                return(UpdateKycStatusErrorCode.InvalidStatus);

            case KycStatus.InReview when model.KycStatus != KycStatus.Accepted && model.KycStatus != KycStatus.Rejected && model.KycStatus != KycStatus.RequiresData:
                return(UpdateKycStatusErrorCode.InvalidStatus);

            case KycStatus.Rejected when model.KycStatus != KycStatus.InReview:
                return(UpdateKycStatusErrorCode.InvalidStatus);

            case KycStatus.Rejected when model.KycStatus == KycStatus.InReview:
                _log.Warning("Returning KYC from Rejected to InReview", context: model);
                break;

            case KycStatus.Accepted when model.KycStatus != KycStatus.InReview:
                return(UpdateKycStatusErrorCode.InvalidStatus);

            case KycStatus.Accepted when model.KycStatus == KycStatus.InReview:
                _log.Warning("Returning KYC from Accepted to InReview", context: model);
                break;

            case KycStatus.RequiresData when model.KycStatus != KycStatus.InReview:
                return(UpdateKycStatusErrorCode.InvalidStatus);
            }

            await _kycInformationRepository.UpdateAsync(model);

            return(UpdateKycStatusErrorCode.None);
        }
Esempio n. 2
0
        public async Task <UpdateKycStatusErrorCode> UpdateKycInfoAsync(KycInformation model)
        {
            if (model.KycStatus == KycStatus.Rejected && string.IsNullOrEmpty(model.Comment))
            {
                return(UpdateKycStatusErrorCode.CommentRequired);
            }

            var current = await _kycInformationRepository.GetByPartnerId(model.PartnerId);

            if (current == null)
            {
                return(UpdateKycStatusErrorCode.KycDoesNotExist);
            }

            model.Timestamp = DateTime.UtcNow;

            switch (current.KycStatus)
            {
            case KycStatus.Pending when model.KycStatus != KycStatus.InReview:
                return(UpdateKycStatusErrorCode.InvalidStatus);

            case KycStatus.InReview when model.KycStatus != KycStatus.Accepted && model.KycStatus != KycStatus.Rejected && model.KycStatus != KycStatus.RequiresData:
                return(UpdateKycStatusErrorCode.InvalidStatus);

            case KycStatus.Rejected when model.KycStatus != KycStatus.InReview:
                return(UpdateKycStatusErrorCode.InvalidStatus);

            case KycStatus.Rejected when model.KycStatus == KycStatus.InReview:
                _log.Warning("Returning KYC from Rejected to InReview", context: model);
                break;

            case KycStatus.Accepted when model.KycStatus != KycStatus.InReview:
                return(UpdateKycStatusErrorCode.InvalidStatus);

            case KycStatus.Accepted when model.KycStatus == KycStatus.InReview:
                _log.Warning("Returning KYC from Accepted to InReview", context: model);
                break;

            case KycStatus.RequiresData when model.KycStatus != KycStatus.InReview:
                return(UpdateKycStatusErrorCode.InvalidStatus);
            }

            await _kycInformationRepository.UpdateAsync(model);

            if (model.KycStatus != KycStatus.Accepted && model.KycStatus != KycStatus.Rejected)
            {
                return(UpdateKycStatusErrorCode.None);
            }

            var partner = await _partnerManagementClient.Partners.GetByIdAsync(model.PartnerId);

            if (partner == null)
            {
                _log.Warning("Missing partner when trying to send KYC notification", context: model.PartnerId);
                return(UpdateKycStatusErrorCode.None);
            }

            var admin = await _adminManagementClient.AdminsApi.GetByIdAsync(
                new GetAdminByIdRequestModel { AdminUserId = partner.CreatedBy.ToString() });

            if (admin.Error != AdminUserResponseErrorCodes.None || admin.Profile == null)
            {
                _log.Warning("Missing admin when trying to send KYC notification", context: new { PartnerAdminId = partner.CreatedBy });
                return(UpdateKycStatusErrorCode.None);
            }

            if (model.KycStatus == KycStatus.Accepted)
            {
                await _notificationsService.NotifyKycApprovedAsync(admin.Profile.AdminUserId,
                                                                   admin.Profile.Email,
                                                                   admin.Profile.FirstName, partner.Name);
            }
            else
            {
                await _notificationsService.NotifyKycRejectedAsync(admin.Profile.AdminUserId,
                                                                   admin.Profile.Email, admin.Profile.FirstName, partner.Name, model.Comment);
            }

            return(UpdateKycStatusErrorCode.None);
        }