예제 #1
0
        public int AddReceipt(LineItemGroup encumbrance, User submitter, string comments)
        {
            Message msg = new Message
            {
                FromUserID  = encumbrance.LastEditedUserID,
                MessageDate = DateTime.Now
            };

            msg.Subject     = "Encumbrance Request ID " + encumbrance.GroupID; // + " for contract " + contract.ContractNumber
            msg.Body        = GetOriginatorReceipt(encumbrance);
            msg.MessageDate = DateTime.Now;
            msg.FromUserID  = submitter.UserID;
            // Save the message to the database
            try
            {
                _context.Messages.Add(msg);
                _context.SaveChanges();
                AddRecipient(msg.MessageID, submitter);
                return(msg.MessageID);
            }
            catch (Exception e)
            {
                Log.Error("MessageService.SendReceipt Error:" + e.GetBaseException() + "\n" + e.StackTrace);
                return(-1);
            }
        }
예제 #2
0
        public bool SendReceipt(LineItemGroup encumbrance, User submitter, string comments)
        {
            int msgID = AddReceipt(encumbrance, submitter, comments);

            if (submitter.CanReceiveEmails() && submitter.IsDisabled == 0)
            {
                SendEmailMessage(msgID);
                return(true);
            }
            return(false);
        }
예제 #3
0
 public bool IsShallowEncumbrance(LineItemGroup encumbrance)
 {
     // return true if encumbrance does not include child elements (i.e., LineItems)
     if (encumbrance.LineItems == null && _context.HasLineItems(encumbrance))
     {
         return(true);
     }
     if (encumbrance.OriginatorUserID > 0 && encumbrance.OriginatorUser == null)
     {
         return(true);
     }
     return(false);
 }
예제 #4
0
        public decimal GetEncumbranceTotal(LineItemGroup encumbrance)
        {
            //encumbrance is a deep copy
            decimal total = 0M;

            if (encumbrance.LineItems != null)
            {
                foreach (LineItem item in encumbrance.LineItems)
                {
                    total += item.Amount;
                }
            }
            return(total);
        }
예제 #5
0
        public LineItemGroup GetDeepEncumbrance(int groupID)
        {
            LineItemGroup encumbrance = this.LineItemGroups.AsNoTracking()
                                        .Include(l => l.LastEditedUser)
                                        .Include(l => l.OriginatorUser)
                                        .Include(l => l.Contract)
                                        .Include(l => l.FileAttachments)
                                        .Include(l => l.LineItems).ThenInclude(li => li.OCA)
                                        .Include(l => l.LineItems).ThenInclude(li => li.Category)
                                        .Include(l => l.LineItems).ThenInclude(li => li.StateProgram)
                                        .Include(l => l.LineItems).ThenInclude(li => li.Fund)
                                        .Include(l => l.Statuses).ThenInclude(gst => gst.User)
                                        .SingleOrDefault(l => l.GroupID == groupID);

            return(encumbrance);
        }
예제 #6
0
        public string GetEncumbranceInfo(LineItemGroup encumbrance, decimal encumbranceTotal)
        {
            string encumbranceInfo = "";

            encumbranceInfo += "<strong>Encumbrance Type:</strong> " + encumbrance.LineItemType + "<br />";
            encumbranceInfo += "<strong>Status:</strong> " + encumbrance.CurrentStatus + "<br />";
            encumbranceInfo += "<strong>Encumbrance Total:</strong> " + Utils.FormatCurrency(encumbranceTotal) + "<br />";
            encumbranceInfo += "<strong>Description: </strong> " + encumbrance.Description + "<br />";
            if (encumbrance.LineID6S != null && encumbrance.LineID6S != "")
            {
                encumbranceInfo += "<strong>6s:</strong> " + encumbrance.LineID6S + "<br />";
            }
            if (encumbrance.FlairAmendmentID != null && encumbrance.FlairAmendmentID != "")
            {
                encumbranceInfo += "<strong>Original FLAIR Amendment ID:</strong> " + encumbrance.FlairAmendmentID + "<br />";
            }
            if (encumbrance.UserAssignedID != null && encumbrance.UserAssignedID != "")
            {
                encumbranceInfo += "<strong>User Assigned ID:</strong> " + encumbrance.UserAssignedID + "<br />";
            }
            if (encumbrance.AmendedLineItemID != null && encumbrance.AmendedLineItemID != "")
            {
                encumbranceInfo += "<strong>Amended LOA:</strong> " + encumbrance.AmendedLineItemID + "<br />";
            }
            if (encumbrance.AmendedFlairLOAID != null && encumbrance.AmendedFlairLOAID != "")
            {
                encumbranceInfo += "<strong>Amended/Corrected FLAIR ID:</strong> " + encumbrance.AmendedFlairLOAID + "<br />";
            }
            if (encumbrance.AdvertisedDate != null)
            {
                encumbranceInfo += "<strong>Advertised Date:</strong> " + String.Format("{0:MM/dd/yyyy}", encumbrance.AdvertisedDate) + "<br />";
            }
            if (encumbrance.LettingDate != null)
            {
                encumbranceInfo += "<strong>Letting Date:</strong> " + String.Format("{0:MM/dd/yyyy}", encumbrance.LettingDate) + "<br />";
            }
            if (encumbrance.RenewalDate != null)
            {
                encumbranceInfo += "<strong>Renewal Date:</strong> " + String.Format("{0:MM/dd/yyyy}", encumbrance.RenewalDate) + "<br />";
            }
            encumbranceInfo += "<strong>Last Updated:</strong> " + String.Format("{0:MM/dd/yyyy HH:mm}", encumbrance.LastEditedDate) + " by " + encumbrance.LastEditedUser.FirstName + " " + encumbrance.LastEditedUser.LastName + "<br />";

            return(encumbranceInfo);
        }
예제 #7
0
        public IActionResult Create(int contractID, int groupID)
        {
            //string userLogin = GetLogin();
            PopulateViewBag(contractID);
            if (groupID > 0)
            {
                try
                {
                    // id is the LineItemGroup.GroupID
                    var group = _context.LineItemGroups.Where(lig => lig.GroupID == groupID).SingleOrDefault();
                    if (group == null)
                    {
                        // if it is zero or does not exist, create a new LineItemGroup and set id = its GroupID
                        LineItemGroup newGroup = new LineItemGroup(ViewBag.Contract, ViewBag.CurrentUser)
                        {
                            CurrentStatus    = ConstantStrings.Draft,
                            LastEditedUserID = ViewBag.CurrentUser.UserID,
                            OriginatorUserID = ViewBag.CurrentUser.UserID
                        };
                        _context.LineItemGroups.Add(newGroup);
                        _context.SaveChanges();

                        group = newGroup;
                    }
                    ViewBag.lineItemGroup = group;
                    ViewBag.contractID    = ViewBag.Contract.ContractID;

                    // also the View does not use this to populate a selection list yet.
                    //ViewData["FlairLineIDs"] = GetAmendmentsList(contractID);
                }
                catch (Exception e)
                {
                    _logger.LogError("LineItemsController.Create Error:" + e.GetBaseException());
                    Log.Error("LineItemsController.Create Error:" + e.GetBaseException() + "\n" + e.StackTrace);
                }
            }
            ViewBag.LineItemTypes     = ConstantStrings.GetLineItemTypeList();
            ViewBag.currentFiscalYear = PermissionsUtils.GetCurrentFiscalYear();
            ViewData["Categories"]    = _context.Categories.OrderBy(v => v.CategoryCode);
            ViewData["StatePrograms"] = _context.StatePrograms.OrderBy(v => v.ProgramCode);
            return(View());
        }
예제 #8
0
        private void UpdateContractTotal(LineItem lineItem)
        {
            // A line item has been added with LineItemType = {Award, Advertisement, New Contract}
            // Reset the parent Contract's ContractTotal value to the total of the new encumbrance
            LineItemGroup encumbrance = _context.LineItemGroups
                                        .Include(g => g.LineItems)
                                        .AsNoTracking()
                                        .SingleOrDefault(g => g.GroupID == lineItem.LineItemGroupID);

            //verify the encumbrance line item type is one of the three selected
            if (encumbrance.LineItemType.Equals(ConstantStrings.NewContract) || encumbrance.LineItemType.Equals(ConstantStrings.Award) || encumbrance.LineItemType.Equals(ConstantStrings.Advertisement))
            {
                // get the total of all LineItems in this encumbrance
                decimal sum = 0.00M;
                foreach (LineItem item in encumbrance.LineItems)
                {
                    sum += item.Amount;
                }
                Contract contract = _context.Contracts.SingleOrDefault(c => c.ContractID == encumbrance.ContractID);
                contract.ContractTotal = sum;
                _context.Contracts.Update(contract);
                _context.SaveChanges();
            }
        }
예제 #9
0
        public int AddMessage(string updateType, LineItemGroup encumbrance, string comments, List <int> otherRecipients, List <int> ccIDs)
        {
            encumbrance = _context.GetDeepEncumbrance(encumbrance.GroupID);
            int        msgID            = 0;
            List <int> recipientIDs     = null; // list of IDs of email recipients
            decimal    encumbranceTotal = 0.0M;
            //string contractViewURL = _serverpath + "/Contracts/View/" + encumbrance.ContractID + "/enc_" + encumbrance.GroupID;
            string contractViewURL = _serverpath + "/LineItemGroups/Manage/" + encumbrance.GroupID;

            encumbranceTotal = GetEncumbranceTotal(encumbrance);
            Contract contract  = _context.Contracts.SingleOrDefault(c => c.ContractID == encumbrance.ContractID);
            User     submitter = _context.Users.SingleOrDefault(u => u.UserID == encumbrance.LastEditedUserID);
            Message  msg       = new Message
            {
                FromUserID  = encumbrance.LastEditedUserID,
                MessageDate = DateTime.Now
            };

            if (!updateType.Equals(ConstantStrings.NoChange))
            {
                switch (updateType)
                {
                case ConstantStrings.DraftToFinance:
                    msg.Subject = "Encumbrance Request# " + encumbrance.GroupID + " for contract " + contract.ContractNumber + " has been submitted for Finance Review";
                    msg.Body    = "<p>Please process the following encumbrance request: ID " + encumbrance.GroupID + " for contract " + contract.ContractNumber + " in the amount of " + Utils.FormatCurrency(encumbranceTotal) + ".</p>\n";
                    if (comments != null && comments.Length > 0)
                    {
                        msg.Body += "<p>Comments: " + comments + "</p>\n";
                    }
                    if (encumbrance.FileAttachments != null && encumbrance.FileAttachments.Count > 0)
                    {
                        msg.Body += "File Attachments:<br/><ul>";
                        foreach (FileAttachment fileAtt in encumbrance.FileAttachments)
                        {
                            var fileUrl = _serverpath + "\\" + FileAttachment.UserFilesPath + "\\" + fileAtt.FileName;
                            msg.Body += "<li><a href='" + fileUrl + "'>" + fileAtt.DisplayName + "</a></li>";
                        }
                        msg.Body += "</ul>";
                    }
                    msg.Body += "<p>Review this encumbrance request in the <a href='" + contractViewURL + "'>" +
                                "EPS Application</a>.</p>";
                    // Send only to TPK Encumbrance mailbox
                    recipientIDs = getFinanceRecipients();
                    break;

                case ConstantStrings.DraftToCFM:
                    msg.Subject = "Encumbrance Request# " + encumbrance.GroupID + " for contract " + contract.ContractNumber + " for " + encumbrance.LineItemType;
                    msg.Body    = "<p>Please input the following encumbrance into CFM: request ID " + encumbrance.GroupID + " for contract " + contract.ContractNumber + ".</p>\n";
                    //msg.Body += "in the amount of " + Utils.FormatCurrency(encumbranceTotal)  + " applied to Amendment " + encumbrance.FlairAmendmentID + " Line " + encumbrance.LineID6S + ".";
                    if (encumbrance.LineItems != null && encumbrance.LineItems.Count > 0)
                    {
                        string tblText = "<table><tr><th>Contract</th><th>Amendment</th><th>Line (6s)</th><th>Amount</th></tr>";
                        foreach (LineItem item in encumbrance.LineItems)
                        {
                            tblText += "<tr><td>" + contract.ContractNumber + "</td><td>" + item.FlairAmendmentID + "</td><td>" + item.LineID6S + "</td><td>" + Utils.FormatCurrency(item.Amount) + "</td></tr>";
                        }
                        tblText  += "</table> <br/>";
                        msg.Body += tblText;
                    }
                    if (comments != null && comments.Length > 0)
                    {
                        msg.Body += "<p>Comments: " + comments + "</p>\n";
                    }
                    msg.Body += "<p>View this encumbrance request in the <a href='" + contractViewURL + "'>" +
                                "EPS Application</a>.</p>";
                    // Send only to TPK Encumbrance mailbox
                    recipientIDs = (List <int>)_context.Users.Where(u => u.Email == ConstantStrings.TPKMailbox).Select(u => u.UserID).ToList();
                    break;

                case ConstantStrings.FinanceToDraft:
                case ConstantStrings.CFMToDraft:
                case ConstantStrings.CompleteToDraft:
                    msg.Subject = "Encumbrance Request#" + encumbrance.GroupID + " for contract " + contract.ContractNumber + " has been returned to the Originator";
                    msg.Body    = "<p>Encumbrance ID " + encumbrance.GroupID + " for contract " + contract.ContractNumber + " has been returned for the following reason:</p>\n";
                    if (comments.Length > 0)
                    {
                        msg.Body += "<p>Comments: " + comments + "</p>\n";
                    }
                    msg.Body += "<p>Review this encumbrance request in the <a href='" + contractViewURL + "'>" +
                                "EPS Application</a>.</p>";
                    recipientIDs = new List <int> {
                        encumbrance.OriginatorUserID
                    };
                    break;

                case ConstantStrings.FinanceToWP:
                    msg.Subject = "Please review encumbrance request #" + encumbrance.GroupID + " for contract " + contract.ContractNumber + " for Work Program Evaluation";
                    msg.Body    = "<p>" + submitter.FullName + " has completed a Finance Review for encumbrance request #" + encumbrance.GroupID + " under contract " + contract.ContractNumber + ".</p>\n";
                    if (comments.Length > 0)
                    {
                        msg.Body += "<p>Comments: " + comments + "</p>\n";
                    }
                    msg.Body += "<p>Review this encumbrance request in the <a href='" + contractViewURL + "'>" +
                                "EPS Application</a>.</p>";
                    recipientIDs = otherRecipients;     //(List<int>)_context.UserRoles.Where(u => u.Role.Equals(ConstantStrings.WPReviewer)).Select(u => u.UserID).ToList();
                    break;

                case ConstantStrings.FinanceToCFM:
                case ConstantStrings.FinanceToComplete:
                    // No notification required. Exit without sending message
                    return(0);

                case ConstantStrings.WPToFinance:
                    msg.Subject = "Encumbrance request #" + encumbrance.GroupID + " for contract " + contract.ContractNumber + " has been returned by Work Program";
                    msg.Body    = "<p>" + submitter.FullName + " has completed a Work Program review for encumbrance request #" + encumbrance.GroupID + " under contract " + contract.ContractNumber + ".</p>\n";
                    msg.Body   += "<p>This encumbrance request is returned to Finance with the following comment:</p>";
                    if (comments.Length > 0)
                    {
                        msg.Body += "<p>Comments: " + comments + "</p>\n";
                    }
                    msg.Body += "<p>Review this encumbrance request in the <a href='" + contractViewURL + "'>" +
                                "EPS Application</a>.</p>";
                    // Send only to TPK Encumbrance mailbox
                    recipientIDs = (List <int>)_context.Users.Where(u => u.Email == ConstantStrings.TPKMailbox).Select(u => u.UserID).ToList();
                    break;

                case ConstantStrings.WPToCFM:
                    msg.Subject = "Encumbrance request #" + encumbrance.GroupID + " for contract " + contract.ContractNumber + " is ready for CFM Input";
                    msg.Body    = "<p>" + submitter.FullName + " has completed a Work Program review for encumbrance request #" + encumbrance.GroupID + " in Work Program review under contract " + contract.ContractNumber + ".</p>\n";
                    if (comments.Length > 0)
                    {
                        msg.Body += "<p>Comments: " + comments + "</p>\n";
                    }
                    msg.Body += "<p>Review this encumbrance request in the <a href='" + contractViewURL + "'>" +
                                "EPS Application</a>.</p>";
                    // Send only to TPK Encumbrance mailbox
                    recipientIDs = (List <int>)_context.Users.Where(u => u.Email == ConstantStrings.TPKMailbox).Select(u => u.UserID).ToList();
                    break;

                case ConstantStrings.CFMToFinance:
                    msg.Subject = "Encumbrance request #" + encumbrance.GroupID + " for contract " + contract.ContractNumber + " has been returned to Finance";
                    msg.Body    = "<p>" + submitter.FullName + " has returned to Encumbranc request #" + encumbrance.GroupID + " to Finance with the following comment:</p>";
                    if (comments.Length > 0)
                    {
                        msg.Body += "<p>Comments: " + comments + "</p>\n";
                    }
                    msg.Body += "<p>Review this encumbrance request in the <a href='" + contractViewURL + "'>" +
                                "EPS Application</a>.</p>";
                    // Send only to TPK Encumbrance mailbox
                    recipientIDs = (List <int>)_context.Users.Where(u => u.Email == ConstantStrings.TPKMailbox).Select(u => u.UserID).ToList();
                    break;

                case ConstantStrings.CFMToWP:
                    msg.Subject = "Please review encumbrance request #" + encumbrance.GroupID + " for contract " + contract.ContractNumber + " requires additional Work Program Review";
                    msg.Body    = "<p>" + submitter.FullName + " has returned encumbrance request #" + encumbrance.GroupID + " from CFM for additional Work Program review for contract " + contract.ContractNumber + ".</p>\n";
                    if (comments.Length > 0)
                    {
                        msg.Body += "<p>Comments: " + comments + "</p>\n";
                    }
                    msg.Body += "<p>Review this encumbrance request in the <a href='" + contractViewURL + "'>" +
                                "EPS Application</a>.</p>";
                    recipientIDs = otherRecipients;;
                    break;

                case ConstantStrings.CFMToComplete:
                    //msg.Subject = "Encumbrance request #" + encumbrance.GroupID + " for contract " + contract.ContractNumber + " has been input into CFM";
                    //msg.Body = "<p>" + submitter.FullName + " has input encumbrance request #" + encumbrance.GroupID + " for contract " + contract.ContractNumber + " into CFM.</p>\n";
                    //if (comments.Length > 0)
                    //{ msg.Body += "<p>Comments: " + comments + "</p>\n"; }
                    //msg.Body += "<p>No further action is required. You may view this encumbrance request in the <a href='" + contractViewURL + "'>" +
                    //    "EPS Application</a>.</p>";
                    //// Send only to TPK Encumbrance mailbox
                    //recipientIDs = new List<int> { submitter.UserID };
                    // No notification needed per Lorna 7/9/2019
                    return(0);

                case ConstantStrings.CloseContract:
                    msg.Subject = "Request to Close Contract #" + contract.ContractNumber;
                    msg.Body    = "<p>" + submitter.FullName + " requests closure of the contract " + contract.ContractNumber + ", closure type " + encumbrance.LineItemType + " </p>";
                    //msg.Body += "<p>Review this closure request in the <a href='" + contractViewURL + "'>" + "EPS Application</a>.</p>";
                    recipientIDs = (List <int>)_context.UserRoles.Where(u => u.Role.Equals(ConstantStrings.Closer)).Select(u => u.UserID).ToList();
                    ccIDs        = (List <int>)_context.UserRoles.Where(u => u.Role.Equals(ConstantStrings.CloserCC)).Select(u => u.UserID).ToList();
                    break;

                default:
                    // if no message then exit
                    return(0);
                }
                // Save the message to the database

                try
                {
                    _context.Messages.Add(msg);
                    _context.SaveChanges();
                    msgID = msg.MessageID;
                    if (otherRecipients != null && otherRecipients.Count > 0)
                    {
                        AddRecipients(msgID, otherRecipients);
                    }
                    else
                    {
                        AddRecipients(msgID, recipientIDs);
                    }
                    if (ccIDs != null && ccIDs.Count > 0)
                    {
                        AddCCs(msgID, ccIDs);
                    }
                }catch (Exception e)
                {
                    Log.Error("MessageService.AddMessage Error:" + e.GetBaseException() + "\n" + e.StackTrace);
                    return(-1);
                }
            }
            return(msgID);
        }
예제 #10
0
 public int AddMessage(string updateType, LineItemGroup encumbrance, string comments, List <int> otherRecipients)
 {
     return(AddMessage(updateType, encumbrance, comments, otherRecipients, null));
 }
예제 #11
0
        public string GetOriginatorReceipt(Contract contract, LineItemGroup encumbrance)
        {
            string body            = "<p>You have submitted the following encumbrance request for Finance Review in the Encumbrance Processing System application.</p><br\\>";
            string contractInfo    = "";
            string encumbranceInfo = "";
            string linesInfo       = "";
            string url             = _serverpath + "/LineItemGroups/Manage/" + encumbrance.GroupID;

            if (this.IsShallowContract(contract))
            {
                contract = _context.GetDeepContract(contract.ContractID);
            }
            if (encumbrance == null)
            {
                return(null);
            }
            else
            {
                if (this.IsShallowEncumbrance(encumbrance))
                {
                    encumbrance = _context.GetDeepEncumbrance(encumbrance.GroupID);
                }
                decimal encumbranceTotal = GetEncumbranceTotal(encumbrance);
                encumbranceInfo = GetEncumbranceInfo(encumbrance, encumbranceTotal);
                if (contract == null)
                {
                    contract = _context.GetDeepContract(encumbrance.ContractID);
                }

                // if encumbrance is populated, start with a row for contract, one row for encumbrance and include all associated Line Items
                if (encumbrance.LineItemType.Equals(ConstantStrings.NewContract) ||
                    encumbrance.LineItemType.Equals(ConstantStrings.Advertisement) ||
                    encumbrance.LineItemType.Equals(ConstantStrings.Award))
                {
                    contractInfo = GetContractInfo(contract);
                }
                else
                {
                    contractInfo += "<strong>Contract: </strong>" + contract.ContractNumber + "<br/>";
                    contractInfo += "<strong>Contract Initial Amount:</strong> " + Utils.FormatCurrency(contract.ContractTotal) + "<br/>";
                    //TODO: What other contract information should be included in the email receipt?
                }
                List <LineItem> lineItems = _context.GetDeepLineItems(encumbrance.GroupID);
                if (lineItems == null || lineItems.Count == 0)
                {
                    linesInfo += "There are no line items associated with this encumbrance.";
                }
                else
                {
                    linesInfo += GetLineItemsInfo(lineItems);
                }
            }
            if (encumbrance.FileAttachments != null && encumbrance.FileAttachments.Count > 0)
            {
                body += "File Attachments:<br/><ul>";
                foreach (FileAttachment fileAtt in encumbrance.FileAttachments)
                {
                    var fileUrl = _serverpath + "\\" + FileAttachment.UserFilesPath + "\\" + fileAtt.FileName;
                    body += "<li><a href='" + fileUrl + "'>" + fileAtt.DisplayName + "</a></li>";
                }
                body += "</ul>";
            }
            body += contractInfo + "<br/>" + encumbranceInfo + "<br/>" + linesInfo + "<br/><br/>";
            body += "You can review your encumbrance request at <a href='" + url + "'> Encumbrance " + encumbrance.GroupID + "</a>";
            return(body);
        }
예제 #12
0
        public string GetOriginatorReceipt(LineItemGroup encumbrance)
        {
            Contract contract = _context.Contracts.SingleOrDefault(c => c.ContractID == encumbrance.ContractID);

            return(GetOriginatorReceipt(contract, encumbrance));
        }
예제 #13
0
        public bool HasLineItems(LineItemGroup encumbrance)
        {
            int itemCount = this.LineItems.Where(li => li.LineItemGroupID == encumbrance.GroupID).Count();

            return(itemCount > 0);
        }