示例#1
0
        public override Hash CreateProposal(CreateProposalInput input)
        {
            // check authorization of proposer public key
            var organization = State.Organisations[input.OrganizationAddress];

            Assert(organization != null, "No registered organization.");
            AssertSenderIsAuthorizedProposer(organization);
            Hash hash     = Hash.FromMessage(input);
            var  proposal = new ProposalInfo
            {
                ContractMethodName  = input.ContractMethodName,
                ExpiredTime         = input.ExpiredTime,
                Params              = input.Params,
                ToAddress           = input.ToAddress,
                OrganizationAddress = input.OrganizationAddress,
                ProposalId          = hash,
                Proposer            = Context.Sender
            };

            Assert(Validate(proposal), "Invalid proposal.");
            //TODO: Proposals with the same input is not supported.
            Assert(State.Proposals[hash] == null, "Proposal already exists.");
            State.Proposals[hash] = proposal;
            return(hash);
        }
示例#2
0
        public ProposalInfoReturn GetProposalInfo(SvcHdr svcHdr, AppHdr appHdr, ProposalInfo appBody)
        {
            ProposalInfoReturn svcReturn = new ProposalInfoReturn();

            svcReturn.SvcHdr.RCODE = "F";

            try
            {
                ProposalBonusEntity Proposal = new ProposalBonusEntity();
                Proposal.ResetForSearch();
                Proposal.SqlCustomer = "  and CreateDate between '" + appBody.Startime.ToString() + "' and '" + appBody.Endtime.ToString() + "' ";
                Proposal.PageSize    = 0;
                List <ProposalBonusEntity> list = Proposal.ToList <ProposalBonusEntity>();
                foreach (var obj in list)
                {
                    ProposalInfoReturn.ProposalInfoBodyObj tmp = new ProposalInfoReturn.ProposalInfoBodyObj();
                    StringUtil.SetObjectPro(obj, tmp);
                    svcReturn.AppBody.ListProposalInfo.Add(tmp);
                }
                svcReturn.AppBody.DataSetXml = StringUtil.ConvertDataSetToXML(Proposal.Dt.DataSet);

                svcReturn.AppBody.RecordCount = Proposal.RecordCount;
                svcReturn.SvcHdr.RCODE        = "S";
            }
            catch (Exception ex)
            {
                svcReturn.SvcHdr.RDESC = ex.Message;
            }


            //StringUtil.SetObjectPro(obj, tmp);
            return(svcReturn);
        }
示例#3
0
        private bool IsReleaseThresholdReached(ProposalInfo proposal, Organization organization)
        {
            var proposalReleaseThreshold = organization.ProposalReleaseThreshold;
            var enoughVote = proposal.RejectionCount.Add(proposal.AbstentionCount).Add(proposal.ApprovalCount) >=
                             proposalReleaseThreshold.MinimalVoteThreshold;

            if (!enoughVote)
            {
                return(false);
            }

            var isRejected = proposal.RejectionCount > proposalReleaseThreshold.MaximalRejectionThreshold;

            if (isRejected)
            {
                return(false);
            }

            var isAbstained = proposal.AbstentionCount > proposalReleaseThreshold.MaximalAbstentionThreshold;

            if (isAbstained)
            {
                return(false);
            }

            return(proposal.ApprovalCount >= proposalReleaseThreshold.MinimalApprovalThreshold);
        }
示例#4
0
        private Hash CreateNewProposal(CreateProposalInput input)
        {
            Hash proposalId = Hash.FromTwoHashes(Hash.FromTwoHashes(Hash.FromMessage(input), Context.TransactionId),
                                                 Hash.FromRawBytes(Context.CurrentBlockTime.ToByteArray()));

            Assert(State.Proposals[proposalId] == null, "Proposal already exists.");
            var proposal = new ProposalInfo
            {
                ContractMethodName     = input.ContractMethodName,
                ToAddress              = input.ToAddress,
                ExpiredTime            = input.ExpiredTime,
                Params                 = input.Params,
                OrganizationAddress    = input.OrganizationAddress,
                Proposer               = Context.Sender,
                ProposalDescriptionUrl = input.ProposalDescriptionUrl
            };

            Assert(Validate(proposal), "Invalid proposal.");
            State.Proposals[proposalId] = proposal;
            Context.Fire(new ProposalCreated {
                ProposalId = proposalId
            });

            return(proposalId);
        }
        private Hash CreateNewProposal(CreateProposalInput input)
        {
            Hash proposalId = GenerateProposalId(input);
            var  proposal   = new ProposalInfo
            {
                ContractMethodName     = input.ContractMethodName,
                ExpiredTime            = input.ExpiredTime,
                Params                 = input.Params,
                ToAddress              = input.ToAddress,
                OrganizationAddress    = input.OrganizationAddress,
                ProposalId             = proposalId,
                Proposer               = Context.Sender,
                ProposalDescriptionUrl = input.ProposalDescriptionUrl
            };

            Assert(Validate(proposal), "Invalid proposal.");
            Assert(State.Proposals[proposalId] == null, "Proposal already exists.");
            State.Proposals[proposalId] = proposal;
            Context.Fire(new ProposalCreated
            {
                ProposalId          = proposalId,
                OrganizationAddress = input.OrganizationAddress
            });
            return(proposalId);
        }
示例#6
0
        // GET: /ProposalInfo/View/1
        //Social Service, Replication ...
        public ActionResult ReportByGrantType(int?id)
        {
            if (!id.HasValue)
            {
                return(RedirectToAction("Index"));
            }

            //Reports Generated Here...
            //report(id.Value);
            //---------------------

            //LEFT COLUMN. REPPERs
            IEnumerable <ReportPeriodListR> reps = budservice.GetFinPeriods(id.Value);

            //RIGHT COLUMN PAYMENTS.
            List <BudgetPaymentReport> _bpayrep = report(id.Value);
            ProposalInfo propInfo = projservice.GetProposalInfoOnly(id.Value);
            ProjectInfo  projinfo = projservice.GetProjInfoOnly(id.Value);

            //(List<BudgetPaymentReport> _bpayrep, ProposalInfo _propInfo, ProjectInfo _projInfo)
            FinReportsByGrantTypeView finrepbygranttype = new FinReportsByGrantTypeView(_bpayrep, propInfo, projinfo);

            finrepbygranttype.InflateReport();

            ViewData["finrepbygranttype"] = finrepbygranttype;

            //   ViewData["PaymentReports"] = report(id.Value);



            return(View());
        }
示例#7
0
        private bool IsProposalRejected(ProposalInfo proposal, Organization organization)
        {
            var rejectionMemberCount =
                proposal.Rejections.Count(organization.OrganizationMemberList.Contains);

            return(rejectionMemberCount > organization.ProposalReleaseThreshold.MaximalRejectionThreshold);
        }
示例#8
0
        public override Hash CreateProposal(CreateProposalInput input)
        {
            var organization = State.Organisations[input.OrganizationAddress];

            Assert(organization != null, "No registered organization.");
            AssertSenderIsAuthorizedProposer(organization);

            Hash hash     = Hash.FromTwoHashes(Hash.FromMessage(input), Context.TransactionId);
            var  proposal = new ProposalInfo
            {
                ContractMethodName  = input.ContractMethodName,
                ExpiredTime         = input.ExpiredTime,
                Params              = input.Params,
                ToAddress           = input.ToAddress,
                OrganizationAddress = input.OrganizationAddress,
                ProposalId          = hash,
                Proposer            = Context.Sender
            };

            Assert(Validate(proposal), "Invalid proposal.");
            Assert(State.Proposals[hash] == null, "Proposal already exists.");
            State.Proposals[hash] = proposal;
            Context.Fire(new ProposalCreated {
                ProposalId = hash
            });

            return(hash);
        }
示例#9
0
        public ActionMessage createProposal(ProposalInfo _Proposal, string _userI)
        {
            ActionMessage        ret           = new ActionMessage();
            SqlConnectionFactory sqlConnection = new SqlConnectionFactory();

            using (SqlConnection connection = sqlConnection.GetConnection())
            {
                try
                {
                    int    year           = DateTime.Now.Year;
                    int    maxPropCode    = ProposalDataLayer.GetInstance().GetMaxPropCode(connection, year);
                    string departmentCode = DepartmentDataLayer.GetInstance().GetDepartmentCodeById(connection, _Proposal.DepartmentID);

                    _Proposal.ProposalCode = departmentCode + year.ToString() + maxPropCode;
                    ret.id = ProposalDataLayer.GetInstance().InsertProposal(connection, _Proposal, _userI);
                    ProposalDataLayer.GetInstance().UpdateMaxCode(connection, maxPropCode, year);
                    ret.isSuccess = true;
                }
                catch (Exception ex)
                {
                    ret.isSuccess     = false;
                    ret.err.msgCode   = "Internal Error";
                    ret.err.msgString = ex.Message;
                }
            }
            return(ret);
        }
示例#10
0
        private void AssertProposalNotYetVotedBySender(ProposalInfo proposal, Address sender)
        {
            var isAlreadyVoted = proposal.Approvals.Contains(sender) || proposal.Rejections.Contains(sender) ||
                                 proposal.Abstentions.Contains(sender);

            Assert(!isAlreadyVoted, "Sender already voted.");
        }
        public ProposalRepository()
        {
            sqlcmd   = SqlFactory.MSSQL();
            prop     = new Proposal();
            propinfo = new ProposalInfo();

            // ...MoreComing.
        }
示例#12
0
        private bool Validate(ProposalInfo proposal)
        {
            var validDestinationAddress    = proposal.ToAddress != null;
            var validDestinationMethodName = !string.IsNullOrWhiteSpace(proposal.ContractMethodName);
            var validExpiredTime           = proposal.ExpiredTime != null && Context.CurrentBlockTime < proposal.ExpiredTime;

            return(validDestinationAddress && validDestinationMethodName && validExpiredTime);
        }
示例#13
0
        private bool IsProposalAbstained(ProposalInfo proposal, Organization organization,
                                         ICollection <Address> parliamentMembers)
        {
            var abstentionMemberCount = proposal.Abstentions.Count(parliamentMembers.Contains);

            return(abstentionMemberCount * AbstractVoteTotal >
                   organization.ProposalReleaseThreshold.MaximalAbstentionThreshold * parliamentMembers.Count);
        }
示例#14
0
        private bool Validate(ProposalInfo proposal)
        {
            var validDestinationAddress    = proposal.ToAddress != null;
            var validDestinationMethodName = !string.IsNullOrWhiteSpace(proposal.ContractMethodName);
            var validExpiredTime           = CheckProposalNotExpired(proposal);
            var hasOrganizationAddress     = proposal.OrganizationAddress != null;

            return(validDestinationAddress && validDestinationMethodName && validExpiredTime && hasOrganizationAddress);
        }
示例#15
0
        private bool IsReadyToRelease(ProposalInfo proposal, Organization organization,
                                      IEnumerable <Address> representatives)
        {
            var validApprovalWeights = proposal.ApprovedRepresentatives.Aggregate(0,
                                                                                  (weights, address) =>
                                                                                  weights + (representatives.FirstOrDefault(r => r.Equals(address)) == null ? 0 : 1));

            return(validApprovalWeights * 10000 >= organization.ReleaseThreshold * representatives.Count());
        }
示例#16
0
        private bool IsVoteThresholdReached(ProposalInfo proposal, Organization organization,
                                            ICollection <Address> parliamentMembers)
        {
            var isVoteThresholdReached =
                proposal.Abstentions.Concat(proposal.Approvals).Concat(proposal.Rejections)
                .Count(parliamentMembers.Contains) * AbstractVoteTotal >=
                organization.ProposalReleaseThreshold.MinimalVoteThreshold * parliamentMembers.Count;

            return(isVoteThresholdReached);
        }
示例#17
0
        private bool Validate(ProposalInfo proposal)
        {
            if (proposal.ToAddress == null || string.IsNullOrWhiteSpace(proposal.ContractMethodName) ||
                !ValidateDescriptionUrlScheme(proposal.ProposalDescriptionUrl))
            {
                return(false);
            }

            return(proposal.ExpiredTime != null && Context.CurrentBlockTime < proposal.ExpiredTime);
        }
示例#18
0
        private bool IsReleaseThresholdReached(ProposalInfo proposal, Organization organization,
                                               IEnumerable <Address> currentRepresentatives)
        {
            var currentParliament = new HashSet <Address>(currentRepresentatives);
            var approvalsCollectedFromCurrentParliament =
                proposal.ApprovedRepresentatives.Count(a => currentParliament.Contains(a));

            // approved >= (threshold/max) * representativeCount
            return(approvalsCollectedFromCurrentParliament * MaxThreshold >=
                   organization.ReleaseThreshold * currentParliament.Count);
        }
示例#19
0
        public ProposalInfo getProposalbyId(int _ID, string _userID)
        {
            SqlConnectionFactory sqlConnection = new SqlConnectionFactory();

            using (SqlConnection connection = sqlConnection.GetConnection())
            {
                List <ProposalInfo> ListProposal = ProposalDataLayer.GetInstance().GetAllProposal(connection, _userID);
                ProposalInfo        findProposal = ListProposal.Where(i => i.ProposalID == _ID).First();
                return(findProposal);
            }
        }
示例#20
0
        public ProposalInfo GetDetail(string id)
        {
            SqlConnectionFactory sqlConnection = new SqlConnectionFactory();
            ProposalInfo         record        = new ProposalInfo();

            using (SqlConnection connection = sqlConnection.GetConnection())
            {
                //record = PracticeDataLayer.GetInstance().GetUser(connection, id);

                return(null);
            }
        }
示例#21
0
        private bool IsReleaseThresholdReached(ProposalInfo proposal, Organization organization)
        {
            var isRejected = IsProposalRejected(proposal, organization);

            if (isRejected)
            {
                return(false);
            }

            var isAbstained = IsProposalAbstained(proposal, organization);

            return(!isAbstained && CheckEnoughVoteAndApprovals(proposal, organization));
        }
示例#22
0
        public async Task <ActionMessage> Put(int id, [FromForm] ProposalInfo _proposal, [FromForm] List <IFormFile> files)
        {
            ActionMessage ret = new ActionMessage();

            ret.isSuccess = true;
            try
            {
                ret = ProposalService.GetInstance().editProposal(id, _proposal, GetUserId());
                //update list file
                //ProposalService.GetInstance().DelteDocument(id.ToString());
                if (ret.isSuccess == false)
                {
                    return(ret);
                }
                //++edit item
                ret = ProposalService.GetInstance().EditItems(id, _proposal.Items);
                if (ret.isSuccess == false)
                {
                    return(ret);
                }


                //++EDIT document
                //delete old document
                DocumentService.GetInstance().DeleteDocumentsNotExitsInList(_proposal.Documents, TableFile.Proposal.ToString(), id);
                //add new document
                foreach (var item in files)
                {
                    DocumentInfo documentInfo = new DocumentInfo();
                    documentInfo.TableName = TableFile.Proposal.ToString();
                    documentInfo.PreferId  = id.ToString();
                    documentInfo.FileName  = item.FileName;
                    documentInfo.Link      = DateTime.Now.ToString("yyMMddHHmmssfff") + "-" + Utils.ChuyenTVKhongDau(item.FileName);
                    documentInfo.Length    = item.Length.ToString();
                    documentInfo.Type      = item.ContentType;
                    ret = await FilesHelpers.UploadFile(TableFile.Proposal.ToString(), _proposal.ProposalID.ToString(), item, documentInfo.Link);

                    DocumentService.GetInstance().InsertDocument(documentInfo, GetUserId());
                }
                //--EDIT document
            }
            catch (Exception ex)
            {
                ret.isSuccess     = false;
                ret.err.msgCode   = "Internal Error !!!";
                ret.err.msgString = ex.ToString();
            }
            return(ret);
        }
示例#23
0
        public async Task <ActionMessage> PostwithAttFile([FromForm] ProposalInfo propsalObj, [FromForm] List <IFormFile> files)
        {
            ActionMessage ret     = new ActionMessage();
            int           insetId = -1;

            try
            {
                ret.isSuccess = true;
                insetId       = ProposalService.GetInstance().createProposal2(propsalObj, GetUserId());
                if (insetId > -1)
                {
                    // upload file
                    //ret = await FilesHelpers.UploadFiles("proposal", insetId.ToString(), files);
                    // update list file
                    ret = ProposalService.GetInstance().insertItems(insetId, propsalObj.Items, propsalObj.DateIn, propsalObj.DepartmentID);
                    if (ret.isSuccess == false)
                    {
                        return(ret);
                    }
                    foreach (var item in files)
                    {
                        DocumentInfo documentInfo = new DocumentInfo();
                        documentInfo.TableName = TableFile.Proposal.ToString();
                        documentInfo.PreferId  = insetId.ToString();
                        documentInfo.Link      = DateTime.Now.ToString("yyMMddHHmmssfff") + "-" + Utils.ChuyenTVKhongDau(item.FileName);
                        documentInfo.FileName  = item.FileName;
                        documentInfo.Length    = item.Length.ToString();
                        documentInfo.Type      = item.ContentType;
                        ret = await FilesHelpers.UploadFile(TableFile.Proposal.ToString(), insetId.ToString(), item, documentInfo.Link);

                        DocumentService.GetInstance().InsertDocument(documentInfo, GetUserId());
                    }
                }
                else
                {
                    ret.isSuccess     = false;
                    ret.err.msgCode   = "lỗi thêm proposal";
                    ret.err.msgString = "lỗi thêm proposal";
                }
            }
            catch (Exception ex)
            {
                ret.isSuccess     = false;
                ret.err.msgCode   = "Internal Error !!!";
                ret.err.msgString = ex.ToString();
            }
            return(ret);
        }
示例#24
0
        public ActionMessage Put(int id, [FromForm] ProposalInfo _proposal)
        {
            ActionMessage ret = new ActionMessage();

            try
            {
                ret = ProposalService.GetInstance().editProposal(id, _proposal, GetUserId());
            }
            catch (Exception ex)
            {
                ret.isSuccess     = false;
                ret.err.msgCode   = "Internal Error !!!";
                ret.err.msgString = ex.ToString();
            }
            return(ret);
        }
示例#25
0
        public ActionMessage Post([FromBody] ProposalInfo _proposal)
        {
            ActionMessage ret = new ActionMessage();

            try
            {
                string user = GetUserId();
                ret = ProposalService.GetInstance().createProposal(_proposal, user);
            }
            catch (Exception ex)
            {
                ret.isSuccess     = false;
                ret.err.msgCode   = "Internal Error !!!";
                ret.err.msgString = ex.ToString();
            }
            return(ret);
        }/*
示例#26
0
        private bool CheckEnoughVoteAndApprovals(ProposalInfo proposal, Organization organization,
                                                 ICollection <Address> parliamentMembers)
        {
            var approvedMemberCount = proposal.Approvals.Count(parliamentMembers.Contains);
            var isApprovalEnough    = approvedMemberCount * AbstractVoteTotal >=
                                      organization.ProposalReleaseThreshold.MinimalApprovalThreshold *
                                      parliamentMembers.Count;

            if (!isApprovalEnough)
            {
                return(false);
            }

            var isVoteThresholdReached = IsVoteThresholdReached(proposal, organization, parliamentMembers);

            return(isVoteThresholdReached);
        }
示例#27
0
        private bool CheckEnoughVoteAndApprovals(ProposalInfo proposal, Organization organization)
        {
            var approvedMemberCount = proposal.Approvals.Count(organization.OrganizationMemberList.Contains);
            var isApprovalEnough    =
                approvedMemberCount >= organization.ProposalReleaseThreshold.MinimalApprovalThreshold;

            if (!isApprovalEnough)
            {
                return(false);
            }

            var isVoteThresholdReached =
                proposal.Abstentions.Concat(proposal.Approvals).Concat(proposal.Rejections).Count() >=
                organization.ProposalReleaseThreshold.MinimalVoteThreshold;

            return(isVoteThresholdReached);
        }
示例#28
0
        private bool IsProposalStillPending(ProposalInfo proposal, Organization organization,
                                            ICollection <Address> parliamentMembers)
        {
            var isRejected = IsProposalRejected(proposal, organization, parliamentMembers);

            if (isRejected)
            {
                return(false);
            }

            var isAbstained = IsProposalAbstained(proposal, organization, parliamentMembers);

            if (isAbstained)
            {
                return(false);
            }

            return(!CheckEnoughVoteAndApprovals(proposal, organization, parliamentMembers));
        }
示例#29
0
        private bool IsReleaseThresholdReached(ProposalInfo proposal, Organization organization)
        {
            var parliamentMembers = GetCurrentMinerList();
            var isRejected        = IsProposalRejected(proposal, organization, parliamentMembers);

            if (isRejected)
            {
                return(false);
            }

            var isAbstained = IsProposalAbstained(proposal, organization, parliamentMembers);

            if (isAbstained)
            {
                return(false);
            }

            return(CheckEnoughVoteAndApprovals(proposal, organization, parliamentMembers));
        }
示例#30
0
        public int createProposal2(ProposalInfo _Proposal, string _userI)
        {
            int ret = -1;



            SqlConnectionFactory sqlConnection = new SqlConnectionFactory();

            using (SqlConnection connection = sqlConnection.GetConnection())
            {
                try
                {
                    int    year           = DateTime.Now.Year;
                    int    maxPropCode    = ProposalDataLayer.GetInstance().GetMaxPropCode(connection, year);
                    string departmentCode = DepartmentDataLayer.GetInstance().GetDepartmentCodeById(connection, _Proposal.DepartmentID);

                    _Proposal.ProposalCode = departmentCode + year.ToString() + maxPropCode.ToString().PadLeft(4, '0');
                    UserLogInfo info = new UserLogInfo();
                    info.Action      = "Insert";
                    info.Description = "ngày : " + _Proposal.DateIn + " khoa/phòng chịu trách nhiệm ID " + _Proposal.CurDepartmentID + " code " + _Proposal.ProposalCode
                                       + " khoa phòng đề xuất ID : " + _Proposal.DepartmentID + " trạng thái : " + _Proposal.Status;
                    info.Feature  = TableFile.Proposal.ToString();
                    info.Time     = DateTime.Now;
                    info.UserName = _userI;
                    info.UserID   = 1;
                    UserService.GetInstance().TrackUserAction(info);

                    ret = ProposalDataLayer.GetInstance().InsertProposal(connection, _Proposal, _userI);
                    ProposalDataLayer.GetInstance().UpdateMaxCode(connection, maxPropCode, year);

                    //   ret.isSuccess = true;
                }
                catch (Exception ex)
                {
                    throw ex;
                }
            }
            return(ret);
        }