void PostCommit(RequestDataHolder holder)
        {
            _eventBus.Publish(new OnRequestStatusChangedEvent
            {
                ID        = holder.Request.ID,
                RefID     = holder.Request.RefID,
                OldStatus = holder.OldStatus,
                NewStatus = holder.NewStatus
            });

            var schemes = new List <SchemeHolder>();

            foreach (var item in holder.Request.LineItems)
            {
                var certificate = holder.Certificates?.FirstOrDefault(e => e.Scheme == item.Scheme &&
                                                                      e.SubScheme == item.SubScheme);

                if (certificate != null)
                {
                    var premise = holder.Request.Premises?.FirstOrDefault(e => e.IsPrimary);

                    if (!float.TryParse(premise?.Area, out float area))
                    {
                        area = 0f;
                    }

                    schemes.Add(new SchemeHolder
                    {
                        Scheme       = item.Scheme.Value,
                        SubScheme    = item.SubScheme,
                        NoOfProducts = certificate.Menus?.Count() ?? 0,
                        StartsFrom   = certificate.StartsFrom.Value,
                        ExpiresOn    = certificate.ExpiresOn.Value,
                        Area         = area
                    });
                }
            }

            if (schemes.Any())
            {
                _eventBus.Publish(new GenerateBillEvent
                {
                    RequestID     = holder.Request.ID,
                    RefID         = holder.Request.RefID,
                    Type          = BillType.Stage2,
                    RequestType   = holder.Request.Type,
                    CustomerID    = holder.Request.CustomerID,
                    CustomerName  = holder.Request.CustomerName,
                    Expedite      = holder.Request.Expedite,
                    Schemes       = schemes,
                    ReferenceDate = holder.Request.SubmittedOn
                });
            }
        }
        public async Task Invoke()
        {
            await new ApprovalPolicyValidator(_review, _dbContext)
            .Next(new HC02ApprovalValidator(_review, _dbContext))
            .Next(new AmmendCertificateValidator(_review, _dbContext))
            .Invoke();

            var oldStatus = _requestBasic.Status;

            var           approvedLineItems = _review.LineItems.Where(e => e.Approved.Value).ToList();
            var           approved          = approvedLineItems.Count() >= 1;
            RequestStatus newStatus         = approved ? RequestStatus.PendingMuftiAck : RequestStatus.Rejected;

            if (approved && _requestBasic.CodeID == null)
            {
                throw new BadRequestException(
                          await _dbContext.Transalation.GetTranslation(Locale.EN, "RequestApproveNoCode"));
            }

            await _dbContext.Request.InsertReview(_review);

            var logText = await _dbContext.Transalation.GetTranslation(Locale.EN,
                                                                       approved? "RequestApproved" : "RequestRejected");

            var logID = await _dbContext.Log.InsertLog(new Log
            {
                Action   = logText,
                UserID   = _review.ReviewerID.Value,
                UserName = _review.ReviewerName,
            });

            await _dbContext.Request.MapLog(_review.RequestID, logID);

            await _dbContext.Request.InsertActionHistory(new RequestActionHistory
            {
                Action    = RequestActionType.Approved,
                RequestID = _review.RequestID,
                Officer   = new Officer
                {
                    ID   = _review.ReviewerID.Value,
                    Name = _review.ReviewerName
                }
            });

            await _dbContext.Request.UpdateStatus(_review.RequestID, newStatus, null);

            IList <Certificate> certificates = null;

            if (approved)
            {
                certificates = await GenerateCertificate(approvedLineItems,
                                                         new Officer(_review.ReviewerID.Value, _review.ReviewerName));
            }

            var _holder = new RequestDataHolder()
            {
                Request      = _requestBasic,
                OldStatus    = oldStatus,
                NewStatus    = newStatus,
                Certificates = certificates
            };

            PostCommit(_holder);

            await new SyncNewIngredientSubCommand(
                _review,
                _dbContext,
                _eventBus)
            .Invoke();
        }