farzinmonsef / tk1

0 stars 0 forks source link

Latest #13

Open farzinmonsef opened 3 years ago

farzinmonsef commented 3 years ago

Mylatest

farzinmonsef commented 3 years ago

Trans.cshtml

@using Entitites @using EQM.Enumerations; @{ViewBag.Title = "Transactions"; }

@*style="background-color:#e8e8e8;border:1px;border-color:darkgray;"*@   

@(Html.Kendo().Grid() .Name("transactiongrid") .Columns(columns => { columns.Command(command => { command.Edit().CancelText("Cancel").UpdateText("Submit").Text("Edit"); }).Hidden(); columns.Bound(c => c.Id) .HeaderTemplate(@IDID) .Filterable(filterable => filterable.UI("integerFilter")).Width(79); columns.Bound(c => c.CategoryTypeObject.Name).Title("Category").Width(130); columns.Bound(c => c.TransactionTypeObject.Name).Title("Transaction Type").Width(175); columns.Bound(c => c.EntryDate).Format("{0: MM/dd/yyyy}").Width(150); columns.Bound(c => c.TransactionEffectiveDate).Format("{0: MM/dd/yyyy}").Width(160); columns.Bound(c => c.StatusType.Name).Title("Status").Width(60); columns.Template(@) .ClientTemplate(@"#if (FileName!= null) {# Attach  #} else {# #=''# #}#") .Title("Attach").Width(70); columns.Command(command => command.Custom("Edit") .Text(" Edit") .HtmlAttributes(new { @class = "btn k-grid-edit btnEditTransaction" }) ) .HeaderTemplate(@Edit) .Width(90).Title(" "); columns.Command(command => command.Custom("Preview Letter") .HtmlAttributes(new { @class = "btn k-button k-grid-customCommand btnPreviewLetter" }) .Click("showPreview") ) .HeaderTemplate(@Preview) .Width(158).Title(" ").Hidden(!((int)Session["userRole"] == (int)RoleType.Administrator)); columns.Command(command => command.Custom("Delete") .Text("Delete") .HtmlAttributes(new { @class = "btn btndeleteTransaction btndeleteActive" }) .Click("deleteTransactionconfirm") ) .HeaderTemplate(@Delete) .Width(75).Title(" "); }) .Groupable(g => g.Enabled(true)) .ColumnMenu() .Pageable(pageable => pageable .Refresh(true) .PageSizes(true) .ButtonCount(5) .PageSizes(new string[] {"10", "20", "50", "100", "All"}) ) .Navigatable() .Reorderable(reordering => reordering.Columns(true)) .Selectable(selectable => selectable .Mode(GridSelectionMode.Multiple) .Type(GridSelectionType.Row)) .ClientDetailTemplateId("template") .Sortable(sortable => { sortable.SortMode(GridSortMode.SingleColumn); }) .Filterable(f => f.Operators( o => o.ForString( s => s.Clear() .Contains("Contains") .DoesNotContain("Does not contain") .IsEqualTo("Is equal to") .IsNotEqualTo("Is not equal to") .StartsWith("Starts with") .EndsWith("Ends with") ) )) .Editable(ed => ed.Mode(GridEditMode.PopUp) .DisplayDeleteConfirmation(false) .TemplateName("_EditTransaction") .Window(w => w.Title("Add/Edit Transaction") .Width(1050) .Scrollable(false) .Name("EditTransaction") ) ) .Events(events => { events.DataBound("onTransactionDataBound"); events.Change("onTransactionChange"); events.Edit("onTransactionEdit"); events.Cancel("onTransactionCancel"); events.Save("onTransactionSave"); events.DetailExpand("onTransactionDetailExpand"); events.DetailCollapse("onTransactionDetailCollapse"); events.ColumnReorder("onTransactionColumnReorder"); }) .Resizable(resize => resize.Columns(true)) .ToolBar(o => o.Custom().Action("Excel_Export_Save", "Transaction", new {page = "~", pageSize = "~", filter = "~", sort = "~"}).Name("Export Data").Text("Export").HtmlAttributes(new { @class = "CustomCommand" })) .Excel(excel => excel .FileName("TransactionList.xlsx") .AllPages(true)) .DataSource("dataSourceTransaction") )

@(Html.Kendo().Window() .Name("windowPreview") .Title("Preview Letter") .Modal(true) .Visible(false) .Content(@


[BOA-Logo]
Equity Management Communication

[Title]

To: [To]
From: [From]
 
Under the terms of the Bank of America Key 2003 Employee Equity Plan, we instruct you as follows:
[Title]
♦  Requisition Number: [RequisitionNumber]
♦  Effective Date: [TransactionEffectiveDate]
♦  Debit: [ReserveName]
♦  Debit Shares: [TotalVestedShares]
♦  Credit: Restricted Stock Account for Stock Plan Participants
♦  Credit Shares: [TotalVestedShares]
 
 
Approved By: [Approved]
Corporate Title: [CorporateTitle]
 
Prepared by: [Prepared]
Date: [EntryDate]
 
Bank of America N.A. Member FDIC © [LetterYear] Bank of America Corporation. All rights reserved
 
                     <p style="text-align: center; padding: 50px">
                         <input type="button" class="k-button" name="cancelemailLetter" value="Cancel" onclick="cancelemailLetter()">
                         <input type="button" class="k-button k-primary" name="emailLetter" value="Send Email to Computershare" onclick="emailLetter()">&nbsp;&nbsp;&nbsp;
                     </p>
                  </text>)
        .Draggable()
        .Resizable()
        .Width(800)
        .Actions(actions => actions.Pin().Minimize().Maximize().Close())
        .Events(ev => ev.Close("onWindowClose"))
        )
farzinmonsef commented 3 years ago

hsaresBalance.cshtml

@using Entitites @model SharesBalanceReport @{ ViewBag.Title = "SharesBalance"; Layout = "~/Views/Shared/_Layout.cshtml"; }

@section styles{ <link rel="stylesheet" href="@Href("~/PageStyles/SharesBalances.css")" /> }

@using (Html.BeginForm("SharesBalance", "Report")) {
Filter by Date Range
@(Html.Kendo().DatePickerFor(m => m.StartDate).Name("StartDate").HtmlAttributes(new { @class = "filter -field" }).ARIATemplate("Report Start Date")) to @(Html.Kendo().DatePickerFor(m => m.EndDate).Name("EndDate").HtmlAttributes(new { @class = "filter-field" }).ARIATemplate("Report End Date"))
    
}
@foreach (var planType in Model.ReportData.Select(m => m.PlanTypeId).Distinct()) { var childModel = Model.ReportData.Where(d => d.PlanTypeId == planType).OrderBy(m => m.ReportDisplayOrder).ThenBy(m => m.PlanName).ToList(); @Html.Partial("_PlanBalanceGrid", childModel) }
farzinmonsef commented 3 years ago

_EditTrans.cshtml

@model Entitites.Transaction @{ ViewBag.Title = "Edit Transaction"; }

@@using (Html.BeginForm(null, null, FormMethod.Post, new { @class = "formclass" }))@ @using (Html.BeginForm(null, null, FormMethod.Post, null)) { @Html.AntiForgeryToken() @Html.ValidationSummary(true, "", new { @class = "text-danger" })

@Html.LabelFor(model => model.CategoryId, htmlAttributes: new { @class = "control-label" })
@Html.EditorFor(model => model.CategoryId, new { htmlAttributes = new { @class = "form-control" } }) @Html.ValidationMessageFor(model => model.CategoryId, "", new { @class = "text-danger" })
@Html.LabelFor(model => model.Id, htmlAttributes: new { @class = "control-label" })  : 
@Html.EditorFor(model => model.Id, new { htmlAttributes = new { @class = "form-control" } })
@Html.LabelFor(model => model.TransactionType, htmlAttributes: new { @class = "control-label" })
@Html.EditorFor(model => model.TransactionType, new { htmlAttributes = new { @class = "form-control" } }) @Html.ValidationMessageFor(model => model.TransactionType, "", new { @class = "text-danger" })
@Html.LabelFor(model => model.EntryDate, htmlAttributes: new { @class = "control-label" })
@Html.EditorFor(model => model.EntryDate, new { htmlAttributes = new { @class = "form-control" } }) @Html.ValidationMessageFor(model => model.EntryDate, "", new { @class = "text-danger" })
@Html.LabelFor(model => model.TransactionEffectiveDate, htmlAttributes: new { @class = "control-label " })
@Html.EditorFor(model => model.TransactionEffectiveDate, new { htmlAttributes = new { @class = "form-control" } }) @Html.ValidationMessageFor(model => model.TransactionEffectiveDate, "", new { @class = "text-danger" })
@Html.LabelFor(model => model.RequisitionNumber, htmlAttributes: new { @class = "control-label " })
@Html.EditorFor(model => model.RequisitionNumber, new { htmlAttributes = new { @class = "form-control" } }) @Html.ValidationMessageFor(model => model.RequisitionNumber, "", new { @class = "text-danger" })
@Html.LabelFor(model => model.BrokerName, htmlAttributes: new { @class = "control-label " })
@Html.EditorFor(model => model.BrokerName, new { htmlAttributes = new { @class = "form-control" } }) @Html.ValidationMessageFor(model => model.BrokerName, "", new { @class = "text-danger" })
@Html.LabelFor(model => model.PlanNameId, htmlAttributes: new { @class = "control-label" })
@Html.EditorFor(model => model.PlanNameId, new { htmlAttributes = new { @class = "form-control" } }) @Html.ValidationMessageFor(model => model.PlanNameId, "", new { @class = "text-danger" })
@Html.LabelFor(model => model.SharesForTax, htmlAttributes: new { @class = "control-label" })
@Html.EditorFor(model => model.SharesForTax, new { htmlAttributes = new { @class = "form-control" } }) @Html.ValidationMessageFor(model => model.SharesForTax, "", new { @class = "text-danger" })
@Html.LabelFor(model => model.TotalVestedShares, htmlAttributes: new { @class = "control-label" })
@Html.EditorFor(model => model.TotalVestedShares, new { htmlAttributes = new { @class = "form-control" } }) @Html.ValidationMessageFor(model => model.TotalVestedShares, "", new { @class = "text-danger" })
@Html.LabelFor(model => model.ValueOfTaxShares, htmlAttributes: new { @class = "control-label" })
@Html.EditorFor(model => model.ValueOfTaxShares, new { htmlAttributes = new { @class = "form-control" } }) @Html.ValidationMessageFor(model => model.ValueOfTaxShares, "", new { @class = "text-danger" })
@Html.LabelFor(model => model.DirectorName, htmlAttributes: new { @class = "control-label" })
@Html.EditorFor(model => model.DirectorName, new { htmlAttributes = new { @class = "form-control" } }) @Html.ValidationMessageFor(model => model.DirectorName, "", new { @class = "text-danger" })
@Html.LabelFor(model => model.NetSharesToMerrillLynch, htmlAttributes: new { @class = "control-label" })
@Html.EditorFor(model => model.NetSharesToMerrillLynch, new { htmlAttributes = new { @class = "form-control" } }) @Html.ValidationMessageFor(model => model.NetSharesToMerrillLynch, "", new { @class = "text-danger" })
@Html.LabelFor(model => model.TotalShares, htmlAttributes: new { @class = "control-label" })
@Html.EditorFor(model => model.TotalShares, new { htmlAttributes = new { @class = "form-control" } }) @Html.ValidationMessageFor(model => model.TotalShares, "", new { @class = "text-danger" })
@Html.LabelFor(model => model.DTCParticipantNumber, htmlAttributes: new { @class = "control-label" })
@Html.EditorFor(model => model.DTCParticipantNumber, new { htmlAttributes = new { @class = "form-control" } }) @Html.ValidationMessageFor(model => model.DTCParticipantNumber, "", new { @class = "text-danger" })
@Html.LabelFor(model => model.DispositionOfShares, htmlAttributes: new { @class = "control-label" })
@Html.EditorFor(model => model.DispositionOfShares, new { htmlAttributes = new { @class = "form-control" } }) @Html.ValidationMessageFor(model => model.DispositionOfShares, "", new { @class = "text-danger" })
@Html.LabelFor(model => model.AccountNameId, htmlAttributes: new { @class = "control-label" })
@Html.EditorFor(model => model.AccountNameId, new { htmlAttributes = new { @class = "form-control" } }) @Html.ValidationMessageFor(model => model.AccountNameId, "", new { @class = "text-danger" })
@Html.LabelFor(model => model.TotalTreasurySharestoRetire, htmlAttributes: new { @class = "control-label" })
@Html.EditorFor(model => model.TotalTreasurySharestoRetire, new { htmlAttributes = new { @class = "form-control" } }) @Html.ValidationMessageFor(model => model.TotalTreasurySharestoRetire, "", new { @class = "text-danger" })
@Html.LabelFor(model => model.GrossStockUnitsDistributed, htmlAttributes: new { @class = "control-label" })
@Html.EditorFor(model => model.GrossStockUnitsDistributed, new { htmlAttributes = new { @class = "form-control" } }) @Html.ValidationMessageFor(model => model.GrossStockUnitsDistributed, "", new { @class = "text-danger" })
@Html.LabelFor(model => model.NetStockUnitSharestoDistribute, htmlAttributes: new { @class = "control-label" })
@Html.EditorFor(model => model.NetStockUnitSharestoDistribute, new { htmlAttributes = new { @class = "form-control" } }) @Html.ValidationMessageFor(model => model.NetStockUnitSharestoDistribute, "", new { @class = "text-danger" })
@Html.LabelFor(model => model.CommonRestrictedUnvestedSharesGranted, htmlAttributes: new { @class = "control-label" })
@Html.EditorFor(model => model.CommonRestrictedUnvestedSharesGranted, new { htmlAttributes = new { @class = "form-control" } }) @Html.ValidationMessageFor(model => model.CommonRestrictedUnvestedSharesGranted, "", new { @class = "text-danger" })
@Html.LabelFor(model => model.CommonRestrictedUnvestedSharesFROMCR1, htmlAttributes: new { @class = "control-label" })
@Html.EditorFor(model => model.CommonRestrictedUnvestedSharesFROMCR1, new { htmlAttributes = new { @class = "form-control" } }) @Html.ValidationMessageFor(model => model.CommonRestrictedUnvestedSharesFROMCR1, "", new { @class = "text-danger" })
@Html.LabelFor(model => model.CancelandRetireShares, htmlAttributes: new { @class = "control-label" })
@Html.EditorFor(model => model.CancelandRetireShares, new { htmlAttributes = new { @class = "form-control" } }) @Html.ValidationMessageFor(model => model.CancelandRetireShares, "", new { @class = "text-danger" })
@Html.LabelFor(model => model.CommonRestrictedShareINTOCR2, htmlAttributes: new { @class = "control-label" })
@Html.EditorFor(model => model.CommonRestrictedShareINTOCR2, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.CommonRestrictedShareINTOCR2, "", new { @class = "text-danger" })
@Html.LabelFor(model => model.CommonRestrictedUnvestedSharesINTOCR1, htmlAttributes: new { @class = "control-label" })
@Html.EditorFor(model => model.CommonRestrictedUnvestedSharesINTOCR1, new { htmlAttributes = new { @class = "form-control" } }) @Html.ValidationMessageFor(model => model.CommonRestrictedUnvestedSharesINTOCR1, "", new { @class = "text-danger" })
@Html.LabelFor(model => model.TreasuryAccountShares, htmlAttributes: new { @class = "control-label" })
@Html.EditorFor(model => model.TreasuryAccountShares, new { htmlAttributes = new { @class = "form-control" } }) @Html.ValidationMessageFor(model => model.TreasuryAccountShares, "", new { @class = "text-danger" })
@Html.LabelFor(model => model.AcquisitionPricePerShare, htmlAttributes: new { @class = "control-label" })
@Html.EditorFor(model => model.AcquisitionPricePerShare, new { htmlAttributes = new { @class = "form-control" } }) @Html.ValidationMessageFor(model => model.AcquisitionPricePerShare, "", new { @class = "text-danger" })
@Html.LabelFor(model => model.CommissionPerShare, htmlAttributes: new { @class = "control-label" })
@Html.EditorFor(model => model.CommissionPerShare, new { htmlAttributes = new { @class = "form-control" } }) @Html.ValidationMessageFor(model => model.CommissionPerShare, "", new { @class = "text-danger" })
@Html.LabelFor(model => model.CostOfTotalTreasuryShares, htmlAttributes: new { @class = "control-label" })
@Html.EditorFor(model => model.CostOfTotalTreasuryShares, new { htmlAttributes = new { @class = "form-control" } }) @Html.ValidationMessageFor(model => model.CostOfTotalTreasuryShares, "", new { @class = "text-danger" })
@Html.LabelFor(model => model.PreferredSharesNameId, htmlAttributes: new { @class = "control-label" })
@Html.EditorFor(model => model.PreferredSharesNameId, new { htmlAttributes = new { @class = "form-control" } }) @Html.ValidationMessageFor(model => model.PreferredSharesNameId, "", new { @class = "text-danger" })
@Html.LabelFor(model => model.PreferredShares, htmlAttributes: new { @class = "control-label" })
@Html.EditorFor(model => model.PreferredShares, new { htmlAttributes = new { @class = "form-control" } }) @Html.ValidationMessageFor(model => model.PreferredShares, "", new { @class = "text-danger" })
@Html.LabelFor(model => model.Action, htmlAttributes: new { @class = "control-label" })
@Html.RadioButtonFor(model => model.Action, "Debit") @Html.ValidationMessageFor(model => model.Action, "", new { @class = "text-danger" }) Debit   @Html.RadioButtonFor(model => model.Action, "Credit") @Html.ValidationMessageFor(model => model.Action, "", new { @class = "text-danger" }) Credit
@Html.LabelFor(model => model.Memo, htmlAttributes: new { @class = "control-label" })
@Html.EditorFor(model => model.Memo, new { htmlAttributes = new { @class = "form-control" } }) @Html.ValidationMessageFor(model => model.Memo, "", new { @class = "text-danger" })
@*@Html.LabelFor(model => model.Attachments, htmlAttributes: new { @class = "control-label" })*@
Attachment
@(Html.Kendo().Upload() .Name("files") .Multiple(false) .Async(a => a .Save("Async_Save", "Transaction") .Remove("Async_Remove", "Transaction") .AutoUpload(true) ) .HtmlAttributes(new { @style = "background-color: darkblue; color: white;" }) .Events(events => events .Cancel("onUploadCancel") .Complete("onUploadComplete") .Error("onUploadError") .Progress("onUploadProgress") .Remove("onUploadRemove") .Select("onUploadSelect") .Success("onUploadSuccess") .Upload("onUploadUpload") ) .Files(files => { files.Add().Name(@Html.EditorFor(model => model.FileName).ToString()); }) )
@Html.LabelFor(model => model.FileName, htmlAttributes: new { @class = "control-label" })
@Html.EditorFor(model => model.FileName, new { htmlAttributes = new { @class = "form-control" } }) @Html.ValidationMessageFor(model => model.FileName, "", new { @class = "text-danger" })

}

farzinmonsef commented 3 years ago

BaseController.cs

using Business; using Data; using Entitites; using EQM.Helper; using System; using System.Collections.Generic; using System.Configuration; using System.Data; using System.Data.SqlClient; using System.Linq; using System.Web; using System.Web.Mvc;

namespace EQM.Controllers { public class BaseController : Controller { protected const string NoUserRole = "no user role available"; private User currentUser; protected User CurrentUser { get { if (Session["currentUser"] != null) { currentUser = (User)Session["currentUser"]; } else { throw new ApplicationException(NoUserRole); } return currentUser; } }

    protected override void OnException(ExceptionContext filterContext)
    {
        logDB(filterContext);
        Exception exception = filterContext.Exception;
        filterContext.ExceptionHandled = true;
        var Result = this.View("Error", new HandleErrorInfo(exception,
                                                        filterContext.RouteData.Values["controller"].ToString(),
                                                        filterContext.RouteData.Values["action"].ToString()));
        filterContext.Result = Result;
    }
    private void logDB(ExceptionContext filterContext)
    {
        var objLogDB = new LogDB()
        {
            Date_Time = DateTime.Now,
            UserName = Convert.ToString(Tools.sessionInt(Session["userId"])) + " | " + (string)Session["userEmail"],
            Controller = filterContext.RouteData.Values["controller"].ToString(),
            Action = filterContext.RouteData.Values["action"].ToString(),
            Message = Convert.ToString(filterContext.Exception),
            Comment = "BaseController::logDB"
        };
        BusLogDB busLogDB = new BusLogDB();
        busLogDB.LogDB(objLogDB);
    }

}

}

farzinmonsef commented 3 years ago

TransController.cs

using System; using System.Collections.Generic; using System.Linq; using System.Web.Mvc; using Kendo.Mvc.Extensions; using Kendo.Mvc.UI; using Entitites; using EQM.Helper; using System.IO; using Business; using DocumentFormat.OpenXml; using DocumentFormat.OpenXml.Packaging; using DocumentFormat.OpenXml.Spreadsheet; using EQM.Extensions; using Newtonsoft.Json; using Kendo.Mvc.Export; using System.Web; using EQM.Filters; using Data; using Business.Interfaces; using System.Diagnostics;

namespace EQM.Controllers { [UserAuthenticationFilter] public class TransactionController : BaseController { private readonly IBusTransactions _busTransactions;

    public TransactionController()
    {
        _busTransactions = new BusTransactions();
    }

    public TransactionController(IBusTransactions busTransactions)
    {
        _busTransactions = busTransactions;
    }

    public char delimiterFile { get; set; } = '`';

    public ActionResult Index()
    {
        if ((bool)Session["ValidBrowser"] == false)
        {
            return View("~/Views/NotSupported.cshtml");
        }

        if ((bool)Session["Authenticated"] == false)
        {
            return View("~/Views/Unauthorized.cshtml");
        }
        Session["selectedmenu"] = "menutransaction";
        BusTransactions busTransactions = new BusTransactions();
        Session["CanEditTransaction"] = busTransactions.getUserEditTransaction(CurrentUser.RoleID);
        return View();
    }

    [OutputCache(NoStore = true, Duration = 0, VaryByParam = "*")]
    public ActionResult ListAllTransactions([DataSourceRequest] DataSourceRequest request)
    {
        BusTransactions busTransactions = new BusTransactions();
        IQueryable<Transaction> r = busTransactions.GetTransactions(CurrentUser.RoleID).AsQueryable();
        DataSourceResult result = r.ToDataSourceResult(request);
        return Json(result);
    }

    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Transactions_Create([DataSourceRequest] DataSourceRequest request, Transaction transaction)
    {
        ModelState.Remove("AccountName.CreatedDate");
        ModelState.Remove("AccountName.CreatedBy");
        ModelState.Remove("PlanName.CreatedDate");
        ModelState.Remove("PlanName.CreatedBy");
        ModelState.Remove("PlanName.LastModifiedDate");
        if (ModelState.IsValid)
        {

            BusTransactions busTransactions = new BusTransactions();
            transaction = busTransactions.CreateTransaction(transaction);

            if ((byte[])Session["UplodedFile"] != null)
            {
                BusAttachment busAttachment = new BusAttachment();
                busAttachment.SaveAttachment((byte[])Session["UplodedFile"], transaction.FileName, 
                    (Guid)Session["fileNameGuid"], transaction.ContentType, transaction.Id, (int)Session["userId"]);
            }

        }
        return Json(new[] { transaction }.ToDataSourceResult(request, ModelState));
    }

    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Transactions_Update([DataSourceRequest] DataSourceRequest request, Transaction transaction)
    {
        ModelState.Remove("AccountName.CreatedDate");
        ModelState.Remove("PlanName.CreatedDate");
        ModelState.Remove("PlanName.CreatedBy");
        ModelState.Remove("PlanName.LastModifiedDate");
        ModelState.Remove("PreferredSharesName.CreatedDate");

        foreach (var modelStateKey in ViewData.ModelState.Keys)
        {
            var value = ViewData.ModelState[modelStateKey];
            foreach (var error in value.Errors)
            {
                Debug.WriteLine("Key=" + modelStateKey.ToString() + " Err=" + error.ToString());
            }
        }
        if (ModelState.IsValid)
        {
            BusTransactions busTransactions = new BusTransactions();
            transaction = busTransactions.UpdateTransaction(transaction);
            BusAttachment busAttachment = new BusAttachment();
            if (Session["UplodedFile"] != "")
            {
                if ((byte[])Session["UplodedFile"] != null)
                {
                    busAttachment.SaveAttachment((byte[])Session["UplodedFile"], transaction.FileName,
                     (Guid)Session["fileNameGuid"], transaction.ContentType, transaction.Id, (int)Session["userId"]);
                }
                else
                {
                    busAttachment.RemoveAttachment(transaction.Id, Convert.ToString(Session["userId"]));
                    Session["UplodedFile"] = "";
                }
            }

        }
        return Json(new[] { transaction }.ToDataSourceResult(request, ModelState));
    }

    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Transactions_Destroy([DataSourceRequest] DataSourceRequest request, Transaction transaction)
    {
        ModelState.Remove("PlanName.CreatedDate");
        ModelState.Remove("PlanName.CreatedBy");
        ModelState.Remove("AccountName.LastModifiedDate");
        ModelState.Remove("AccountName.CreatedDate");
        ModelState.Remove("PreferredSharesName.CreatedDate");
        ModelState.Remove("PlanName.LastModifiedDate");

        foreach (var modelStateKey in ViewData.ModelState.Keys)
        {
            var value = ViewData.ModelState[modelStateKey];
            foreach (var error in value.Errors)
            {
                Debug.WriteLine("Key=" + modelStateKey.ToString() + " Err=" + error.ToString());
            }
        }
        if (ModelState.IsValid)
        {
            int userId = (int)Session["userId"];
            BusTransactions busTransactions = new BusTransactions();
            transaction = busTransactions.DestroyTransaction(transaction, userId);
        }
        return Json(new[] { transaction }.ToDataSourceResult(request, ModelState));
    }

    [OutputCache(NoStore = true, Duration = 0, VaryByParam = "*")]
    [HttpPost]
    public ActionResult GetPreviewLetter(int TransactionId)
    {
        BusEmail ml = new BusEmail();
        string tmp1 = ml.previewLetter(TransactionId, CurrentUser);
        string tmp2 = tmp1;
        tmp2 = tmp2.Replace("[BOA-Logo]", "<img src=\"cid:DSitesEqmwwwrootImagesBOALogoLetter.jpg\" alt=\"Bank of America Logo\" />");
        Session["previewLetter"] = tmp2.Replace("[Signature-Logo]", "<img src=\"cid:Signature.png\" alt=\"Signature Logo\" />");
        Session["TransactionId"] = TransactionId;

        string display_BOA_logo = "<p style='text-align:right'>" +
                        "    <img alt='Bank Of America Logo' height='32' width='300'" +
                        "         src='data:image/jpeg;base64,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qaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5+v/EAB8BAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKC//EALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5+jp6vLz9PX29/j5+v/aAAwDAQACEQMRAD8A/fyiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiivC/2pf+Cjnwo/Y+uPsnjHXLxNWZd0en2WnzXE0vGcBgoiB/3nFZ1KkKceabsvM9HK8nx2Z4hYTL6MqtR7RhFyfrZdF1eyPdKK/K/wCNf/ByG5M1v8Ovh0q9fKvvEd3n6ZtoD/7Wrwnw7/wX1/aA0fxbLqF3deE9WsZWBGl3GjrHbRDuEaNlm/FpGrzamd4WLsm36I/ZMt+jnxpi6DrTpQpaXUZzXM/RR5kn/icT9xqK/NT4Jf8ABxz4V1kw2/xB8B6xochwrXmi3CX0JP8AeMUnlug9gzn619j/AAJ/4KDfBr9pEwxeE/iBoN3fz4CafdSmyvmPoIZgjtj1UEe9dVHH4er8El+T/E+F4i8MeKMjTlmOCnGK3klzw+coc0V82j2Siiiuw+ECiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKK5X4yaz4w0LwHd3HgXQ9F8Q+IVH7iz1PUmsIG6871ikyRx8p2g8/MtfkD/wAFBvit+2prIvovH2j+KPCvhX5vMt/C0BGkhPSS4t2kLqR/DLKR7CuLGY1YeN3Fv0WnzZ+i8A+HdbijEeyhi6NBXt781zv/AA0780vnZeZ+mf7SH/BSf4M/ssGa38UeM9Pm1iHIOk6Yft18G/utHHkRn/roUHvWX8Hv+CrvwB+NflR6d8RtH0u8kwPsut7tLkVj/DumCox/3Gav57Ccmivn3xBW5rqKt21/P/gH9T0/or5AsGqVTFVXW/nXIo/+Acr0/wC3r+Z/Utpup2+s2EV1Z3EN1azrvjmhcSRyL6hhwR7iodd8P6f4p0uSx1Oxs9SsphiS3uoVmikHurAg/jX80fwh/aO8ffAPUPtPgvxh4i8Mvu3MlhfSRQyn/bjB2OPZgRX2R8B/+DhP4r+AfJtvG2jaD48skwHmCf2bfsP9+IGL/wAhZ9676OfUZ6VU4/iv6+R+X8QfRh4hwT9tk9eGIS2X8Ofyu3H586P0G+NP/BIH9n/42CaS48C2nh2+lzi78PSHTWQnuIk/ck/70Zr47+Ov/BuFqVms118NvH9tfKMmPT/ENuYZMen2iEMrE+8Sj39Ppr9n3/guL8C/jWYLXVdWvvAOqy4Uw69Dsty3fFyhaML7yFPpX1v4d8S6d4v0a31LSdQstU0+6XfDdWk6zQzL6q6kqR7g11fVcFileKT9NH+H6nxtPjbxG4Mqqhi6lamtlGsnOD8oud1b/BJep/Ot+0B/wT3+Mf7MizTeLvAmtWumwZLalaIL2xA9TNCWRM+jlT7V4zX9ThGRXzx+0Z/wSw+CP7TKXE2seDbPR9Ynyf7V0IDT7vcf4m2Dy5G95EevMxHD73oy+T/z/wCAfsPC/wBKiEmqXEOEt3nSd184Sd/um/JH4vfAD/gpP8a/2avJh8N+PNXk0yDAGmam/wDaFmFH8KxzbvLH/XMqfevub9nj/g42sbvyLP4peB5bNzhX1Tw7J5kefU20zblA6kiVj6LXnP7S3/BvH468Ei41D4Z+IrDxpYrll02/22GogdlVifJkPuWj+lfB3xQ+EHir4J+KJNF8XeHtY8N6pFybbULV4HYf3l3D5lPZlyD2NcHtcdg3aV0vPVH6f/Ynhv4gU3Vw0adSo9W4fu6q85Jcsn6yUl6n9FH7Pv7afwt/aktFbwP400XWrll3tYeb5F9GMZO63kCygD12446mvUa/lt0Nr5NYtW003Q1BZVNubbd5wkz8uzbzuz0xzX6ef8E+/in+3RZfYbf/AIRXUPFHhP5QW8d/6C8cf96O4kK3LZGMHbKAOi17GDzp1Xyzg7+Wv4H4L4hfR3o5NSeMy/MKah0jXlGnL0jPSMn5NR9T9VqKo+GbnUrzw/Zy6xZ2en6pJEGura0umuoIX7qkrRxlwPUoufSr1e8fzDOLjJxfTs7/AIrR+qCiiigkKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKK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KKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiikdxGpZiFVRkk9qAFrn/ih8V/DPwS8D33ibxhr+keGfD+mJ5l1qGp3SW1vCPd3IGT0A6k8AE1+ev/BS3/g5U+FP7Hjah4X+GotPix8QIN0T/ZLj/iR6VIOP31yufOZT1jhz0KtJGRX4L/tp/wDBQv4t/wDBQDx3/bnxO8WXmsLC7NY6XEfI0vSweMQW6/IpxwXOXYAbmY819pknBWMxtqtf93T7vd+i/V/K54eOzyjQ92n70vwXq/8AI/Wb/go1/wAHXdjo5vvC/wCzho66lcLuhfxlrlsVt07brS0bDP6h59oBHMTA5r8Yfjt+0N44/ad+IV14q+IPirWvF3iC84e81K5aZkXJIRB92OMZ4RAFXsBXG16p+yT+xT8Tv25PiTH4V+GPhPUfEmo/K11NGvl2enRk48y4nbEcSdeWILEYUMcCv1TL8ny/KqTlSSjZaye/zb29FZeR8liMZicXO0m32S2+48rr68/4J4f8ETfjh/wUXurXUvD+h/8ACL+BZHxL4q1xGgsmUHn7OmPMuW4I/dgoCMM6da/Xj/gmv/wbD/DP9mQaf4o+Mctl8VPG0O2VdOaI/wDCPabJ1wImAa6IOfmmAQ5/1QIBr9RLOzh06zit7eGOC3gQRxRRqFSNQMBQBwABwAK+PzrxAhC9LLlzP+Z7fJdfV6eTPZwPDspe/iXZdlv82fE//BPL/ggf8Cv2AlsdZXSf+FgfEC12ufEevwpIbaUfxWttzHb4PIYbpRnHmEV9uUV8vf8ABQr/AIK9/Bf/AIJvaFIvjTXxqfi6SLzLPwrpBW41S4yMqzrkLBGeu+UqCAdu4jbX5zKpjczxGvNUm/n/AMMvuSPpoxoYWnpaMUfUJOK+Av8Agob/AMHFHwN/Yga+0LQ7wfFTx7bbozpOhXK/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vjq1Z1akqst5NvTbXse1TgoRUF00CiiisigooooAKKKKACiiigAooooAKKKKACiiigAooooAq63oln4l0e60/UrO11DT76JoLi2uYllhnjYYZHVgQykHBBGDX5Wf8FHf+CFc2j/b/GnwRtZLq1+ae98J7i0sPdms2PLjv5LHd/cLZCD9XaK5cVg6WIjy1F8+qPtuCPEDOOFcZ9byupo7c0HrCa7SXfs1aS6Pc/lnvLObTruW3uIpILiBzHJHIpV42BwVIPIIPBBqOv3V/wCCkH/BInwt+2XZXfibw2LPwt8SFTcL0JttNYIHCXSqPvdhMoLDuHAAH5efAn/glT8XvjN+0PffD668O3nhmbQZVGt6lqER+yadETw6uOJi4BMaxk7+uQoLD4/FZXXpVFBK99mv60P764N8aOHc9yueYVaqoSpRvUhNq8V3T+3FvRNK92k0m0jxn4J/A3xV+0V8RLHwr4N0a71zW9Qb5IYV+WNRjdJIx+WONc8uxAHrX7X/APBOP/gkf4T/AGLrC18ReIPsnir4kOmW1Bo91rpJI5S1Vh17GVgHIzgICVPsX7HP7Engf9iP4cLoXhGx3Xlwqtqer3Chr3VJB/FI3ZRk7Y1wq5PGSSfX6+gy7KI0P3lXWX4L/g+Z/K3ix4743iJzyzJ26OD2b2nV/wAX8sX/ACrf7Tey8h/aS/avh+Bt6uk6Xo//AAkPiH7CdVuYpbv7HY6RZeZ5QubufZIyK8mURY45JHZW2rhWI5n4O/txT+I/iFZ+GPGWhaXol3qk6WllqGk6nNe2LXLo7x2863FvbXFvJKsUhiLxGOUxOFcsNtcb+2joNx4B8V+P77UobiLwt8T9C0vTzrqJKYdBu7G4mYpctEGeGGWKfck2NqyI4YrvUnk/BFjpnxo+JMnhvwPqVz8Qbafxho/iK98cHULnUI9P0nTrn7dDYSXMpKeck5khijgY5jneRwG3s/RUr1FVsn8vv+eumvQ+Wy3hvKamTqtUpN3jd1bytHSDk3qoJwlKcVBpynyqyfMpL7iooor0j8hCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA//2Q==' />" +
                        "</p>";
        string display_command =
                        "<p style='text-align:right;padding:0px 75px 0px 0px;margin:0px 0px 0px 0px;'>" +
                        "<input type='checkbox' name='includeAttach' id='includeAttach'/>&nbsp;" +
                        "<label for='includeAttach'>Include Attachment in Email</label>" +
                        "</p>" +
                        "<p style='text-align:right;padding:0px 50px 0px 0px;'>" +
                        "<input type='button' class='k-button eqmcancelbutton' name='cancelemailLetter' value='Cancel' onclick='cancelemailLetter()'>&nbsp;&nbsp;" +
                        "<input type='button' class='k-button k-primary' name='emailLetter' value='Send Email to ComputerShare' onclick='emailLetterconfirm()'>&nbsp;&nbsp;&nbsp;" +
                        "</p>";
        tmp1 = tmp1.Replace("[BOA-Logo]", display_BOA_logo);

        User user = (User)Session["currentUser"];
        int userId = user.UserID;
        BusUserSignature busUserSignature = new BusUserSignature();
        byte[] temp = busUserSignature.ReadUserSignature(userId);
        if (temp.Length == 0)
        {
            return Json("Error: No Signature for Current User!    " +
                    " It's NOT Allowed to see the Preview Letter. For Correcting You have to Add Your Signature to the EQM System.   " +
                    " For ADDING SIGNATURE, Go to   USER > Select Your User Name Row > EDIT > Select Signature File > Save");
        }
        string signature = Tools.GetBase64ForImageMemory(temp);
        tmp1 = tmp1.Replace("[Signature-Logo]", "<img src=\"data:image/png;base64," + signature + "\">");
        tmp1 = tmp1 + display_command;
        return Json(tmp1);
    }

    [OutputCache(NoStore = true, Duration = 0, VaryByParam = "*")]
    [HttpPost]
    public ActionResult SendMail(string includeAttach)
    {
        var ret = "";
        try
        {
            int TransactionId = Tools.sessionInt(Session["TransactionId"]);
            BusTransactions busTransactions = new BusTransactions();
            //string AttachmentFileName2 = "Signature.png";
            string AttachmentFileName3 = "";
            string attachmentType3 = "";
            if (includeAttach != "0")
            {
                AttachmentFileName3 = busTransactions.GetTransactionByRoleId(CurrentUser.RoleID, TransactionId).FileName;
                var ext = Path.GetExtension(AttachmentFileName3).ToLowerInvariant();
                attachmentType3 = Tools.GetMimeTypes()[ext];
            }
            BusEmail busEmail = new BusEmail();
            ret = busEmail.sendEmail(TransactionId, (string)Session["previewLetter"],
                            Tools.sessionInt(Session["Status_Pending"]), Tools.sessionInt(Session["Status_Approved"]), CurrentUser.UserID,
                            Path.Combine(Server.MapPath("~/Images"), "BOALogoLetter.jpg"), "image/jpeg",
                            "Signature.png", "Image/png",
                            AttachmentFileName3, attachmentType3);
        }
        catch (Exception ex)
        {
            ret = ex.ToString();
        }
        return Json(ret);
    }

    [OutputCache(NoStore = true, Duration = 0, VaryByParam = "*")]
    [HttpGet]
    public FileResult GetFile(int Id)
    {
        Byte[] fileBytes = new Byte[] { };
        try
        {
            int TransactionId = Id;
            BusTransactions busTransactions = new BusTransactions();
            fileBytes = busTransactions.getAttachment(TransactionId);
            string FileName = busTransactions.GetTransactionByRoleId(CurrentUser.RoleID, TransactionId).FileName;
            var ext = Path.GetExtension(FileName).ToLowerInvariant();
            return File(fileBytes, Tools.GetMimeTypes()[ext], FileName);
        }
        catch (Exception ex)
        {
            return File(fileBytes, string.Empty, string.Empty);
        }
    }

    public ActionResult Excel_Export_Save([DataSourceRequest] DataSourceRequest request)
    {
        User currentUser = (User)Session["currentUser"];
        BusTransactions busTransactions = new BusTransactions();
        IQueryable<Transaction> r = busTransactions.GetTransactions((int)Session["userRole"]).AsQueryable();
        DataSourceResult result = r.ToDataSourceResult(request);

        var excelStream = CreateSpreadsheet((IEnumerable<Transaction>)result.Data);
        Response.AddHeader("content-disposition", $"attachment;filename=TransactionList_{DateTimeOffset.UtcNow:dd.MM.yyyy}.xlsx");
        return File(excelStream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
    }

    [HttpPost]
    public ActionResult Pdf_Export_Save(string contentType, string base64, string fileName)
    {
        var fileContents = Convert.FromBase64String(base64);
        return File(fileContents, contentType, fileName);
    }

    protected override void Dispose(bool disposing)
    {
        base.Dispose(disposing);
    }
    public string fileCheck(string path, string fileName, string extension)
    {
        string ret = "";
        for (int i = 0; i < 100000; i++)
        {
            if (!System.IO.File.Exists(path + fileName + i.ToString() + "." + extension))
            {
                ret = path + fileName + i.ToString() + "." + extension;
                break;
            }
        }
        return ret;
    }
    public void writeFile(Byte[] data, string FileName)
    {
        string myfileName = Server.MapPath(Url.Content(@"~\Output\")) + FileName;

        FileStream stream = new FileStream(myfileName, FileMode.Create);
        BinaryWriter writer = new BinaryWriter(stream);

        writer.Write(data);
        writer.Flush();
        writer.Close();
        stream.Close();
    }

    [OutputCache(NoStore = true, Duration = 0, VaryByParam = "*")]
    [HttpPost]
    public ActionResult DeleteAttach(int transactionId)
    {
        try
        {
            BusTransactions busTransactions = new BusTransactions();
            busTransactions.RemoveAttachment(transactionId);

            return Json(new { success = true, message = "Removed" });
        }
        catch (Exception ex)
        {
            return Json(new { success = false, message = "Error Attach Deleting: " + ex.Message });
        }
    }

    private byte[] CreateSpreadsheet(IEnumerable<Transaction> transactions)
    {
        var stream = new MemoryStream();
        var excelExtensions = new ExcelExtensions();

        SpreadsheetDocument document = SpreadsheetDocument.Create(stream, SpreadsheetDocumentType.Workbook, true);

        var workbookPart = document.AddWorkbookPart();
        workbookPart.Workbook = new Workbook();

        var sheets = workbookPart.Workbook.AppendChild(new Sheets());

        var sheet = excelExtensions.CreateNewSheet(workbookPart, transactions);
        sheets.Append(sheet);

        // Adding style
        var stylePart = workbookPart.AddNewPart<WorkbookStylesPart>();
        stylePart.Stylesheet = excelExtensions.GenerateStylesheet();
        stylePart.Stylesheet.Save();

        var path = string.Concat(Request.PhysicalApplicationPath, "\\images\\bofa_eqm2.png");
        ExcelImageExtensions.InsertImage(document, path, 1, 1);

        document.Close();

        return stream.ToArray();
    }
    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// <summary>
    /// setFilePrefix
    /// </summary>
    /// <param name="id"></param>
    [OutputCache(NoStore = true, Duration = 0, VaryByParam = "*")]
    [HttpPost]
    public void setFilePrefix(string id)
    {

        Session["filePrefix"] = Convert.ToString(id) + Tools.delimiterFile;
        Session["UplodedFile"] = null;
    }

    public ActionResult Async_Save(IEnumerable<HttpPostedFileBase> files)
    {
        if (files != null)
        {
            foreach (var uploadedFile in files)
            {
                Stream stream = uploadedFile.InputStream;
                byte[] b = new byte[uploadedFile.InputStream.Length];
                stream.ReadAsync(b, 0, Convert.ToInt32(uploadedFile.InputStream.Length));
                Session["fileNameGuid"] = Guid.NewGuid();
                Session["UplodedFile"] = b;
            }
        }
        return Content("");
    }

    public ActionResult Async_Remove(string[] fileNames)
    {
        if (fileNames != null)
        {
            Session["UplodedFile"] = null;
        }
        return Content("");
    }

}

}

farzinmonsef commented 3 years ago

ReportController.cs

using Business; using Entitites; using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using EQM.Filters;

using Entitites; using EQM.Helper; using System.IO; using Business; using DocumentFormat.OpenXml; using DocumentFormat.OpenXml.Packaging; using DocumentFormat.OpenXml.Spreadsheet; using EQM.Extensions; using Newtonsoft.Json; using Kendo.Mvc.Export; using System.Web; using EQM.Filters; using Data; using Business.Interfaces; using System.Diagnostics;

namespace EQM.Controllers { [UserAuthenticationFilter] public class ReportController : BaseController { private readonly BusReporting reportBLL;

    public ReportController()
    {
        reportBLL = new BusReporting();
    }
    // GET: Report
    public ActionResult Index()
    {
        return View();
    }

    [UserAuthorizationFilter("Administrator", "ChiefFinancialOfficer")]
    public ActionResult SharesBalance(DateTime? startDate, DateTime? endDate)
    {
        var report = new SharesBalanceReport();
        if (startDate == null && endDate == null)
        {
            var currentDate = DateTime.Now;
            report.StartDate = new DateTime(currentDate.Year, currentDate.Month, 1);
            report.EndDate = report.StartDate.AddMonths(1).AddDays(-1);
        }
        else
        {
            report.StartDate = startDate.Value;
            report.EndDate = endDate.Value;
        }
        report.ReportData = reportBLL.GetShareBalanceReport(report.StartDate, report.EndDate, CurrentUser);
        Session["selectedmenu"] = "menusharesbalance";
        Session["plantypeids"] = string.Join("|", report.ReportData.Select(m => m.PlanTypeId).Distinct());
        Session["sharesbalance"] = (List<SharesBalanceDTO_GetBalanceReportData_Result>)report.ReportData.ToList();
        return View(report);
    }

    [OutputCache(NoStore = true, Duration = 0, VaryByParam = "*")]
    [HttpGet]
    public FileResult ExcelExport(string data, string StartDate, string EndDate)
    {
        List<SharesBalanceDTO_GetBalanceReportData_Result> report = (List<SharesBalanceDTO_GetBalanceReportData_Result>)Session["sharesbalance"];
        List<SharesBalanceDTO_GetBalanceReportData_Result> reportResult = new List<SharesBalanceDTO_GetBalanceReportData_Result>();
        data = data.Substring(1, data.Length - 2);
        var dataAr = data.Split('|');
        if (dataAr.Length > 0)
        {
            for (int i = 0; i < report.Count(); i++) {
                if (Array.Exists(dataAr, element => element == Convert.ToString(report[i].PlanNameId))){
                    reportResult.Add(new SharesBalanceDTO_GetBalanceReportData_Result
                    {
                        BeginingBalance = report[i].BeginingBalance,
                        EndingBalance = report[i].EndingBalance,
                        PlanDescription = report[i].PlanDescription,
                        PlanName = report[i].PlanName,
                        PlanNameId = report[i].PlanNameId,
                        PlanTypeId = report[i].PlanTypeId,
                        PlanTypeName = report[i].PlanTypeName
                    });
                }
            }
        }
        var excelStream = CreateSpreadsheet((IEnumerable<SharesBalanceDTO_GetBalanceReportData_Result>)reportResult, StartDate, EndDate);// (IEnumerable<SharesBalanceDTO_GetBalanceReportData_Result>)dataInit); 
        Response.AddHeader("content-disposition", $"attachment;filename=SharesBalance_{DateTimeOffset.UtcNow:dd.MM.yyyy}.xlsx");
        return File(excelStream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
    }
    private byte[] CreateSpreadsheet(IEnumerable<SharesBalanceDTO_GetBalanceReportData_Result> sharesBalanceDTO, string StartDate, string EndDate)
    {
        var stream = new MemoryStream();
        var excelExtensionsReport = new ExcelExtensionsReport();

        SpreadsheetDocument document = SpreadsheetDocument.Create(stream, SpreadsheetDocumentType.Workbook, true);

        var workbookPart = document.AddWorkbookPart();
        workbookPart.Workbook = new Workbook();

        var sheets = workbookPart.Workbook.AppendChild(new Sheets());

        var sheet = excelExtensionsReport.CreateNewSheet(workbookPart, sharesBalanceDTO, StartDate, EndDate);
        sheets.Append(sheet);

        // Adding style
        var stylePart = workbookPart.AddNewPart<WorkbookStylesPart>();
        stylePart.Stylesheet = excelExtensionsReport.GenerateStylesheet();
        stylePart.Stylesheet.Save();

        var path = string.Concat(Request.PhysicalApplicationPath, "\\images\\bofa_eqm2.png");
        ExcelImageExtensions.InsertImage(document, path, 1, 1);

        document.Close();

        return stream.ToArray();
    }

}

}

farzinmonsef commented 3 years ago

ExcelExtension.cs

using Data; using DocumentFormat.OpenXml; using DocumentFormat.OpenXml.Packaging; using DocumentFormat.OpenXml.Spreadsheet; using Entitites; using System; using System.Collections.Generic; using System.Linq;

namespace EQM.Extensions { public class ExcelExtensions { public Sheet CreateNewSheet(WorkbookPart workbookPart, IEnumerable transactions) { var worksheetPart = workbookPart.AddNewPart(); var worksheet = new Worksheet(); var sheetData = new SheetData();

        var spreadsheetColumns = CreateCustomColumns();

        worksheet.Append(spreadsheetColumns);

        // Header Rows
        var rows = CreateHeaderRows(transactions.Count().ToString());

        foreach (var row in rows)
        {
            sheetData.AppendChild(row);
        }

        //Inserting each record
        foreach (var transaction in transactions)
        {
            var row = CreateDataRow(transaction);
            sheetData.AppendChild(row);
        }

        worksheet.AppendChild(sheetData);
        worksheetPart.Worksheet = worksheet;

        var sheet = new Sheet() { Id = workbookPart.GetIdOfPart(worksheetPart), SheetId = 1, Name = "All Transactions" };

        var pageSetup = worksheetPart.Worksheet.GetElement<PageSetup>();

        pageSetup.Orientation = OrientationValues.Landscape;
        pageSetup.FitToWidth = 1;

        worksheetPart.Worksheet.Save();

        return sheet;
    }

    private IEnumerable<Row> CreateHeaderRows(string transactionCount)
    {
        var rows = new List<Row>();

        // Constructing Title row and appending it to the sheet
        Row titleRow = new Row() { RowIndex = 7 };
        titleRow.Append(ConstructCell("Transaction Export Report", CellValues.String, 2), ConstructCell("", CellValues.String, 0), ConstructCell("Confidential", CellValues.String, 2));
        rows.Add(titleRow);

        // Constructing Name row and appending it to the sheet
        Row nameRow = new Row();
        nameRow.Append(ConstructCell("EQM", CellValues.String, 2), ConstructCell("", CellValues.String, 0), ConstructCell("", CellValues.String, 0));
        rows.Add(nameRow);

        // Constructing DateRow row and appending it to the sheet
        Row dateRow = new Row();
        dateRow.Append(ConstructCell(string.Format("Date: {0}", DateTime.Now.ToShortDateString()), CellValues.String, 2), ConstructCell("", CellValues.String, 0), ConstructCell("", CellValues.String, 0));
        rows.Add(dateRow);

        // Constructing blank rows and appending it to the sheet
        Row blankRow = new Row();
        blankRow.Append(ConstructCell("", CellValues.String, 0), ConstructCell("", CellValues.String, 0), ConstructCell("", CellValues.String, 0));
        rows.Add(blankRow);

        Row transactionCountRow = new Row();
        transactionCountRow.Append(ConstructCell(string.Format("Total Transaction Count: {0}", transactionCount), CellValues.String, 2), ConstructCell("", CellValues.Number, 0), ConstructCell("", CellValues.String, 0));
        rows.Add(transactionCountRow);

        // Constructing blank rows and appending it to the sheet
        Row secondBlankRow = new Row();
        secondBlankRow.Append(ConstructCell("", CellValues.String, 0), ConstructCell("", CellValues.String, 0), ConstructCell("", CellValues.String, 0));
        rows.Add(secondBlankRow);

        // Constructing Header Row and appending it to the sheet
        Row headerRow = new Row();
        headerRow.Append(
            ConstructCell("Id", CellValues.String, 1),
            ConstructCell("Category", CellValues.String, 1),
            ConstructCell("Transaction Type", CellValues.String, 1),
            ConstructCell("Reserve Name", CellValues.String, 1),
            ConstructCell("Entry Date", CellValues.String, 1),
            ConstructCell("Transaction Effective Date", CellValues.String, 1),
            ConstructCell("Settlement Date", CellValues.String, 1),
            ConstructCell("Broker Name", CellValues.String, 1),
            ConstructCell("DTC Participant Number", CellValues.String, 1),
            ConstructCell("Shares for Tax", CellValues.String, 1),
            ConstructCell("Cancel and Retire Shares (R469)", CellValues.String, 1),
            ConstructCell("Shares", CellValues.String, 1),
            ConstructCell("Treasury Account Shares (T35)", CellValues.String, 1),
            ConstructCell("Acquisition Price Per Share", CellValues.String, 1),
            ConstructCell("Commission Per Share", CellValues.String, 1),
            ConstructCell("Cost of Total Treasury Shares", CellValues.String, 1),
            ConstructCell("Requisition Number", CellValues.String, 1),
            ConstructCell("Total Vested Shares", CellValues.String, 1),
            ConstructCell("Total Treasury Shares", CellValues.String, 1),
            ConstructCell("Net Shares to Broker", CellValues.String, 1),
            ConstructCell("Value of Tax Shares", CellValues.String, 1),
            ConstructCell("Account Name", CellValues.String, 1),
            ConstructCell("Director Name", CellValues.String, 1),
            ConstructCell("Common Restricted Unvested Shares FROM CR1", CellValues.String, 1),
            ConstructCell("Common Restricted Unvested Shares INTO CR1", CellValues.String, 1),
            ConstructCell("Common Restricted Shares INTO CR2", CellValues.String, 1),
            ConstructCell("Common Restricted Unvested Shares Granted", CellValues.String, 1),
            ConstructCell("Gross Stock Units Distributed", CellValues.String, 1),
            ConstructCell("Net Stock Unit Shares to Distribute", CellValues.String, 1),
            ConstructCell("Memo", CellValues.String, 1)
            );
        rows.Add(headerRow);

        return rows;
    }

    private Columns CreateCustomColumns()
    {
        var columns = new Columns();

        columns.Append(new Column() { Min = 1, Max = 1, Width = 27, CustomWidth = true });
        columns.Append(new Column() { Min = 2, Max = 2, Width = 25, CustomWidth = true });
        columns.Append(new Column() { Min = 3, Max = 3, Width = 33, CustomWidth = true });
        columns.Append(new Column() { Min = 4, Max = 4, Width = 65, CustomWidth = true });
        columns.Append(new Column() { Min = 5, Max = 5, Width = 15, CustomWidth = true });
        columns.Append(new Column() { Min = 6, Max = 6, Width = 25, CustomWidth = true });
        columns.Append(new Column() { Min = 7, Max = 7, Width = 25, CustomWidth = true });
        columns.Append(new Column() { Min = 8, Max = 8, Width = 25, CustomWidth = true });
        columns.Append(new Column() { Min = 9, Max = 9, Width = 25, CustomWidth = true });
        columns.Append(new Column() { Min = 10, Max = 10, Width = 25, CustomWidth = true });
        columns.Append(new Column() { Min = 11, Max = 11, Width = 25, CustomWidth = true });
        columns.Append(new Column() { Min = 12, Max = 12, Width = 25, CustomWidth = true });
        columns.Append(new Column() { Min = 13, Max = 13, Width = 30, CustomWidth = true });
        columns.Append(new Column() { Min = 14, Max = 14, Width = 20, CustomWidth = true });
        columns.Append(new Column() { Min = 15, Max = 15, Width = 30, CustomWidth = true });
        columns.Append(new Column() { Min = 16, Max = 16, Width = 20, CustomWidth = true });
        columns.Append(new Column() { Min = 17, Max = 17, Width = 25, CustomWidth = true });
        columns.Append(new Column() { Min = 18, Max = 18, Width = 20, CustomWidth = true });
        columns.Append(new Column() { Min = 19, Max = 19, Width = 20, CustomWidth = true });
        columns.Append(new Column() { Min = 20, Max = 20, Width = 30, CustomWidth = true });
        columns.Append(new Column() { Min = 21, Max = 21, Width = 22, CustomWidth = true });
        columns.Append(new Column() { Min = 22, Max = 22, Width = 25, CustomWidth = true });
        columns.Append(new Column() { Min = 23, Max = 23, Width = 30, CustomWidth = true });
        columns.Append(new Column() { Min = 24, Max = 24, Width = 47, CustomWidth = true });
        columns.Append(new Column() { Min = 25, Max = 25, Width = 43, CustomWidth = true });
        columns.Append(new Column() { Min = 26, Max = 26, Width = 35, CustomWidth = true });
        columns.Append(new Column() { Min = 27, Max = 27, Width = 42, CustomWidth = true });
        columns.Append(new Column() { Min = 28, Max = 28, Width = 33, CustomWidth = true });
        columns.Append(new Column() { Min = 29, Max = 29, Width = 33, CustomWidth = true });
        columns.Append(new Column() { Min = 30, Max = 30, Width = 45, CustomWidth = true });

        return columns;
    }

    private Row CreateDataRow(Transaction transaction)
    {
        var row = new Row();
        var transactionDateCell = new Cell();
        var settlementDateCell = new Cell();
        var planName = "";
        var accountName = "";

        if (transaction.PlanNameId != null)
        {
            planName = transaction.PlanName?.Name;
        }

        if (transaction.AccountNameId != null)
        {
            accountName = transaction.AccountName?.Name;
        }

        if (transaction.TotalVestedShares == null && transaction.TotalShares !=  null)
        {
            transaction.TotalVestedShares = transaction.TotalShares;
        }

        if ((bool)(transaction.TransactionTypeObject?.Name.Contains("Repurchase")))
        {
            transactionDateCell = ConstructCell("", CellValues.String, 0);
            settlementDateCell = ConstructCell(transaction.TransactionEffectiveDate?.ToString("MM/dd/yyyy"), CellValues.String, 0);
        }
        else
        {
            transactionDateCell = ConstructCell(transaction.TransactionEffectiveDate?.ToString("MM/dd/yyyy"), CellValues.String, 0);
            settlementDateCell = ConstructCell("", CellValues.String, 0);
        }
        row.Append
            (
                ConstructNumberCell(transaction.Id, CellValues.Number, 0),
                ConstructCell(transaction.CategoryTypeObject?.Name, CellValues.String, 0),
                ConstructCell(transaction.TransactionTypeObject?.Name, CellValues.String, 0),
                ConstructCell(planName, CellValues.String, 0),
                ConstructCell(transaction.EntryDate?.ToString("MM/dd/yyyy"), CellValues.String, 0),
                transactionDateCell,
                settlementDateCell,
                ConstructCell(transaction.BrokerName, CellValues.String, 0),
                ConstructCell(transaction.DTCParticipantNumber?.ToString(), CellValues.Number, 0),
                ConstructNumberCell(transaction.SharesForTax ?? 0, CellValues.Number, 4),
                ConstructNumberCell(transaction.CancelandRetireShares ?? 0, CellValues.Number, 4),
                ConstructNumberCell(transaction.DispositionOfShares ?? 0, CellValues.Number, 4),
                ConstructNumberCell(transaction.TreasuryAccountShares ?? 0, CellValues.Number, 4),
                ConstructNumberCell(transaction.AcquisitionPricePerShare ?? 0, CellValues.Number, 5),
                ConstructNumberCell(transaction.CommissionPerShare ?? 0, CellValues.Number, 5),
                ConstructNumberCell(transaction.CostOfTotalTreasuryShares ?? 0, CellValues.Number, 5),
                ConstructCell(transaction.RequisitionNumber, CellValues.String, 0),
                ConstructNumberCell(transaction.TotalVestedShares ?? 0, CellValues.Number, 4),
                ConstructNumberCell(transaction.TotalTreasurySharestoRetire ?? 0, CellValues.Number, 4),
                ConstructNumberCell(transaction.NetSharesToMerrillLynch ?? 0, CellValues.Number, 4),
                ConstructNumberCell(transaction.ValueOfTaxShares ?? 0, CellValues.Number, 5),
                ConstructCell(accountName, CellValues.String, 0),
                ConstructCell(transaction.DirectorName, CellValues.String, 0),
                ConstructNumberCell(transaction.CommonRestrictedUnvestedSharesFROMCR1 ?? 0, CellValues.Number, 4),
                ConstructNumberCell(transaction.CommonRestrictedUnvestedSharesINTOCR1 ?? 0, CellValues.Number, 4),
                ConstructNumberCell(transaction.CommonRestrictedShareINTOCR2 ?? 0, CellValues.Number, 4),
                ConstructNumberCell(transaction.CommonRestrictedUnvestedSharesGranted ?? 0, CellValues.Number, 4),
                ConstructNumberCell(transaction.GrossStockUnitsDistributed ?? 0, CellValues.Number, 4),
                ConstructNumberCell(transaction.NetStockUnitSharestoDistribute ?? 0, CellValues.Number, 4),
                ConstructCell(transaction.Memo, CellValues.String, 3)
            );

        return row;
    }

    private Cell ConstructCell(string value, CellValues dataType, uint styleIndex = 0)
    {
        return new Cell()
        {
            CellValue = new CellValue(value),
            DataType = new EnumValue<CellValues>(dataType),
            StyleIndex = styleIndex,
        };
    }

    private Cell ConstructNumberCell(decimal value, CellValues dataType, uint styleIndex)
    {
        return new Cell()
        {
            CellValue = new CellValue(DecimalValue.FromDecimal(value)),
            DataType = new EnumValue<CellValues>(dataType),
            StyleIndex = styleIndex,
        };
    }

    public Stylesheet GenerateStylesheet()
    {
        Stylesheet styleSheet = null;

        Fonts fonts = new Fonts(
                      new Font(new FontSize() { Val = 10 }), // Index 0 - default 
                      new Font(new FontSize() { Val = 10 }, new Bold(), new Color() { Rgb = "FFFFFF" }), // Columns
                      new Font(new FontSize() { Val = 10 }, new Bold()) // Spreadsheet header
                      );

        Fills fills = new Fills(
                            new Fill(new PatternFill() { PatternType = PatternValues.None }), // Index 0 - default
                            new Fill(new PatternFill() { PatternType = PatternValues.LightTrellis }), // Index 1 - default
                            new Fill(new PatternFill(new ForegroundColor() { Rgb = "012169" }) { PatternType = PatternValues.Solid }) // table columns
                               );

        Borders borders = new Borders(new Border());

        CellFormats cellFormats = new CellFormats(
                new CellFormat(), // default
                new CellFormat { FontId = 1, FillId = 2, ApplyFill = true }, // table columns
                new CellFormat { FontId = 2 }, // spreadsheet header
                new CellFormat { FontId = 0, Alignment = new Alignment { WrapText = true } }, // Memo Wrap
                new CellFormat { FontId = 0, NumberFormatId = 38 }, // numbers  
                new CellFormat { FontId = 0, NumberFormatId = 8 } // currency

            );

        styleSheet = new Stylesheet(fonts, fills, borders, cellFormats);

        return styleSheet;
    }
}

}

farzinmonsef commented 3 years ago

ExcelExtensionsReport.cs

using Data; using DocumentFormat.OpenXml; using DocumentFormat.OpenXml.Packaging; using DocumentFormat.OpenXml.Spreadsheet; using Entitites; using System; using System.Collections.Generic; using System.Linq;

namespace EQM.Extensions { public class ExcelExtensionsReport { public Sheet CreateNewSheet(WorkbookPart workbookPart, IEnumerable sharesBalanceDTO, string StartDate, string EndDate) { var worksheetPart = workbookPart.AddNewPart(); var worksheet = new Worksheet(); var sheetData = new SheetData();

        var spreadsheetColumns = CreateCustomColumns();

        worksheet.Append(spreadsheetColumns);

        // Header Rows
        var rows = CreateHeaderRows((sharesBalanceDTO != null ? sharesBalanceDTO.Count().ToString() : "0"), StartDate, EndDate);
        foreach (var row in rows) { sheetData.AppendChild(row); }

        string PlanTypeName = "";
        //Inserting each record
        if (sharesBalanceDTO != null)
        {
            foreach (var sharesBalanceDTO_ in sharesBalanceDTO)
            {
                if (PlanTypeName != sharesBalanceDTO_.PlanTypeName)
                {
                    var gridheaderrows = CreateGridHeader(sharesBalanceDTO_.PlanTypeName);
                    foreach (var row in gridheaderrows) { sheetData.AppendChild(row); }
                    PlanTypeName = sharesBalanceDTO_.PlanTypeName;
                }
                if (sharesBalanceDTO_ != null)
                {
                    var row = CreateDataRow(sharesBalanceDTO_);
                    sheetData.AppendChild(row);
                }
            }
        }
        worksheet.AppendChild(sheetData);
        worksheetPart.Worksheet = worksheet;

        var sheet = new Sheet() { Id = workbookPart.GetIdOfPart(worksheetPart), SheetId = 1, Name = "Selected sharesBalance" };

        var pageSetup = worksheetPart.Worksheet.GetElement<PageSetup>();

        pageSetup.Orientation = OrientationValues.Landscape;
        pageSetup.FitToWidth = 1;

        worksheetPart.Worksheet.Save();

        return sheet;
    }
    private IEnumerable<Row> CreateGridHeader(string PlanTypeName)
    {
        var rows = new List<Row>();
        // Constructing Grid Header Row and appending it to the sheet
        Row blankRow1 = new Row();
        blankRow1.Append(ConstructCell( "", CellValues.String, 0), ConstructCell("", CellValues.String, 0), ConstructCell("", CellValues.String, 0), ConstructCell("", CellValues.String, 0));
        rows.Add(blankRow1);
        Row blankRow2 = new Row();
        blankRow2.Append(ConstructCell( "", CellValues.String, 0), ConstructCell("", CellValues.String, 0), ConstructCell("", CellValues.String, 0), ConstructCell("", CellValues.String, 0));
        rows.Add(blankRow2);
        // Constructing Grid Plan Type Name and appending it to the sheet
        Row nameRow = new Row();
        nameRow.Append(ConstructCell( PlanTypeName, CellValues.String, 2), ConstructCell("", CellValues.String, 0), ConstructCell("", CellValues.String, 0), ConstructCell("", CellValues.String, 0));
        rows.Add(nameRow);
        // Constructing Grid Column Names and appending it to the sheet
        Row headerRow = new Row();
        headerRow.Append(
            ConstructCell("Name", CellValues.String, 1),
            ConstructCell("Description", CellValues.String, 1),
            ConstructCell("Begining Balance", CellValues.String, 1),
            ConstructCell("Ending Balance", CellValues.String, 1)
            );
        rows.Add(headerRow);
        return rows;
    }

    private IEnumerable<Row> CreateHeaderRows(string transactionCount, string StartDate, string EndDate)
    {
        var rows = new List<Row>();

        // Constructing Title row and appending it to the sheet
        Row titleRow = new Row() { RowIndex = 7 };
        titleRow.Append(ConstructCell("Shares Balance Export Report", CellValues.String, 2), ConstructCell("", CellValues.String, 0), ConstructCell("Confidential", CellValues.String, 2));
        rows.Add(titleRow);

        // Constructing Name row and appending it to the sheet
        Row nameRow = new Row();
        nameRow.Append(ConstructCell("EQM", CellValues.String, 2), ConstructCell(string.Format("Report Date: {0}", DateTime.Now.ToShortDateString()), CellValues.String, 2), ConstructCell("", CellValues.String, 0), ConstructCell("", CellValues.String, 0));
        rows.Add(nameRow);

        // Constructing DateRow row and appending it to the sheet
        Row dateRow = new Row();
        dateRow.Append(ConstructCell("", CellValues.String, 0), ConstructCell(string.Format("From Date: {0}", StartDate) + string.Format( "  To Date: {0}", EndDate), CellValues.String, 2),ConstructCell("", CellValues.String, 0));
        rows.Add(dateRow);

        // Constructing blank rows and appending it to the sheet
        Row blankRow = new Row();
        blankRow.Append(ConstructCell("", CellValues.String, 0), ConstructCell("", CellValues.String, 0), ConstructCell("", CellValues.String, 0));
        rows.Add(blankRow);

        Row transactionCountRow = new Row();
        transactionCountRow.Append(ConstructCell("", CellValues.Number, 0), ConstructCell(string.Format("Total Shares Balance Count: {0}", transactionCount), CellValues.String, 2),  ConstructCell("", CellValues.String, 0));
        rows.Add(transactionCountRow);

        // Constructing blank rows and appending it to the sheet
        Row secondBlankRow = new Row();
        secondBlankRow.Append(ConstructCell("", CellValues.String, 0), ConstructCell("", CellValues.String, 0), ConstructCell("", CellValues.String, 0));
        rows.Add(secondBlankRow);
        return rows;
    }

    private Columns CreateCustomColumns()
    {
        var columns = new Columns();

        columns.Append(new Column() { Min = 1, Max = 1, Width = 33, CustomWidth = true });
        columns.Append(new Column() { Min = 2, Max = 2, Width = 70, CustomWidth = true });
        columns.Append(new Column() { Min = 3, Max = 3, Width = 22, CustomWidth = true });
        columns.Append(new Column() { Min = 4, Max = 4, Width = 22, CustomWidth = true });
        return columns;
    }

    private Row CreateDataRow(SharesBalanceDTO_GetBalanceReportData_Result sharesBalanceDTO)
    {
        var row = new Row();
        var PlanName = Convert.ToString(sharesBalanceDTO.PlanName);
        var PlanDescription = Convert.ToString(sharesBalanceDTO.PlanDescription);
        var BeginingBalance = Convert.ToString(sharesBalanceDTO.BeginingBalance);
        var EndingBalance = Convert.ToString(sharesBalanceDTO.EndingBalance);
        row.Append
        (
            ConstructCell(PlanName, CellValues.String, 0),
            ConstructCell(PlanDescription, CellValues.String, 0),
            ConstructCell(BeginingBalance, CellValues.Number, 6),
            ConstructCell(EndingBalance, CellValues.Number, 6)
        );

        return row;
    }

    private Cell ConstructCell(string value, CellValues dataType, uint styleIndex = 0)
    {
        return new Cell()
        {
            CellValue = new CellValue(value),
            DataType = new EnumValue<CellValues>(dataType),
            StyleIndex = styleIndex,
        };
    }

    private Cell ConstructNumberCell(decimal value, CellValues dataType, uint styleIndex)
    {
        return new Cell()
        {
            CellValue = new CellValue(DecimalValue.FromDecimal(value)),
            DataType = new EnumValue<CellValues>(dataType),
            StyleIndex = styleIndex,
        };
    }

    public Stylesheet GenerateStylesheet()
    {
        Stylesheet ss = new Stylesheet();

        //Fonts fts = new Fonts();
        //DocumentFormat.OpenXml.Spreadsheet.Font ft = new DocumentFormat.OpenXml.Spreadsheet.Font();
        //FontName ftn = new FontName();
        //ftn.Val = "Calibri";
        //FontSize ftsz = new FontSize();
        //ftsz.Val = 11;
        //ft.FontName = ftn;
        //ft.FontSize = ftsz;
        //fts.Append(ft);
        //fts.Count = (uint)fts.ChildElements.Count;

        //Fills fills = new Fills();
        //Fill fill;
        //PatternFill patternFill;
        //fill = new Fill();
        //patternFill = new PatternFill();
        //patternFill.PatternType = PatternValues.None;
        //fill.PatternFill = patternFill;
        //fills.Append(fill);
        //fill = new Fill();
        //patternFill = new PatternFill();
        //patternFill.PatternType = PatternValues.Gray125;
        //fill.PatternFill = patternFill;
        //fills.Append(fill);
        //fills.Count = (uint)fills.ChildElements.Count;

        //Borders borders = new Borders();
        //Border border = new Border();
        //border.LeftBorder = new LeftBorder();
        //border.RightBorder = new RightBorder();
        //border.TopBorder = new TopBorder();
        //border.BottomBorder = new BottomBorder();
        //border.DiagonalBorder = new DiagonalBorder();
        //borders.Append(border);
        //borders.Count = (uint)borders.ChildElements.Count;

        Fonts fonts = new Fonts(
                      new Font(new FontSize() { Val = 10 }), // Index 0 - default 
                      new Font(new FontSize() { Val = 10 }, new Bold(), new Color() { Rgb = "FFFFFF" }), // Columns
                      new Font(new FontSize() { Val = 10 }, new Bold()) // Spreadsheet header
                      );
        Fills fills = new Fills(
            new Fill(new PatternFill() { PatternType = PatternValues.None }), // Index 0 - default
            new Fill(new PatternFill() { PatternType = PatternValues.LightTrellis }), // Index 1 - default
            new Fill(new PatternFill(new ForegroundColor() { Rgb = "012169" }) { PatternType = PatternValues.Solid }) // table columns
                );

        Borders borders = new Borders(new Border());

        CellFormats cfs = new CellFormats();
        //CellStyleFormats csfs = new CellStyleFormats();
        CellFormat cf = new CellFormat(); // default
        cfs.Append(cf); cfs.Count = (uint)cfs.ChildElements.Count;
        cf = new CellFormat { FontId = 1, FillId = 2, ApplyFill = true }; // table columns
        cfs.Append(cf); cfs.Count = (uint)cfs.ChildElements.Count;
        cf = new CellFormat { FontId = 2 }; // spreadsheet header
        cfs.Append(cf); cfs.Count = (uint)cfs.ChildElements.Count;
        cf = new CellFormat { FontId = 0, Alignment = new Alignment { WrapText = true } }; // Memo Wrap
        cfs.Append(cf); cfs.Count = (uint)cfs.ChildElements.Count;
        cf = new CellFormat { FontId = 0, NumberFormatId = 38 }; // numbers  
        cfs.Append(cf); cfs.Count = (uint)cfs.ChildElements.Count;
        cf = new CellFormat { FontId = 0, NumberFormatId = 8 }; // currency
        cfs.Append(cf); cfs.Count = (uint)cfs.ChildElements.Count;

        NumberingFormats nfs = new NumberingFormats();
        NumberingFormat nf;
        uint iExcelIndex = cfs.Count;

        nf = new NumberingFormat();
        nf.NumberFormatId = iExcelIndex++;
        nf.FormatCode = "#,###,###,###,###,###,###,###,###,##0.0000";
        nfs.Append(nf);
        cf = new CellFormat();
        cf.NumberFormatId = nf.NumberFormatId;
        cf.FontId = 0;
        cf.FillId = 0;
        cf.BorderId = 0;
        cf.FormatId = 0;
        cf.ApplyNumberFormat = true;
        cfs.Append(cf);

        nfs.Count = (uint)nfs.ChildElements.Count;
        cfs.Count = (uint)cfs.ChildElements.Count;

        ss.Append(nfs);
        ss.Append(fonts);
        ss.Append(fills);
        ss.Append(borders);
        ss.Append(cfs);

        //CellStyles css = new CellStyles();
        //CellStyle cs = new CellStyle();
        //cs.Name = "Normal";
        //cs.FormatId = 0;
        //cs.BuiltinId = 0;
        //css.Append(cs);
        //css.Count = (uint)css.ChildElements.Count;
        //ss.Append(css);

        //DifferentialFormats dfs = new DifferentialFormats();
        //dfs.Count = 0;
        //ss.Append(dfs);

        //TableStyles tss = new TableStyles();
        //tss.Count = 0;
        //tss.DefaultTableStyle = "TableStyleMedium9";
        //tss.DefaultPivotStyle = "PivotStyleLight16";
        //ss.Append(tss);

        return ss;
    }
}

}

farzinmonsef commented 3 years ago

ExcelImageExtensions.cs

using DocumentFormat.OpenXml; using DocumentFormat.OpenXml.Packaging; using DocumentFormat.OpenXml.Spreadsheet; using System; using System.IO; using System.Linq; using A = DocumentFormat.OpenXml.Drawing; using Xdr = DocumentFormat.OpenXml.Drawing.Spreadsheet;

namespace EQM.Extensions { public static class ExcelImageExtensions { public static T GetElement(this Worksheet worksheet) where T : OpenXmlElement, new() { var element = worksheet.Elements().FirstOrDefault();

        if (element == null)
        {
            element = new T();

            worksheet.Append(element);
        }

        return element;
    }

    public static void InsertImage(SpreadsheetDocument doc, string imagePath, int column, int row, int offsetX = 0, int offsetY = 0, int? maxWidth = null, int? maxHeight = null)
    {

        using (var stream = new FileStream(imagePath, FileMode.Open, FileAccess.Read, FileShare.Read))
        {
            InsertImage(doc, stream, column, row, offsetX, offsetX, maxWidth, maxHeight);
        }
    }
    private static void InsertImage(SpreadsheetDocument doc, Stream imageStream, int column, int row, int offsetX = 0, int offsetY = 0, int? maxWidth = null, int? maxHeight = null)
    {
        if (column < 1) throw new ArgumentOutOfRangeException("Column index starts at 1.");
        if (row < 1) throw new ArgumentOutOfRangeException("Row index starts at 1.");

        var workbookpart = doc.WorkbookPart;
        var worksheetPart = workbookpart.GetPartsOfType<WorksheetPart>().First();

        var drawingsPart = worksheetPart.AddNewPart<DrawingsPart>();

        if (!worksheetPart.Worksheet.ChildElements.OfType<Drawing>().Any())
        {
            worksheetPart.Worksheet.Append(new Drawing { Id = worksheetPart.GetIdOfPart(drawingsPart) });

        }

        if (drawingsPart.WorksheetDrawing == null)
        {
            drawingsPart.WorksheetDrawing = new Xdr.WorksheetDrawing();
        }
        var worksheetDrawing = drawingsPart.WorksheetDrawing;

        var imagePart = drawingsPart.AddImagePart(ImagePartType.Jpeg);

        imagePart.FeedData(imageStream);

        var positioningEMU = new ImagePositioningEMU(imagePart.GetStream(), offsetX, offsetY, maxWidth, maxHeight);

        A.Extents extents = new A.Extents();

        var extentsCx = positioningEMU.Width;
        long extentsCy = positioningEMU.Height;

        if (extentsCy > positioningEMU.MaxHeight || extentsCx > positioningEMU.MaxWidth)
        {
            var scaleX = (double)extentsCx / (double)positioningEMU.MaxWidth;
            var scaleY = (double)extentsCy / (double)positioningEMU.MaxHeight;
            var scale = Math.Max(scaleX, scaleY);
            extentsCx = (int)((double)extentsCx / scale);
            extentsCy = (int)((double)extentsCy / scale);
        }

        var colOffset = positioningEMU.OffsetX;
        var rowOffset = positioningEMU.OffsetY;

        var nvps = worksheetDrawing.Descendants<Xdr.NonVisualDrawingProperties>();
        var nvpId = nvps.Count() > 0 ?
            (UInt32Value)worksheetDrawing.Descendants<Xdr.NonVisualDrawingProperties>().Max(p => p.Id.Value) + 1 :
            1U;

        var oneCellAnchor = new Xdr.OneCellAnchor(
            new Xdr.FromMarker
            {
                ColumnId = new Xdr.ColumnId((column - 1).ToString()),
                RowId = new Xdr.RowId((row - 1).ToString()),
                ColumnOffset = new Xdr.ColumnOffset(colOffset.ToString()),
                RowOffset = new Xdr.RowOffset(rowOffset.ToString())
            },
            new Xdr.Extent { Cx = extentsCx, Cy = extentsCy },
            new Xdr.Picture(
                new Xdr.NonVisualPictureProperties(
                    new Xdr.NonVisualDrawingProperties { Id = nvpId, Name = "Picture " + nvpId },
                    new Xdr.NonVisualPictureDrawingProperties(new A.PictureLocks { NoChangeAspect = true })
                ),
                new Xdr.BlipFill(
                    new A.Blip { Embed = drawingsPart.GetIdOfPart(imagePart), CompressionState = A.BlipCompressionValues.Print },
                    new A.Stretch(new A.FillRectangle())
                ),
                new Xdr.ShapeProperties(
                    new A.Transform2D(
                        new A.Offset { X = 0, Y = 0 },
                        new A.Extents { Cx = extentsCx, Cy = extentsCy }
                    ),
                    new A.PresetGeometry { Preset = A.ShapeTypeValues.Rectangle }
                )
            ),
            new Xdr.ClientData()
        );

        worksheetDrawing.Append(oneCellAnchor);

        doc.WorkbookPart.Workbook.Save();
    }
}

}

farzinmonsef commented 3 years ago

ImagePositioningEMU.cs

using System.Drawing; using System.IO;

namespace EQM.Extensions { public class ImagePositioningEMU {

region Fields

    private int _maxWidth;
    private int _maxHeight;

    private int _width;
    private int _height;

    private int _offsetX;
    private int _offsetY;

    private float _verticalResolution;
    private float _horizontalResolution;
    #endregion

    #region Properties
    public int MaxWidth
    {
        get { return ConvertToEmu(_maxWidth, _horizontalResolution); }
    }

    public int MaxHeight
    {
        get { return ConvertToEmu(_maxHeight, _verticalResolution); }
    }

    public int Width
    {
        get { return ConvertToEmu(_width, _horizontalResolution); }
    }

    public int Height
    {
        get { return ConvertToEmu(_height, _verticalResolution); }
    }

    public int OffsetX
    {
        get { return ConvertToEmu(_offsetX, _horizontalResolution); }
    }

    public int OffsetY
    {
        get { return ConvertToEmu(_offsetY, _verticalResolution); }
    }

    private int ConvertToEmu(int pixels, float resolution)
    {
        return (int)(914400 * pixels / resolution);
    }
    #endregion

    #region Methods
    public ImagePositioningEMU(Stream imageStream, int offsetX, int offsetY, int? maxWidth = null, int? maxHeight = null)
    {
        _offsetX = offsetX;
        _offsetY = offsetY;

        using (var bitmap = new Bitmap(imageStream))
        {
            _width = bitmap.Width;
            _height = bitmap.Height;
            _horizontalResolution = bitmap.HorizontalResolution;
            _verticalResolution = bitmap.VerticalResolution;
        }

        _maxWidth = maxWidth.GetValueOrDefault(_width);
        _maxHeight = maxHeight.GetValueOrDefault(_height);
    }
    #endregion
}

}

farzinmonsef commented 3 years ago

transaction.css

.k-list-optionlabel.k-state-selected { color: white !important; background: #dbdde0 !important; }

.k-list .k-state-selected { color: white !important; background: #12026f !important; }

.k-state-selected a.k-link { color: white !important; background: #12026f !important; }

.NonVisible { display: none }

wbotoomborder { border-bottom: 1pt solid #e9e9e9; }

.navyBlue { color: white !important; background-color: #12026f !important; font-weight: normal; padding: 0px 0px 0px 20px; }

.navyBlueHelp { color: white !important; font-size: xx-small; right: 20px !important; width: 100%; text-align: right !important; }

.k-window-titlebar { background-color: #12026f !important; color: white; }

.k-window-actions { background-color: #12026f !important; color: white; }

.k-listview { background-color: #12026f !important; color: white; text-decoration-color: white; text-emphasis-color: white; }

.btnEditTransaction { Background-color: #FFFFFF !important; font: 16px Connections !important; color: #012169 !important; Border: 1px solid #012169 !important; Border-radius: 0px !important; }

.k-outline-primary { background-color: white !important; color: darkblue; text-decoration-color: darkblue; text-emphasis-color: darkblue; border-color: darkblue; }

.Wait { }

.Normal { } / override input cursors with a more specific CSS selector / .Wait INPUT { cursor: wait; }

.Normal INPUT { cursor: default; color: #0d005d } / override grid cursors with a more specific CSS selector / .Wait TABLE { cursor: wait; }

.Normal TABLE { cursor: default; }

.k-popup-edit-form .k-edit-buttons { margin-top: 15px; border: none; text-align: center; }

.k-edit-form-container { width: 100% !important; }

.k-btn-grayed { background-color: #e4e2e2; }

.transactionHeader { font-size: 24px; }

.k-dropdown { Border: 1px solid #CCD3E1 !important; Background-color: #FFFFFF !important; Font: 16px Connections !important; }

.k-dropdown .k-dropdown-wrap { Background-color: #FFFFFF !important; border-radius: 0 !important; Font: 16px Connections !important; }

.btnNewTransaction { Background-color: #E31837 !important; font: 16px Connections !important; color: #FFFFFF !important; Border: none !important; Border-radius: 0px !important; } .btnNewTransaction:hover { transform: scale(1.05); font-weight: 500 !important; }

a.btn-bofa-blue { Background-color: #012169 !important; font: 16px Connections !important; color: #FFFFFF !important; Border: 1px solid #012169 !important; Border-radius: 0px !important; }

.ok-button { Background-color: #012169 !important; font: 16px Connections !important; color: #FFFFFF !important; /Border: none !important;/ Border-radius: 5px !important; Border: 1px solid #ffffff !important; }

.cancel-button { Background-color: #cecece !important; font: 16px Connections !important; color: #012169 !important; /Border: none !important;/ Border-radius: 5px !important; Border: 1px solid #ffffff !important; }

.btnPreviewLetter, .k-primary { Background-color: #012169 !important; font: 16px Connections !important; color: #FFFFFF !important; /Border: none !important;/ Border-radius: 0px !important; Border: 1px solid #ffffff !important; }

.k-grid-cancel { Background-color: #E4E7EB !important; font: 16px Connections !important; color: #000000 !important; Border: none !important; Border-radius: 0px !important; }

a.k-header-column-menu.k-state-active { color: #212529 !important; background-color: transparent !important; }

.k-window { z-index: 7777 !important; animation: NeonLight 6s infinite; }

body { font-family: Arial, Helvetica, sans-serif; } / The Modal (background) / .alertboxmodal { display: none; / Hidden by default / position: fixed; / Stay in place / z-index: 9000; / Sit on top / padding-top: 100px; / Location of the box / left: 0; top: 0; width: 100%; / Full width / height: 100%; / Full height / overflow: auto; / Enable scroll if needed / background-color: rgb(0,0,0); / Fallback color / background-color: rgba(0,0,0,0.4); / Black w/ opacity / }

.tablealertboxmodal { animation: NeonLight 6s infinite; }

.alertbox { border: solid 1px #999999; animation: NeonLight 6s infinite; }

@keyframes NeonLight { 0% { box-shadow: 0 0 5px #444444, 0 0 10px #444444; transition: box-shadow 2s; }

50% {
    box-shadow: 0 0 20px #444444, 0 0 60px #444444;
    transition: box-shadow 2s;
}

100% {
    box-shadow: 0 0 5px #444444, 0 0 10px #444444;
    transition: box-shadow 2s;
}

} / Modal Content / .alertboxmodal-content { background-color: #fefefe; margin: auto; padding: 20px; border: 1px solid #888; width: 40%; }

.k-grid { color: #000000 !important; font: 16px Connections; }

.k-grid .k-alt { background-color: #f5f5f5 !important; } / The Close Button / .close { color: #aaaaaa; float: right; font-size: 28px; font-weight: bold; }

.close:hover,
.close:focus {
    color: #000;
    text-decoration: none;
    cursor: pointer;
}

/.k-grouping-header, .k-grid-header { Background-color: #f5f5f5; Border-top: 1px solid #CCD3E1; Border-bottom: 1px solid #CCD3E1; Border-left: none; Border-right: none; font: 16px Connections; color: #000000; }/ /=======================================================================================/ .btnPreviewLetter:disabled, .k-primary:disabled { background-color: gray !important; }

/button:hover { background-color: #05036a; color: #ffffff; }/ /border: 1px solid #0099cc;/ /button:hover { background-color: #05036a; color: #ffffff; cursor: grab; }/

.btn:hover { border: 1px solid #000000; cursor: grab; }

.k-grid-content .k-button.k-grid-delete::before { content: "\f1f8" !important; }

.fa.fa-paperclip { font-size: 1.5em; color: red; }

.fa.fa-trash-o { font-size: 1.5em; } /.fa-trash-o:hover { color: #E31837 !important; } / .btndeleteTransaction { /color: gray !important;/ background-color: white !important; }

.btndeleteActive { /color: gray !important;/ background-color: transparent !important; }

.fa-paperclip:hover { color: gray !important; -moz-box-shadow: 0 0 0 7px rgba(127,0,0,0.2); -webkit-box-shadow: 0 0 0 7px rgba(127,0,0,0.2); box-shadow: 0 0 0 7px rgba(127,0,0,0.2); -moz-transition: -moz-box-shadow .1s; -webkit-transition: -webkit-box-shadow .1s; transition: box-shadow .1s; }

.k-tooltip { color: white !important; background-color: #12026f !important; border-color: lightgray !important; border-width: 1px !important; border-radius: 3px !important; box-shadow: rgba(0, 0, 0, 0.5) 0 4px 20px; }

.btnEditTransaction:hover, .btndeleteTransaction:hover, /.btndeleteActive:hover,/ .btnPreviewLetter:hover { color: #E31837 !important; border-color: #E31837 !important; border-width: 1px !important; border-radius: 1px !important; } /a.btn-bofa-blue:hover { color: #E31837 !important; border-color: #E31837 !important; border-width: 1px !important; border-radius: 1px !important; }/ .k-window { z-index: 7777 !important; }

tr { vertical-align: bottom; }

transactiongrid > table > tbody > tr > td:hover {

color: #E31837 !important;

}

.button-row button, .button-row a { margin-left: .5rem; }

.k-pager-wrap .k-link, .k-pager-wrap .k-pager-nav { color: #12026f !important; }

.k-pager-numbers .k-state-selected, .k-pager-numbers .k-state-selected { background-color: #12026f !important; color: #ffffff !important; }

.k-button.k-button-icontext.k-grid-Export.Data:hover { text-decoration: underline !important; color: #ffffff !important; background-color: royalblue !important; }

li:hover { background-color: #12026f !important; color: #ffffff !important; } /li.k-item :hover { background-color: #12026f !important; color: #ffffff !important; }/ th:hover { color: #12026f !important; font-weight: 700; text-decoration: underline; }

.k-button.k-state-focused, .k-button:focus { box-shadow: 0 0 0 3px rgba(0, 123, 255, .5) !important; }

.eqmhiddinTh { display: none; }

.eqmactionheader { text-align: center !important; }

.btnNewTransaction:focus { box-shadow: 0 0 0 5px rgba(0, 123, 255, .5) !important; }

TransactionEffectiveDate:focus {

box-shadow: 0 0 0 3px rgba(0, 123, 255, .5) !important;

}

.k-menu-link k-state-selected { box-shadow: 0 0 0 3px rgba(0, 123, 255, .5) !important; }

.k-input:focus { box-shadow: 0 0 0 3px rgba(0, 123, 255, .5) !important; }

.k-dropdown .k-dropdown-wrap.k-state-focused .k-input { box-shadow: 0 0 0 3px rgba(0, 123, 255, .5) !important; }

.k-calendar .k-state-focused .k-link { box-shadow: 0 0 0 3px rgba(0, 123, 255, .5) !important; }

.k-grid th.k-state-focused { box-shadow: 0 0 0 3px rgba(0, 123, 255, .5) !important; }

.k-pager-sizes-custom .k-list .k-state-selected { background: #12026f !important; color: #ffffff !important; border: 1px solid #12026f !important; }

div > .k-grid-content .k-auto-scrollable { height: 300px !important; }

@media only screen and ( min-width: 600px ) { div > .k-grid-content { height: 500px !important; } }

farzinmonsef commented 3 years ago

Site.css

@font-face { font-family: Connections; src: url('Fonts/Connections.woff') format('woff'); font-style: normal; font-size: 16px; }

.appHeader { font-size: 32px; }

bofaLogo {

height: 25%;
width: 45%;

}

btnFilter{

background-color:#e8e8e8;
border:1px;
border-color:darkgray;

}

.btn { font: 16px Connections !important; Border-radius: 0px !important; }

.btn-bofa-blue { Background-color: #012169 !important; font: 16px Connections !important; color: #FFFFFF !important; Border: 1px solid #012169 !important; Border-radius: 0px !important; }

.btn-bofa-blue:hover { text-decoration: underline; }

.btn-bofa-red { Background-color: #E31837 !important; font: 16px Connections !important; color: #FFFFFF !important; Border: 1px solid #E31837 !important; Border-radius: 0px !important; } .btn-bofa-white { Background-color: white !important; font: 16px Connections !important; color: black !important; Border: 1px solid black !important; Border-radius: 0px !important; }

.btn-bofa-red:hover { Background-color: #E31837 !important; text-decoration: underline; }

.page-banner { color: white; background-color: #12026f; font-weight: normal; }

.page-title { font-size: 24px; }

farzinmonsef commented 3 years ago

_Layout.cshtml

<!DOCTYPE html>

@ViewBag.Title - Equity Management @Styles.Render("~/Content/css") @Scripts.Render("~/bundles/jquery") @Scripts.Render("~/bundles/kendo") @RenderSection("Styles", false)
@RenderBody()
@Scripts.Render("~/bundles/modernizr") @Scripts.Render("~/bundles/bootstrap") @Scripts.Render("~/bundles/jqueryval") @Scripts.Render("~/bundles/site")
farzinmonsef commented 3 years ago

_PlanBalanceGrid.cshtml

@using Entitites @model IEnumerable

@(Model.FirstOrDefault().PlanTypeName) @{ if (Model.Any(p => p.UserCanEdit == true)) { Create @Model.FirstOrDefault().PlanTypeName } }

@(Html.Kendo().Grid(Model) .Name("plan_balancetype" + Model.FirstOrDefault().PlanTypeId) .Columns(columns => { columns.Select().Width(30); columns.Bound(p => p.PlanName).Title("Name").Width(200); columns.Bound(p => p.PlanDescription).Title("Description").Width(500); columns.Bound(p => p.BeginingBalance).Title("Beginning Balance").Format("{0:n4}").Width(200); columns.Bound(p => p.EndingBalance).Format("{0:n4}").Width(200); columns.Bound(p => p.PlanNameId).Width(100).Title("Actions") .ClientTemplate("# if(UserCanEdit) {# #}#"); }) .DataSource(dataSource => dataSource.Ajax() ) .Navigatable() )

farzinmonsef commented 3 years ago

Error.cshtml

@model System.Web.Mvc.HandleErrorInfo

@{ ViewBag.Title = "Error"; Layout = "~/Views/Shared/_Layout.cshtml"; }

@@

@*<!DOCTYPE html>

Error *@ @**@

The Equity Management System encountered an Error
Please Contact your System Administrator

@if (Model != null) {
@Model.Exception.Message
@Model.ControllerName
} @**@ @**@
farzinmonsef commented 3 years ago

NotSupported.cshtml

@{ ViewBag.Title = "Not Supported"; Layout = "~/Views/Shared/_Layout.cshtml"; }

Equity Management does not support Internet Explorer. Please use Google Chrome.

Return to Flagscape
farzinmonsef commented 3 years ago

Unauthorized.cshtml

@{ Layout = "~/Views/Shared/_Layout.cshtml"; }

You are not authorized to access this application.

Please contact the Corporate Secretary office via email to gain access.

farzinmonsef commented 3 years ago

Global.asax

using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using System.Web.Optimization; using System.Web.Routing; using Business; using Common; using Data; using Entitites; using EQM.Enumerations;

namespace EQM { public class MvcApplication : System.Web.HttpApplication { protected void Application_Start() { AreaRegistration.RegisterAllAreas(); FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); RouteConfig.RegisterRoutes(RouteTable.Routes); BundleConfig.RegisterBundles(BundleTable.Bundles); }

    protected void session_Start()
    {

        User currentUser = Authenticate();
        initiateSeassionVariables(currentUser);

        // Check for Internet Explorer and redirect to NotSupported.cshtml
        HttpBrowserCapabilities browser = Request.Browser;
        if (browser?.Browser == "IE" || browser?.Browser == "InternetExplorer")
        {
            Session["ValidBrowser"] = false;
            return;
        }
        else
        {
            Session["ValidBrowser"] = true;
        }

        LogInDB();

    }
    /// <summary>
    /// Log User in database, table LogDB
    /// </summary>
    protected void LogInDB()
    {
        HttpContext context = HttpContext.Current;
        string standardId = context.User.Identity.Name;
        // Remove the domain
        standardId = standardId.Substring(standardId.IndexOf(@"\") + 1,
                                          standardId.Length - standardId.IndexOf(@"\") - 1);
        string requestUrl = context.Request.Url.ToString();
        Logging logger = new Logging();
        logger.LogSessionStart(standardId, requestUrl);
    }
    /// <summary>
    /// Autheticate User if allowed to Login or Not
    /// </summary>
    /// <returns></returns>
    protected User Authenticate()
    {
        string standardId = System.Web.HttpContext.Current.User.Identity.Name;
        User currentUser = BusAuthentication.AuthenticateUserAccess(standardId);
        Session["Authenticated"] = (currentUser == null) ? false : true;
        return currentUser;
    }
    /// <summary>
    /// Initiate Staring Session Variables
    /// </summary>
    /// <param name="currentUser"></param>
    public void initiateSeassionVariables(User currentUser)
    {
        //Get a random number to user
        Random random = new Random();
        int userNumber = random.Next(100000, 999999);
        Session["userNumber"] = userNumber;

        if (currentUser != null)
        {
            Session["NumberFormatedNegative"] = "4,15";
            //Get User Details in Session Variables
            Session["userId"] = currentUser.UserID;
            Session["userEmail"] = currentUser.Email;
            Session["userRole"] = currentUser.RoleID;
            Session["currentUser"] = currentUser;

            //Initiate Drop Down Lists, From database values, Table Types 
            RoleData roleData = new RoleData();
            Session["RoleList"] = roleData.FindAllRoles();

            //Session["PlanNameList"] = typeData.FindTypeByTypeNo((int)TypeNo.PlanName, (int)TypeNoState.enabled, (int)RoleType.Administrator);
            TypeData typeData = new TypeData();
            Session["CategoryList"] = typeData.FindTypeByTypeNo((int)TypeNo.Category, (int)TypeNoState.enabled, currentUser.RoleID);

            //PlanNameData planNameData = new PlanNameData();
            //Session["ReservePlanNameList"] = planNameData.FindPlanNameByTypeId((int)PlanTypeEnum.Reserve);
            PlanNameData planNameData = new PlanNameData();
            Session["ReservePlanNameList"] = planNameData.FindPlanNameByTypeId((int)PlanTypeEnum.Reserve, true);
            Session["AccountNameList"] = planNameData.FindPlanNameByTypeId((int)PlanTypeEnum.Account, true);
            Session["PreferredSharesPlanNameList"] = planNameData.FindPlanNameByTypeId((int)PlanTypeEnum.PreferredShares);

            //Initiate Drop Down for TransactionTypeList as a string seperated with |
            List<Entitites.Type> TransactionTypeList = typeData.FindTypeByTypeNo((int)TypeNo.TransactionType, (int)TypeNoState.enabled, (int)RoleType.Administrator);
            Session["TransactionTypeList"] = TransactionTypeList;
            string tmp = "";
            foreach (var tt in TransactionTypeList)
            {
                tmp += (tmp != "" ? "|" : "") + tt.SubTypeNo + "^" + tt.Id + "^" + tt.Name;
            }
            Session["StrTransactionTypeList"] = tmp; 
            // string.Join("|", TransactionTypeList);

            //Initiate All Status Names & Id in Session Variables
            System.Collections.IEnumerable StatusList = typeData.FindTypeByTypeNo((int)TypeNo.Status, (int)TypeNoState.enabled, (int)RoleType.Administrator);
            foreach (Entitites.Type t in StatusList)
            {
                Session["Status_" + t.Name.ToString()] = t.Id;
            }
        }
    }
}

}

farzinmonsef commented 3 years ago

Data\Helpers\TemporalTableCommandTreeInterceptor.cs

using System.Collections.Generic; using System.Collections.ObjectModel; using System.Data.Entity.Core.Common.CommandTrees; using System.Data.Entity.Core.Metadata.Edm; using System.Data.Entity.Infrastructure.Interception; using System.Linq;

namespace Data.Helpers { internal class TemporalTableCommandTreeInterceptor : IDbCommandTreeInterceptor { private static readonly List _namesToIgnore = new List { "SysStartTime", "SysEndTime" };

    public void TreeCreated(DbCommandTreeInterceptionContext interceptionContext)
    {
        if (interceptionContext.OriginalResult.DataSpace == DataSpace.SSpace)
        {
            var insertCommand = interceptionContext.Result as DbInsertCommandTree;
            if (insertCommand != null)
            {
                var newSetClauses = GenerateSetCluases(insertCommand.SetClauses);

                var newCommand = new DbInsertCommandTree(
                    insertCommand.MetadataWorkspace,
                    insertCommand.DataSpace,
                    insertCommand.Target,
                    newSetClauses,
                    insertCommand.Returning
                    );

                interceptionContext.Result = newCommand;
            }
        }
    }

    private static ReadOnlyCollection<DbModificationClause> GenerateSetCluases(IList<DbModificationClause> modificationClauses)
    {
        var props = new List<DbModificationClause>(modificationClauses);
        props = props.Where(_ => !_namesToIgnore.Contains((((_ as DbSetClause)?.Property as DbPropertyExpression)?.Property as EdmProperty)?.Name)).ToList();
        var newSetClauses = new ReadOnlyCollection<DbModificationClause>(props);
        return newSetClauses;
    }
}

}

farzinmonsef commented 3 years ago

TransactionMetaData.cs

using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.ComponentModel.DataAnnotations; //using Attributes;

namespace Entitites { [MetadataType(typeof(TransactionMetaData))] public partial class Transaction { public static explicit operator List(Transaction t) { throw new NotImplementedException(); } } public class TransactionMetaData { [Display(Name = "Transaction ID")] [Editable(false)] [UIHint("NumberFormatedDisbled")] public int Id { get; set; }

    [UIHint("DropDownCategory")]
    [Required(ErrorMessage = "Category is required.")]
    [Display(Name = "Category")]
    public Nullable<int> CategoryId { get; set; }

    [UIHint("DropDownTransactionType")]
    [Required(ErrorMessage = "Transaction Type is required.")]
    [Display(Name = "Transaction Type")]
    public Nullable<int> TransactionType { get; set; }

    [DataType(DataType.Date)]
    [Display(Name = "Entry Date")]
    public string EntryDate { get; set; }

    [Required(ErrorMessage = "Date is required.")]
    [DataType(DataType.Date)]
    [Display(Name = "Effective Date")]
    public string TransactionEffectiveDate { get; set; }

    [StringLength(75)]
    [RequiredIf(Field = "TransactionType", Values = "3|4|14|15", ErrorMessage = "Requistion Number is required for this Transaction Type")]
    [Display(Name = "Requisition Number")]
    public string RequisitionNumber { get; set; }

    //[StringLength(255)]
    //[RequiredIf(Field = "TransactionType", Values = "14|15|6", ErrorMessage = "Reserve Name is required for this Transaction Type")]
    //[Display(Name = "Reserve Name")]
    //public string ReserveName { get; set; }

    [UIHint("NumberFormatedNegative")]
    [RequiredIf(Field = "TransactionType", Values = "14|15", ErrorMessage = "Total Vested Shares is required for this Transaction Type")]
    [Display(Name = "Total Vested Shares")]
    public string TotalVestedShares { get; set; }

    [StringLength(255)]
    [Display(Name = "Memo")]
    [UIHint("TextArea")]
    public Nullable<bool> Memo { get; set; }

    //[StringLength(255)]
    //[Display(Name = "Attachments")]
    //public byte[] Attachments { get; set; }

    [Display(Name = "Status")]
    public Nullable<int> Status { get; set; }

    [StringLength(255)]
    [UIHint("TextFileUpload")]
    [Display(Name = "File Name")]
    public Nullable<int> FileName { get; set; }

    [UIHint("NumberFormatedNegative")]
    [Display(Name = "Shares For Tax")]
    public Nullable<int> SharesForTax { get; set; }

    [UIHint("NumberFormatedNegative")]
    [RequiredIf(Field = "TransactionType", Values = "3|4", ErrorMessage = "Net Shares To Broker is required for this Transaction Type")]
    [Display(Name = "Net Shares To Broker")]
    public Nullable<int> NetSharesToMerrillLynch { get; set; }
    [UIHint("NumberFormatedNegative")]
    [Display(Name = "Total Vested Shares")]
    [RequiredIf(Field = "TransactionType", Values = "3|4", ErrorMessage = "Total Vested Shares is required for this Transaction Type")]
    public Nullable<int> TotalShares { get; set; }

    [UIHint("NumberFormated2FractionNegative")]
    [RequiredIf(Field = "TransactionType", Values = "3|4|5|6|7", ErrorMessage = "Value Of Tax Shares is required for this Transaction Type")]
    [Display(Name = "Value Of Tax Shares")]
    public Nullable<int> ValueOfTaxShares { get; set; }

    [UIHint("DropDownReservePlanName")]
    [RequiredIf(Field = "TransactionType", Values = "5|6|14|15", ErrorMessage = "Reserve Name is required for this Transaction Type")]
    [Display(Name = "Reserve Name")]
    public Nullable<int> PlanNameId { get; set; }

    [UIHint("NumberFormated")]
    [RequiredIf(Field = "TransactionType", Values = "5", ErrorMessage = "Gross Stock Units Distributed is required for this Transaction Type")]
    [Display(Name = "Gross Stock Units Distributed")]
    public Nullable<int> GrossStockUnitsDistributed { get; set; }

    [UIHint("NumberFormated")]
    [RequiredIf(Field = "TransactionType", Values = "5", ErrorMessage = "Net Stock Unit Shares to Distribute is required for this Transaction Type")]
    [Display(Name = "Net Stock Unit Shares to Distribute")]
    public Nullable<int> NetStockUnitSharestoDistribute { get; set; }

    [UIHint("NumberFormated")]
    [RequiredIf(Field = "TransactionType", Values = "5|6|7|10|8", ErrorMessage = "Cancel & Retire Shares is required for this Transaction Type")]
    [Display(Name = "Cancel & Retire Shares (R469)")]
    public Nullable<int> CancelandRetireShares { get; set; }

    //Director Grant ===============================================================================
    [UIHint("NumberFormated")]
    [RequiredIf(Field = "TransactionType", Values = "6", ErrorMessage = "Common Restricted Unvested Shares INTO CR1 is required for this Transaction Type")]
    [Display(Name = "Common Restricted Unvested Shares INTO CR1")]
    public Nullable<int> CommonRestrictedUnvestedSharesINTOCR1 { get; set; }

    [UIHint("NumberFormated")]
    [RequiredIf(Field = "TransactionType", Values = "6", ErrorMessage = "Common Restricted Unvested Shares Granted is required for this Transaction Type")]
    [Display(Name = "Common Restricted Unvested Shares Granted")]
    public Nullable<int> CommonRestrictedUnvestedSharesGranted { get; set; }

    //Director Vesting =============================================================================
    [UIHint("NumberFormated")]
    [RequiredIf(Field = "TransactionType", Values = "7", ErrorMessage = "Common Restricted Unvested Shares FROM CR1 is required for this Transaction Type")]
    [Display(Name = "Common Restricted Unvested Shares FROM CR1")]
    public Nullable<int> CommonRestrictedUnvestedSharesFROMCR1 { get; set; }

    [UIHint("NumberFormated")]
    [RequiredIf(Field = "TransactionType", Values = "7", ErrorMessage = "Common Restricted Share INTO CR2 is required for this Transaction Type")]
    [Display(Name = "Common Restricted Shares INTO CR2")]
    public Nullable<int> CommonRestrictedShareINTOCR2 { get; set; }

    //Director Grant & Vesting =====================================================================
    [StringLength(255)]
    [Display(Name = "Director Name")]
    public Nullable<int> DirectorName { get; set; }
    //GHR -Retire Treasury Shares =====================================================================
    [UIHint("DropDownAccountName")]
    [RequiredIf(Field = "TransactionType", Values = "10", ErrorMessage = "Account Name is required for this Transaction Type")]
    [Display(Name = "Account Name")]
    public Nullable<int> AccountNameId { get; set; }

    [UIHint("DropDownPreferredShares")]
    [RequiredIf(Field = "TransactionType", Values = "22", ErrorMessage = "Preferred Shares Name is required for this Transaction Type")]
    [Display(Name = "Preferred Shares Name")]
    public Nullable<int> PreferredSharesNameId { get; set; }

    [UIHint("NumberFormated")]
    [RequiredIf(Field = "TransactionType", Values = "22", ErrorMessage = "Preferred Shares is required for this Transaction Type")]
    [Display(Name = "PreferredShares")]
    public Nullable<int> PreferredShares { get; set; }

    [UIHint("NumberFormated")]
    [RequiredIf(Field = "TransactionType", Values = "10", ErrorMessage = "Total Treasury Shares to Retire is required for this Transaction Type")]
    [Display(Name = "Total Treasury Shares")]
    public Nullable<int> TotalTreasurySharestoRetire { get; set; }
    //CFO -Share Repurchase=====================================================================
    [StringLength(255)]
    [RequiredIf(Field = "TransactionType", Values = "8", ErrorMessage = "Broker Name is required for this Transaction Type")]
    [Display(Name = "Broker Name")]
    public Nullable<int> BrokerName { get; set; }
    [UIHint("Number")]
    [RequiredIf(Field = "TransactionType", Values = "8", ErrorMessage = "DTC Participant Number is required for this Transaction Type")]
    [Display(Name = "DTC Participant Number")]
    public Nullable<int> DTCParticipantNumber { get; set; }
    [UIHint("NumberFormated")]
    [RequiredIf(Field = "TransactionType", Values = "8", ErrorMessage = "Shares is required for this Transaction Type")]
    [Display(Name = "Shares")]
    public Nullable<int> DispositionOfShares { get; set; }
    [UIHint("NumberFormated")]
    [Display(Name = "Treasury Account Shares (T35)")]
    public Nullable<int> TreasuryAccountShares { get; set; }
    [UIHint("NumberFormated4Fraction")]
    [Display(Name = "Acquisition Price per Share (without commission)")]
    public Nullable<int> AcquisitionPricePerShare { get; set; }
    [UIHint("NumberFormated2Fraction")]
    [Display(Name = "Commission per Share")]
    public Nullable<int> CommissionPerShare { get; set; }
    [UIHint("NumberFormated2Fraction")]
    [Display(Name = "Cost of Total Treasury Shares (without commission)")]
    public Nullable<int> CostOfTotalTreasuryShares { get; set; }

    [UIHint("RadioButton")]
    [RequiredIf(Field = "TransactionType", Values = "22", ErrorMessage = "Action is required for this Transaction Type")]
    public string Action { get; set; }

}

}

farzinmonsef commented 3 years ago

Entities\RequiredIfAttribute.cs

using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Web.Mvc;

namespace Entitites { [AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = true)] public class RequiredIfAttribute : ValidationAttribute, IClientValidatable { public string Field { get; set; } public string Values { get; set; }

    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
    {
        var rule = new ModelClientValidationRule
        {
            ErrorMessage = ErrorMessage,
            ValidationType = "requiredif"
        };
        rule.ValidationParameters["field"] = Field;
        rule.ValidationParameters["values"] = Values;
        yield return rule;
    }
    private const string DefaultErrorMessageFormatString = "The {0} field is required.";

    private bool IsValueRequired(string checkValue, Object currentValue)
    {
        if (checkValue.Equals("!null", StringComparison.InvariantCultureIgnoreCase))
        {
            return currentValue != null;
        }
        return checkValue.Equals(currentValue.ToString());
    }

    protected override ValidationResult IsValid(Object value, ValidationContext context)
    {
        Object instance = context.ObjectInstance;
        System.Type type = instance.GetType();
        bool valueRequired = false;
        var ValuesArray = Values.Split('|').ToList();
        Object propertyValue = type.GetProperty(Field).GetValue(instance, null);
        for (int i = 0; i < ValuesArray.Count; i++) {
            valueRequired = IsValueRequired(ValuesArray[i], propertyValue);
            if (valueRequired) break;
        }

        if (valueRequired)
        {
            return !string.IsNullOrEmpty(Convert.ToString(value))
                ? ValidationResult.Success
                : new ValidationResult(ErrorMessage != "" ? ErrorMessage
                            : string.Format(DefaultErrorMessageFormatString, context.DisplayName));
        }
        return ValidationResult.Success;
    }
}

}

farzinmonsef commented 3 years ago

SQL- Create LOGDB

/** Object: Table [EQMUSER].[LogDB] Script Date: 12/21/2020 1:58:15 PM **/ SET ANSI_NULLS ON GO

SET QUOTED_IDENTIFIER ON GO

CREATE TABLE [EQMUSER].[LogDB]( [Id] [INT] IDENTITY(1,1) NOT NULL, [Date_Time] [DATETIME] NULL, [UserName] VARCHAR NULL, [Controller] VARCHAR NULL, [Action] VARCHAR NULL, [Message] VARCHAR NULL, [Comment] VARCHAR NULL, CONSTRAINT [PK_LogDB_Id] PRIMARY KEY NONCLUSTERED ( [Id] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY]

GO

farzinmonsef commented 3 years ago

Helper\Tools.cs

using System; using System.Collections.Generic; using System.Data.SqlClient; using System.Diagnostics; using System.IO; using Newtonsoft.Json; using Newtonsoft.Json.Bson;

namespace EQM.Helper { ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////// TOOL Class ///////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// public static class Tools { public static char delimiterFile { get; set; } = '`'; public static char delimiterSignature { get; set; } = '~'; private static string _filePrefix = "1000000000" + delimiterFile; private static string _signaturePrefix = "1000000000" + delimiterSignature;

    public static Dictionary<string, string> GetMimeTypes()
    {
        return new Dictionary<string, string>
    {
        {".txt", "text/plain"},
        {".pdf", "application/pdf"},
        {".doc", "application/vnd.ms-word"},
        {".docx", "application/vnd.openxmlformats-officedocument.wordprocessingml.document"},
        {".png", "image/png"},
        {".jpg", "image/jpeg"},
        {".xls", "application/vnd.ms-excel"},
        {".xlsx", "application/vnd.openxmlformats-officedocument.spreadsheet.sheet" }
    };
    }

    public static byte[] readFileToArray(string varFilePath)//, char delimiter)
    {
        byte[] file = new byte[] { };
        //string[] justFile = new string[] { };
        if (!string.IsNullOrEmpty(varFilePath))
        {
            //justFile = varFilePath.ToString().Split(delimiter);
            using (var stream = new FileStream(varFilePath, FileMode.Open, FileAccess.Read))
            {
                using (var reader = new BinaryReader(stream))
                {
                    file = reader.ReadBytes((int)stream.Length);
                }
            }
        }
        return file;
    }

    public static string GetBase64ForImageMemory(byte[] imageBytes)//string imgPath)
    {
        //byte[] imageBytes = System.IO.File.ReadAllBytes(imgPath);
        string base64String = Convert.ToBase64String(imageBytes);
        return base64String;
    }
    public static string GetBase64ForImage(string imgPath)
    {
        byte[] imageBytes = System.IO.File.ReadAllBytes(imgPath);
        string base64String = Convert.ToBase64String(imageBytes);
        return base64String;
    }
    public static int sessionInt(object sessionVar)
    {
        int ret = 0;
        try
        {
            if (!int.TryParse(Convert.ToString(sessionVar), out ret))
            {
                throw new System.ArgumentException("Session Variable was not correct");
            }
        }
        catch (Exception ex)
        {
            throw ex; // [Throw captured ex variable]
        }
        return ret;
    }

    //public static string ToBson(Object o)
    //{
    //    Object[] a = new Object[o.length];
    //    for (int i = 0; i < o.length; i++)
    //    {
    //        a[i] = toBSON(o[i]);
    //    }
    //    return a;
    //}
    //public static string ToBson<T>(T value)
    //{
    //    using (MemoryStream ms = new MemoryStream())
    //    using (BsonDataWriter datawriter = new BsonDataWriter(ms))
    //    {
    //        JsonSerializer serializer = new JsonSerializer();
    //        serializer.Serialize(datawriter, value);
    //        return Convert.ToBase64String(ms.ToArray());
    //    }

    //}
    //public static T FromBson<T>(string base64data)
    //{
    //    byte[] data = Convert.FromBase64String(base64data);

    //    using (MemoryStream ms = new MemoryStream(data))
    //    using (BsonDataReader reader = new BsonDataReader(ms))
    //    {
    //        JsonSerializer serializer = new JsonSerializer();
    //        return serializer.Deserialize<T>(reader);
    //    }
    //}
    public static string filePrefix
    {
        get { return _filePrefix; }
        set { _filePrefix = value; }
    }
    public static string signaturePrefix
    {
        get { return _signaturePrefix; }
        set { _signaturePrefix = value; }
    }
    public static short getFractionDigitNumber(string No)
    {
        string tempNo = No.ToString();
        string fraction = "";
        if (tempNo.IndexOf(".") >= 0)
        {
            fraction = tempNo.Split('.')[1];
        }
        return (short)fraction.Length;
    }

    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    //public static List<Type> refreshTypeList(OSSEntities db, int typeNo)//, bool swRefresh = false)
    //{
    //    //if ((Session["ApplicationList"] == null) || (swRefresh))
    //    {
    //        List<Type> TypeList = (from t in db.Types
    //                               where t.TypeNo == typeNo && t.Status != 0
    //                               orderby t.code
    //                               select t).ToList();
    //        return TypeList;
    //        // Session["TransactionTypeList"] = TypeList;
    //    }
    //}

    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    public static string Base64Encode(string plainText)
    {
        var plainTextBytes = System.Text.Encoding.UTF8.GetBytes(plainText ?? "");
        return System.Convert.ToBase64String(plainTextBytes);
    }
    public static string Base64Decode(string base64EncodedData)
    {
        var base64EncodedBytes = System.Convert.FromBase64String(base64EncodedData ?? "");
        return System.Text.Encoding.UTF8.GetString(base64EncodedBytes);
    }
    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    public static void CreateCommand(string queryString, string connectionString)
    {
        try
        {
            using (SqlConnection connection = new SqlConnection(connectionString))
            {
                SqlCommand command = new SqlCommand(queryString, connection);
                command.Connection.Open();
                command.ExecuteNonQuery();
            }
        }
        catch (Exception e)
        {
            consoleLog(e);
            //Utils.Errorlog("Applicaiton Error", "", ex, 0);
            //Server.ClearError();
        }
    }
    public static void AppendFile(string data,
            string fileNamePath = @"C:\Users\zkpl9e1\Downloads\__Sprint6\Phase1\Log\RunEQM.Log")
    {
        try
        {
            //string myExe = System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName;
            ////string myExe1 = Path.GetFileName(System.Reflection.Assembly.GetEntryAssembly().Location);
            //string myExePath = System.Reflection.Assembly.GetCallingAssembly().Location;
            //string path = @"C:\Users\zkpl9e1\Downloads\__Sprint6\Phase1\Log\RunReport.Log";//myExePath.Replace(".exe", ".log");
            //// This text is added only once to the file.
            //if (!File.Exists(path))
            //{
            //    // Create a file to write to.
            //    string createText = "Hello and Welcome" + Environment.NewLine;
            //    File.WriteAllText(path, createText);
            //}
            // This text is always added, making the file longer over time
            // if it is not deleted.
            //string appendText = "This is extra text" + Environment.NewLine;
            File.AppendAllText(fileNamePath, data);
            //// Open the file to read from.
            //string readText = File.ReadAllText(path);
            //Console.WriteLine(readText);
        }
        catch (Exception e)
        {
            consoleLog(e);
        }
    }
    public static void writeExe()
    {
        try
        {
            Trace.WriteLine(
              System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName);
            //Trace.WriteLine(
            //  System.Reflection.Assembly.GetEntryAssembly().Location);
            Trace.WriteLine(
              System.Reflection.Assembly.GetExecutingAssembly().Location);
            Trace.WriteLine(
              System.Reflection.Assembly.GetCallingAssembly().Location);
        }
        catch (Exception e)
        {
            consoleLog(e);
        }
    }
    public static void consoleLog(Exception ex)
    {
        Console.WriteLine("\nMessage ---\n{0}", ex.Message);
        Console.WriteLine(
            "\nHelpLink ---\n{0}", ex.HelpLink);
        Console.WriteLine("\nSource ---\n{0}", ex.Source);
        Console.WriteLine(
            "\nStackTrace ---\n{0}", ex.StackTrace);
        Console.WriteLine(
            "\nTargetSite ---\n{0}", ex.TargetSite);
    }
}

}

farzinmonsef commented 3 years ago

LogDBData

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Entitites;

namespace Data { ///

/// Data class pertaining to database table EQMUSER.LogDB /// public class LogDBData : DataBase { /// /// Add a record to LogDB table /// /// logDB /// boolean true/false public bool AddLogDB(LogDB logDB) { try { var objLogDB = new LogDB { Date_Time = logDB.Date_Time, UserName = logDB.UserName, Controller = logDB.Controller, Action = logDB.Action, Message = logDB.Message, Comment = logDB.Comment }; Db.LogDBs.Add(objLogDB); Db.SaveChanges(); return true; } catch (Exception ex) { return false; } }

}

}

farzinmonsef commented 3 years ago

DataBase

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Entitites;

namespace Data { public abstract class DataBase { public DataBase() { Db = new OSSEntities(); }

    protected OSSEntities Db { get; set; }

}

}

farzinmonsef commented 3 years ago

UserAuthenticationFilter.cs

using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using System.Web.Mvc.Filters;

namespace EQM.Filters { public class UserAuthenticationFilter : ActionFilterAttribute, IAuthenticationFilter { public void OnAuthentication(AuthenticationContext filterContext) { if (string.IsNullOrEmpty(Convert.ToString(filterContext.HttpContext.Session["Authenticated"]))) { filterContext.Result = new HttpUnauthorizedResult(); } }

    public void OnAuthenticationChallenge(AuthenticationChallengeContext filterContext)
    {
        if (filterContext.Result == null || filterContext.Result is HttpUnauthorizedResult)
        {
            filterContext.Result = new ViewResult
            {
                ViewName = "Error"
            };
        }
    }
}

}

farzinmonsef commented 3 years ago

UserAuthorizationFilter.cs

using Business; using Business.Interfaces; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Web; using System.Web.Mvc;

namespace EQM.Filters { public class UserAuthorizationFilter : AuthorizeAttribute { private readonly string[] allowedRoles; private readonly IBusUser _busUser;

    public UserAuthorizationFilter(params string[] roles)
    {
        this.allowedRoles = roles;
        _busUser = new BusUser();
    }

    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        bool authorized = false;
        string standardId = Convert.ToString(httpContext.User.Identity.Name).Split('\\').Last();
        var user = _busUser.GetUserByStandardID(standardId);
        if (user != null)
        {
            if (allowedRoles.Contains(user.Role.RoleName))
            {
                authorized = true;
            }
        }

        return authorized;
    }

    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
    {
        filterContext.Result = new RedirectToRouteResult(
            new System.Web.Routing.RouteValueDictionary
            {
                {"controller", "Home" },
                {"action", "Unauthorized" }
            });
    }
}

}

farzinmonsef commented 3 years ago

UserControllerTests.cs

using System; using System.Collections.Generic; using System.Data.Entity.Validation; using System.Web.Mvc; using Entitites; using Kendo.Mvc.UI; using Moq; using NUnit.Framework;

namespace EQM.Controllers.Tests { [TestFixture] public class UserControllerTests { [Test] public void IndexTest() { //arrange var planController = new UserController(); var controllerContext = new Mock(); controllerContext.SetupGet(m => m.HttpContext.Session["ValidBrowser"]).Returns(true); controllerContext.SetupGet(m => m.HttpContext.Session["Authenticated"]).Returns(true); controllerContext.SetupGet(m => m.HttpContext.Session["userRole"]).Returns(1); planController.ControllerContext = controllerContext.Object;

        //act
        var result = planController.Index() as ViewResult;
        // Assert
        Assert.IsNotNull(result);
        Assert.IsNull(result.Model);
        Assert.IsTrue(string.IsNullOrEmpty(result.ViewName) || result.ViewName == "Index");
    }

    [Test]
    public void User_Read_WhenCalled_ReturnsJsonUserList()
    {
        //arrange
        var planController = new UserController();
        var datasourcerequest = new DataSourceRequest();

        //act
        var result = planController.User_Read(datasourcerequest) as JsonResult;
        var dataSourceResult = result.Data as DataSourceResult;
        var userList = dataSourceResult.Data;

        //assert
        Assert.IsNotNull(result);
        Assert.IsNotEmpty(userList);
    }

    [TestCase(typeof(DbEntityValidationException))]
    public void User_Create_WhenCalledWithEmptyUser_ThrowsDBEntityValidationException(System.Type expectedException)
    {
        //arrange
        var planController = new UserController();
        var datasourcerequest = new DataSourceRequest();
        var user = new User();
        //act and assert
        Assert.Throws(expectedException, () => planController.User_Create(datasourcerequest, user));
    }

    [TestCase(typeof(DbEntityValidationException))]
    public void User_Update_WhenCalledWithEmptyUser_ThrowsDBEntityValidationException(System.Type expectedException)
    {
        //arrange
        var planController = new UserController();
        var datasourcerequest = new DataSourceRequest();
        var user = new User();
        //act and assert
        Assert.Throws(expectedException, () => planController.User_Update(datasourcerequest, user));
    }

    [TestCase(typeof(InvalidOperationException))]
    //[ExpectedException(typeof(InvalidOperationException))]
    public void User_DestroyTest(System.Type expectedException)
    {
        //arrange
        var planController = new UserController();
        var datasourcerequest = new DataSourceRequest();
        var user = new User();
        //act
        //var result = planController.User_Destroy(datasourcerequest, user) as ActionResult;
        Assert.Throws(expectedException, () => planController.User_Destroy(datasourcerequest, user));
    }

    [TestCase(typeof(FormatException))]
    public void Excel_Export_Save_WhenCalledWithInvalidEncodedData_ThrowsFormatException(System.Type expectedException)
    {
        //arrange
        var planController = new UserController();
        var contenttype = "contenttype";
        var base64 = "base6";
        var filename = "filename";
        //act and assert
        Assert.Throws(expectedException, () => planController.Excel_Export_Save(contenttype, base64, filename));
    }

    [TestCase(typeof(FormatException))]
    public void Pdf_Export_Save_WhenCalledWithImproperEncodedString_ThrowsFormatException(System.Type expectedException)
    {
        //arrange
        var planController = new UserController();
        var contenttype = "contenttype";
        var base64 = "base6";
        var filename = "filename";
        //act and assert
        Assert.Throws(expectedException, () => planController.Pdf_Export_Save(contenttype, base64, filename));
    }

    [TestCase(typeof(NullReferenceException))]
    public void setFilePrefixTest(System.Type expectedException)
    {
        var planController = new UserController();
        var id = "id";

        //act and assert
        Assert.Throws(expectedException, () => planController.setFilePrefix(id));
    }

    [Test]
    public void DeleteAttachTest()
    {
        //arrange
        var planController = new UserController();
        var userid = 0;

        //act
        var actual = planController.DeleteAttach(userid);
        Assert.IsNotNull(actual);
    }

}

}

farzinmonsef commented 3 years ago

BusSharesBalanceTests.cs

using System; using System.Collections.Generic; using System.Linq; using Business; using Data; using Data.Interfaces; using Entitites; using EQM.Enumerations; using Interfaces; using Moq; using NUnit.Framework;

namespace Test.Business_Tests { [TestFixture] public class BusSharesBalanceTests {

    [Test]
    public void UpdateBalancesForTransaction_WhenCalledWithNewRestrictedStockIssuanceTransaction_ShouldUpdateBalances()
    {
        DateTime transactionDate = new DateTime(2020, 12, 1);
        string transactionType = "Restricted Stock Issuance";
        Transaction currentTransaction = new Transaction { TotalVestedShares = 500, PlanNameId = 1, TransactionEffectiveDate = transactionDate, TransactionTypeObject = new Entitites.Type { Name = transactionType } };
        Transaction previousTransaction = null;
        var isDelete = false;
        var mockPlanNameData = new Mock<IPlanNameData>();
        var planStub = new PlanName { PlanId = 1 };
        mockPlanNameData.Setup(m => m.GetById(1)).Returns(planStub);

        var mockSharesBalanceData = new Mock<ISharesBalanceData>();
        var planBalanceStub = new SharesBalance { PlanId = 1, Balance = 500, TransDate = transactionDate };
        mockSharesBalanceData.Setup(m => m.GetBalancesByPlanId(1)).Returns(new List<SharesBalance> { planBalanceStub });
        mockSharesBalanceData.Setup(m => m.Save(It.IsAny<IBalance>())).Returns((IBalance b) => b);

        var sut = new BusSharesBalance(mockSharesBalanceData.Object, mockPlanNameData.Object);

        var result = sut.UpdateBalancesForTransaction(currentTransaction, previousTransaction, isDelete);

        var planBalance = result.Where(b => b.PlanId == 1).FirstOrDefault();
        Assert.AreEqual(0, planBalance.Balance);
        Assert.AreEqual(currentTransaction.TransactionEffectiveDate, planBalance.TransDate);
    }

    [Test]
    public void UpdateBalancesForTransaction_WhenCalledWithNewRestrictedStockIssuanceTransaction_CreateBalanceForTransactionEffectiveDate()
    {
        DateTime transactionDate = new DateTime(2020, 12, 1);
        string transactionType = "Restricted Stock Issuance";
        Transaction currentTransaction = new Transaction { TotalVestedShares = 500, PlanNameId = 1, TransactionEffectiveDate = transactionDate, TransactionTypeObject = new Entitites.Type { Name = transactionType } };
        Transaction previousTransaction = null;
        var isDelete = false;
        var mockPlanNameData = new Mock<IPlanNameData>();
        var planStub = new PlanName { PlanId = 1 };
        mockPlanNameData.Setup(m => m.GetById(1)).Returns(planStub);

        var mockSharesBalanceData = new Mock<ISharesBalanceData>();
        var planBalanceStub = new SharesBalance { PlanId = 1, Balance = 500, TransDate = transactionDate.AddDays(-4) };
        mockSharesBalanceData.Setup(m => m.GetBalancesByPlanId(1)).Returns(new List<SharesBalance> { planBalanceStub });
        mockSharesBalanceData.Setup(m => m.Save(It.IsAny<IBalance>())).Returns((IBalance b) => b);

        var sut = new BusSharesBalance(mockSharesBalanceData.Object, mockPlanNameData.Object);

        var result = sut.UpdateBalancesForTransaction(currentTransaction, previousTransaction, isDelete);

        var planBalance = result.Where(b => b.PlanId == 1).FirstOrDefault();
        Assert.AreEqual(0, planBalance.Balance);
        Assert.AreEqual(currentTransaction.TransactionEffectiveDate, planBalance.TransDate);
    }

    [Test]
    public void UpdateBalancesForTransaction_WhenCalledWithNewRestrictedStockIssuanceTransactionAndNoBalances_ShouldCreateNewBalance()
    {
        DateTime transactionDate = new DateTime(2020, 12, 1);
        string transactionType = "Restricted Stock Issuance";
        Transaction currentTransaction = new Transaction { TotalVestedShares = 500, PlanNameId = 1, TransactionEffectiveDate = transactionDate, TransactionTypeObject = new Entitites.Type { Name = transactionType } };
        Transaction previousTransaction = null;
        var isDelete = false;
        var mockPlanNameData = new Mock<IPlanNameData>();
        var planStub = new PlanName { PlanId = 1 };
        mockPlanNameData.Setup(m => m.GetById(1)).Returns(planStub);

        var mockSharesBalanceData = new Mock<ISharesBalanceData>();
        mockSharesBalanceData.Setup(m => m.GetBalancesByPlanId(1)).Returns(new List<SharesBalance>());
        mockSharesBalanceData.Setup(m => m.Save(It.IsAny<IBalance>())).Returns((IBalance b) => b);

        var sut = new BusSharesBalance(mockSharesBalanceData.Object, mockPlanNameData.Object);

        var result = sut.UpdateBalancesForTransaction(currentTransaction, previousTransaction, isDelete);

        var planBalance = result.Where(b => b.PlanId == 1).FirstOrDefault();
        Assert.AreEqual(-500, planBalance.Balance);
        Assert.AreEqual(currentTransaction.TransactionEffectiveDate, planBalance.TransDate);
    }

    [Test]
    public void UpdateBalancesForTransaction_WhenCalledRetireTreasurySharesTransaction_ShouldUpdateBalances()
    {
        DateTime transactionDate = new DateTime(2020, 12, 1);
        string transactionType = "Retire Treasury Shares";
        Transaction currentTransaction = new Transaction { TotalTreasurySharestoRetire = 500, CancelandRetireShares = 500, AccountNameId = 1, TransactionEffectiveDate = transactionDate, TransactionTypeObject = new Entitites.Type { Name = transactionType } };
        Transaction previousTransaction = null;
        var isDelete = false;
        var mockPlanNameData = new Mock<IPlanNameData>();
        var planStub = new PlanName { PlanId = 1 };
        var cancelPlanStub = new PlanName { PlanId = 2 };
        mockPlanNameData.Setup(m => m.GetById(1)).Returns(planStub);
        mockPlanNameData.Setup(m => m.GetByName("Cancel & Retire")).Returns(cancelPlanStub);

        var mockSharesBalanceData = new Mock<ISharesBalanceData>();
        var planBalanceStub = new SharesBalance { PlanId = 1, Balance = 500, TransDate = transactionDate };
        var cancelPlanBalanceStub = new SharesBalance { PlanId = 2, Balance = 200, TransDate = transactionDate };
        mockSharesBalanceData.Setup(m => m.GetBalancesByPlanId(1)).Returns(new List<SharesBalance> { planBalanceStub });
        mockSharesBalanceData.Setup(m => m.GetBalancesByPlanId(2)).Returns(new List<SharesBalance> { cancelPlanBalanceStub });
        mockSharesBalanceData.Setup(m => m.Save(It.IsAny<IBalance>())).Returns((IBalance b) => b);

        var sut = new BusSharesBalance(mockSharesBalanceData.Object, mockPlanNameData.Object);

        var result = sut.UpdateBalancesForTransaction(currentTransaction, previousTransaction, isDelete);

        var planBalance = result.Where(b => b.PlanId == 1).FirstOrDefault();
        var cancelBalance = result.Where(b => b.PlanId == 2).FirstOrDefault();
        Assert.AreEqual(0, planBalance.Balance);
        Assert.AreEqual(700, cancelBalance.Balance);
        Assert.AreEqual(currentTransaction.TransactionEffectiveDate, planBalance.TransDate);
    }

    [Test]
    public void UpdateBalancesForTransaction_WhenCalledRestrictedStockIssuanceReversalTransaction_ShouldUpdateBalances()
    {
        DateTime transactionDate = new DateTime(2020, 12, 1);
        string transactionType = "Restricted Stock Issuance - Reversal";
        Transaction currentTransaction = new Transaction { TotalVestedShares = -500, CancelandRetireShares = 500, PlanNameId = 1, TransactionEffectiveDate = transactionDate, TransactionTypeObject = new Entitites.Type { Name = transactionType } };
        Transaction previousTransaction = null;
        var isDelete = false;
        var mockPlanNameData = new Mock<IPlanNameData>();
        var planStub = new PlanName { PlanId = 1 };
        mockPlanNameData.Setup(m => m.GetById(1)).Returns(planStub);

        var mockSharesBalanceData = new Mock<ISharesBalanceData>();
        var planBalanceStub = new SharesBalance { PlanId = 1, Balance = 500, TransDate = transactionDate };
        mockSharesBalanceData.Setup(m => m.GetBalancesByPlanId(1)).Returns(new List<SharesBalance> { planBalanceStub });
        mockSharesBalanceData.Setup(m => m.Save(It.IsAny<IBalance>())).Returns((IBalance b) => b);

        var sut = new BusSharesBalance(mockSharesBalanceData.Object, mockPlanNameData.Object);

        var result = sut.UpdateBalancesForTransaction(currentTransaction, previousTransaction, isDelete);

        var planBalance = result.Where(b => b.PlanId == 1).FirstOrDefault();
        Assert.AreEqual(1000, planBalance.Balance);
        Assert.AreEqual(currentTransaction.TransactionEffectiveDate, planBalance.TransDate);
    }

    [Test]
    public void UpdateBalancesForTransaction_WhenCalledAnnuityTransaction_ShouldUpdateBalances()
    {
        DateTime transactionDate = new DateTime(2020, 12, 1);
        string transactionType = "Annuity";
        Transaction currentTransaction = new Transaction { GrossStockUnitsDistributed = 500, CancelandRetireShares = 500, PlanNameId = 1, TransactionEffectiveDate = transactionDate, TransactionTypeObject = new Entitites.Type { Name = transactionType } };
        Transaction previousTransaction = null;
        var isDelete = false;
        var mockPlanNameData = new Mock<IPlanNameData>();
        var planStub = new PlanName { PlanId = 1 };
        var cancelPlanStub = new PlanName { PlanId = 2 };
        mockPlanNameData.Setup(m => m.GetById(1)).Returns(planStub);
        mockPlanNameData.Setup(m => m.GetByName("Cancel & Retire")).Returns(cancelPlanStub);

        var mockSharesBalanceData = new Mock<ISharesBalanceData>();
        var planBalanceStub = new SharesBalance { PlanId = 1, Balance = 500, TransDate = transactionDate };
        var cancelPlanBalanceStub = new SharesBalance { PlanId = 2, Balance = 200, TransDate = transactionDate };
        mockSharesBalanceData.Setup(m => m.GetBalancesByPlanId(1)).Returns(new List<SharesBalance> { planBalanceStub });
        mockSharesBalanceData.Setup(m => m.GetBalancesByPlanId(2)).Returns(new List<SharesBalance> { cancelPlanBalanceStub });
        mockSharesBalanceData.Setup(m => m.Save(It.IsAny<IBalance>())).Returns((IBalance b) => b);

        var sut = new BusSharesBalance(mockSharesBalanceData.Object, mockPlanNameData.Object);

        var result = sut.UpdateBalancesForTransaction(currentTransaction, previousTransaction, isDelete);

        var planBalance = result.Where(b => b.PlanId == 1).FirstOrDefault();
        var cancelBalance = result.Where(b => b.PlanId == 2).FirstOrDefault();
        Assert.AreEqual(0, planBalance.Balance);
        Assert.AreEqual(700, cancelBalance.Balance);
        Assert.AreEqual(currentTransaction.TransactionEffectiveDate, planBalance.TransDate);
    }

    [Test]
    public void UpdateBalancesForTransaction_WhenCalledDirectorGrantTransaction_ShouldUpdateBalances()
    {
        DateTime transactionDate = new DateTime(2020, 12, 1);
        string transactionType = "Director Grant";
        Transaction currentTransaction = new Transaction { CommonRestrictedUnvestedSharesGranted = 500, CancelandRetireShares = 500, PlanNameId = 1, TransactionEffectiveDate = transactionDate, TransactionTypeObject = new Entitites.Type { Name = transactionType } };
        Transaction previousTransaction = null;
        var isDelete = false;
        var mockPlanNameData = new Mock<IPlanNameData>();
        var planStub = new PlanName { PlanId = 1 };
        var cancelPlanStub = new PlanName { PlanId = 2 };
        mockPlanNameData.Setup(m => m.GetById(1)).Returns(planStub);
        mockPlanNameData.Setup(m => m.GetByName("Cancel & Retire")).Returns(cancelPlanStub);

        var mockSharesBalanceData = new Mock<ISharesBalanceData>();
        var planBalanceStub = new SharesBalance { PlanId = 1, Balance = 500, TransDate = transactionDate };
        var cancelPlanBalanceStub = new SharesBalance { PlanId = 2, Balance = 200, TransDate = transactionDate };
        mockSharesBalanceData.Setup(m => m.GetBalancesByPlanId(1)).Returns(new List<SharesBalance> { planBalanceStub });
        mockSharesBalanceData.Setup(m => m.GetBalancesByPlanId(2)).Returns(new List<SharesBalance> { cancelPlanBalanceStub });
        mockSharesBalanceData.Setup(m => m.Save(It.IsAny<IBalance>())).Returns((IBalance b) => b);

        var sut = new BusSharesBalance(mockSharesBalanceData.Object, mockPlanNameData.Object);

        var result = sut.UpdateBalancesForTransaction(currentTransaction, previousTransaction, isDelete);

        var planBalance = result.Where(b => b.PlanId == 1).FirstOrDefault();
        var cancelBalance = result.Where(b => b.PlanId == 2).FirstOrDefault();
        Assert.AreEqual(0, planBalance.Balance);
        Assert.AreEqual(700, cancelBalance.Balance);
        Assert.AreEqual(currentTransaction.TransactionEffectiveDate, planBalance.TransDate);
    }

    [Test]
    public void UpdateBalancesForTransaction_WhenCalledRestrictedStockReleaseTransaction_ShouldUpdateBalances()
    {
        DateTime transactionDate = new DateTime(2020, 12, 1);
        string transactionType = "Restricted Stock Release";
        Transaction currentTransaction = new Transaction { SharesForTax = 400, CancelandRetireShares = 500, PlanNameId = 1, TransactionEffectiveDate = transactionDate, TransactionTypeObject = new Entitites.Type { Name = transactionType } };
        Transaction previousTransaction = null;
        var isDelete = false;
        var mockPlanNameData = new Mock<IPlanNameData>();
        var cancelPlanStub = new PlanName { PlanId = 2 };
        mockPlanNameData.Setup(m => m.GetByName("Cancel & Retire")).Returns(cancelPlanStub);

        var mockSharesBalanceData = new Mock<ISharesBalanceData>();
        var cancelPlanBalanceStub = new SharesBalance { PlanId = 2, Balance = 200, TransDate = transactionDate };
        mockSharesBalanceData.Setup(m => m.GetBalancesByPlanId(2)).Returns(new List<SharesBalance> { cancelPlanBalanceStub });
        mockSharesBalanceData.Setup(m => m.Save(It.IsAny<IBalance>())).Returns((IBalance b) => b);

        var sut = new BusSharesBalance(mockSharesBalanceData.Object, mockPlanNameData.Object);

        var result = sut.UpdateBalancesForTransaction(currentTransaction, previousTransaction, isDelete);

        var cancelBalance = result.Where(b => b.PlanId == 2).FirstOrDefault();
        Assert.AreEqual(600, cancelBalance.Balance);
    }

    [Test]
    public void UpdateBalancesForTransaction_WhenCalledRestrictedStockReleaseReversalTransaction_ShouldUpdateBalances()
    {
        DateTime transactionDate = new DateTime(2020, 12, 1);
        string transactionType = "Restricted Stock Release - Reversal";
        Transaction currentTransaction = new Transaction { SharesForTax = -400, CancelandRetireShares = 500, PlanNameId = 1, TransactionEffectiveDate = transactionDate, TransactionTypeObject = new Entitites.Type { Name = transactionType } };
        Transaction previousTransaction = null;
        var isDelete = false;
        var mockPlanNameData = new Mock<IPlanNameData>();
        var cancelPlanStub = new PlanName { PlanId = 2 };
        mockPlanNameData.Setup(m => m.GetByName("Cancel & Retire")).Returns(cancelPlanStub);

        var mockSharesBalanceData = new Mock<ISharesBalanceData>();
        var cancelPlanBalanceStub = new SharesBalance { PlanId = 2, Balance = 200, TransDate = transactionDate };
        mockSharesBalanceData.Setup(m => m.GetBalancesByPlanId(2)).Returns(new List<SharesBalance> { cancelPlanBalanceStub });
        mockSharesBalanceData.Setup(m => m.Save(It.IsAny<IBalance>())).Returns((IBalance b) => b);

        var sut = new BusSharesBalance(mockSharesBalanceData.Object, mockPlanNameData.Object);

        var result = sut.UpdateBalancesForTransaction(currentTransaction, previousTransaction, isDelete);

        var cancelBalance = result.Where(b => b.PlanId == 2).FirstOrDefault();
        Assert.AreEqual(-200, cancelBalance.Balance);
    }

    [Test]
    public void UpdateBalancesForTransaction_WhenCalledDirectorVestingTransaction_ShouldUpdateBalances()
    {
        DateTime transactionDate = new DateTime(2020, 12, 1);
        string transactionType = "Director Vesting";
        Transaction currentTransaction = new Transaction { SharesForTax = -400, CancelandRetireShares = 500, PlanNameId = 1, TransactionEffectiveDate = transactionDate, TransactionTypeObject = new Entitites.Type { Name = transactionType } };
        Transaction previousTransaction = null;
        var isDelete = false;
        var mockPlanNameData = new Mock<IPlanNameData>();
        var cancelPlanStub = new PlanName { PlanId = 2 };
        mockPlanNameData.Setup(m => m.GetByName("Cancel & Retire")).Returns(cancelPlanStub);

        var mockSharesBalanceData = new Mock<ISharesBalanceData>();
        var cancelPlanBalanceStub = new SharesBalance { PlanId = 2, Balance = 200, TransDate = transactionDate };
        mockSharesBalanceData.Setup(m => m.GetBalancesByPlanId(2)).Returns(new List<SharesBalance> { cancelPlanBalanceStub });
        mockSharesBalanceData.Setup(m => m.Save(It.IsAny<IBalance>())).Returns((IBalance b) => b);

        var sut = new BusSharesBalance(mockSharesBalanceData.Object, mockPlanNameData.Object);

        var result = sut.UpdateBalancesForTransaction(currentTransaction, previousTransaction, isDelete);

        var cancelBalance = result.Where(b => b.PlanId == 2).FirstOrDefault();
        Assert.AreEqual(700, cancelBalance.Balance);
    }

    [Test]
    public void UpdateBalancesForTransaction_WhenCalledWithNewPreferredSharesCreditTransaction_ShouldCreateNewBalance()
    {
        DateTime transactionDate = new DateTime(2020, 12, 1);
        string transactionType = "Preferred Shares";
        Transaction currentTransaction = new Transaction { PreferredShares = 800, Action = "Credit", PreferredSharesNameId = 1, TransactionEffectiveDate = transactionDate, TransactionTypeObject = new Entitites.Type { Name = transactionType } };
        Transaction previousTransaction = null;
        var isDelete = false;
        var mockPlanNameData = new Mock<IPlanNameData>();
        var planStub = new PlanName { PlanId = 1 };
        mockPlanNameData.Setup(m => m.GetById(1)).Returns(planStub);

        var mockSharesBalanceData = new Mock<ISharesBalanceData>();
        var planBalanceStub = new SharesBalance { PlanId = 1, Balance = 500, TransDate = transactionDate };
        mockSharesBalanceData.Setup(m => m.GetBalancesByPlanId(1)).Returns(new List<SharesBalance> { planBalanceStub });
        mockSharesBalanceData.Setup(m => m.Save(It.IsAny<IBalance>())).Returns((IBalance b) => b);

        var sut = new BusSharesBalance(mockSharesBalanceData.Object, mockPlanNameData.Object);

        var result = sut.UpdateBalancesForTransaction(currentTransaction, previousTransaction, isDelete);

        var planBalance = result.Where(b => b.PlanId == 1).FirstOrDefault();
        Assert.AreEqual(1300, planBalance.Balance);
        Assert.AreEqual(currentTransaction.TransactionEffectiveDate, planBalance.TransDate);
    }

    [Test]
    public void UpdateBalancesForTransaction_WhenCalledWithNewPreferredSharesDebitTransaction_ShouldCreateNewBalance()
    {
        DateTime transactionDate = new DateTime(2020, 12, 1);
        string transactionType = "Preferred Shares";
        Transaction currentTransaction = new Transaction { PreferredShares = 800, Action = "Debit", PreferredSharesNameId = 1, TransactionEffectiveDate = transactionDate, TransactionTypeObject = new Entitites.Type { Name = transactionType } };
        Transaction previousTransaction = null;
        var isDelete = false;
        var mockPlanNameData = new Mock<IPlanNameData>();
        var planStub = new PlanName { PlanId = 1 };
        mockPlanNameData.Setup(m => m.GetById(1)).Returns(planStub);

        var mockSharesBalanceData = new Mock<ISharesBalanceData>();
        var planBalanceStub = new SharesBalance { PlanId = 1, Balance = 500, TransDate = transactionDate };
        mockSharesBalanceData.Setup(m => m.GetBalancesByPlanId(1)).Returns(new List<SharesBalance> { planBalanceStub });
        mockSharesBalanceData.Setup(m => m.Save(It.IsAny<IBalance>())).Returns((IBalance b) => b);

        var sut = new BusSharesBalance(mockSharesBalanceData.Object, mockPlanNameData.Object);

        var result = sut.UpdateBalancesForTransaction(currentTransaction, previousTransaction, isDelete);

        var planBalance = result.Where(b => b.PlanId == 1).FirstOrDefault();
        Assert.AreEqual(-300, planBalance.Balance);
        Assert.AreEqual(currentTransaction.TransactionEffectiveDate, planBalance.TransDate);
    }

    [Test]
    public void UpdateBalancesForTransaction_WhenCalledWithPreferredSharesDebitTransactionEditAction_ShouldCreateUpdateBalance()
    {
        DateTime transactionDate = new DateTime(2020, 12, 1);
        string transactionType = "Preferred Shares";
        Transaction currentTransaction = new Transaction { PreferredShares = 800, Action = "Debit", PreferredSharesNameId = 1, TransactionEffectiveDate = transactionDate, TransactionTypeObject = new Entitites.Type { Name = transactionType } };
        Transaction previousTransaction = new Transaction { PreferredShares = 800, Action = "Credit", PreferredSharesNameId = 1, TransactionEffectiveDate = transactionDate, TransactionTypeObject = new Entitites.Type { Name = transactionType } }; ;
        var isDelete = false;
        var mockPlanNameData = new Mock<IPlanNameData>();
        var planStub = new PlanName { PlanId = 1 };
        mockPlanNameData.Setup(m => m.GetById(1)).Returns(planStub);

        var mockSharesBalanceData = new Mock<ISharesBalanceData>();
        var planBalanceStub = new SharesBalance { PlanId = 1, Balance = 500, TransDate = transactionDate };
        mockSharesBalanceData.Setup(m => m.GetBalancesByPlanId(1)).Returns(new List<SharesBalance> { planBalanceStub });
        mockSharesBalanceData.Setup(m => m.Save(It.IsAny<IBalance>())).Returns((IBalance b) => b);

        var sut = new BusSharesBalance(mockSharesBalanceData.Object, mockPlanNameData.Object);

        var result = sut.UpdateBalancesForTransaction(currentTransaction, previousTransaction, isDelete);

        var planBalance = result.Where(b => b.PlanId == 1).FirstOrDefault();
        Assert.AreEqual(-1100, planBalance.Balance);
        Assert.AreEqual(currentTransaction.TransactionEffectiveDate, planBalance.TransDate);
    }

    [Test]
    public void UpdateBalancesForTransaction_WhenCalledWithSharesRepurchaseTransaction_ShouldCreateNewBalance()
    {
        DateTime transactionDate = new DateTime(2020, 12, 1);
        string transactionType = "Share Repurchase";
        Transaction currentTransaction = new Transaction { DispositionOfShares = 800, CancelandRetireShares = 500, TreasuryAccountShares = 400, PreferredSharesNameId = 13, TransactionEffectiveDate = transactionDate, TransactionTypeObject = new Entitites.Type { Name = transactionType } };
        Transaction previousTransaction = null;
        var isDelete = false;
        var mockPlanNameData = new Mock<IPlanNameData>();
        var planStub = new PlanName { PlanId = 13 };      //2020 Share Repurchase (07/01/20 - 06/30/21)  2020SBB
        var cancelStub = new PlanName { PlanId = 9 };     //Cancel & Retire                              TAX_LIAB
        var treasuryStub = new PlanName { PlanId = 12 };  //Treasury Shares (KEEP-TS)                    TREA_SHRS
        mockPlanNameData.Setup(m => m.GetById(13)).Returns(planStub);
        mockPlanNameData.Setup(m => m.GetById(9)).Returns(cancelStub);
        mockPlanNameData.Setup(m => m.GetById(12)).Returns(treasuryStub);

        var mockSharesBalanceData = new Mock<ISharesBalanceData>();
        var planBalanceStub = new SharesBalance { PlanId = 13, Balance = 500, TransDate = transactionDate };
        var cancelBalanceStub = new SharesBalance { PlanId = 9, Balance = 2400, TransDate = transactionDate };
        var treasuryBalanceStub = new SharesBalance { PlanId = 12, Balance = 1800, TransDate = transactionDate };
        mockSharesBalanceData.Setup(m => m.GetBalancesByPlanId(13)).Returns(new List<SharesBalance> { planBalanceStub });
        mockSharesBalanceData.Setup(m => m.GetBalancesByPlanId(9)).Returns(new List<SharesBalance> { cancelBalanceStub });
        mockSharesBalanceData.Setup(m => m.GetBalancesByPlanId(12)).Returns(new List<SharesBalance> { treasuryBalanceStub });
        mockSharesBalanceData.Setup(m => m.Save(It.IsAny<IBalance>())).Returns((IBalance b) => b);

        var sut = new BusSharesBalance(mockSharesBalanceData.Object, mockPlanNameData.Object);

        var result = sut.UpdateBalancesForTransaction(currentTransaction, previousTransaction, isDelete);

        var planBalance = result.Where(b => b.PlanId == 13).FirstOrDefault();
        var cancelBalance = result.Where(b => b.PlanId == 9).FirstOrDefault();
        var treasuryBalance = result.Where(b => b.PlanId == 12).FirstOrDefault();
        Assert.AreEqual(1300, planBalance.Balance);
        Assert.AreEqual(1900, cancelBalance.Balance);
        Assert.AreEqual(2200, treasuryBalance.Balance);
        Assert.AreEqual(currentTransaction.TransactionEffectiveDate, planBalance.TransDate);
    }

}

}

farzinmonsef commented 3 years ago

BusTransactionsTests.cs

using System; using System.Collections.Generic; using Business; using Business.Interfaces; using Data; using Data.Interfaces; using Entitites; using EQM.Enumerations; using Moq; using NUnit.Framework;

namespace Test.Business_Tests { [TestFixture] public class BusTransactionsTests { [Test] public void GetTransactions_ReturnsListOfAllTransactions() { // Arrange var transactions = GetMockTransactions(); var mockTransactionData = new Mock(); mockTransactionData.Setup(m => m.FindAllTransactions(It.IsAny())).Returns(transactions); var mockSharedBalancesBus = new Mock();

        // Act
        var target = new BusTransactions(mockSharedBalancesBus.Object, mockTransactionData.Object);
        var actual = target.GetTransactions(1);

        // Assert
        Assert.IsNotNull(actual);
        Assert.AreEqual(4, actual.Count);
    }

    List<Transaction> GetMockTransactions()
    {
        var list = new List<Transaction>()
        {
            new Transaction { TransactionTypeObject = new Entitites.Type { TypeNo = 1, Name = "Transaction"} },
            new Transaction { TransactionTypeObject = new Entitites.Type { TypeNo = 2, Name = "Transaction for MerrillLynch Role"} },
            new Transaction { TransactionTypeObject = new Entitites.Type { TypeNo = 2, Name = "Transaction for GlobalHumanResource Role"} },
            new Transaction { TransactionTypeObject = new Entitites.Type { TypeNo = 2, Name = "Transaction for ChiefFinancialOfficer"} },
        };

        return list;
    }
}

}

farzinmonsef commented 3 years ago

TransactionControllerTests.cs

using Business; using Business.Interfaces; using Entitites; using EQM.Controllers; using Kendo.Mvc.UI; using Moq; using NUnit.Framework; using System.Collections.Generic; using System.Web.Mvc;

namespace EQM.Controllers.Tests { [TestFixture] public class TransactionControllerTests { Mock _mockBusTransactions = new Mock(); Mock _mockDataSourceRequest = new Mock();

    [Test]
    public void ListAllTransactions_ReturnsJsonResult()
    {
        // Arrange
        var transactions = new List<Transaction>
        {
            new Transaction {Id = 1, TransactionType = 1}
        };
        var userStub = new User { UserID = 1 };
        _mockBusTransactions.Setup(x => x.GetTransactions(It.IsAny<int>())).Returns(transactions);
        var controller = new TransactionController(_mockBusTransactions.Object);
        var mockControllerContext = new Mock<ControllerContext>();
        mockControllerContext.SetupGet(m => m.HttpContext.Session["currentUser"]).Returns(userStub);
        controller.ControllerContext = mockControllerContext.Object;

        // Act
        var actual = controller.ListAllTransactions(_mockDataSourceRequest.Object);

        // Arrange
        Assert.IsNotNull(actual);
    }
}

}

farzinmonsef commented 3 years ago

ReportController.cs

using Business; using DocumentFormat.OpenXml; using DocumentFormat.OpenXml.Packaging; using DocumentFormat.OpenXml.Spreadsheet; using Entitites; using EQM.Extensions; using EQM.Filters; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Web.Mvc;

namespace EQM.Controllers { [UserAuthenticationFilter] public class ReportController : BaseController { private readonly BusReporting reportBLL;

    public ReportController()
    {
        reportBLL = new BusReporting();
    }
    // GET: Report
    public ActionResult Index()
    {
        return View();
    }

    [UserAuthorizationFilter("Administrator", "ChiefFinancialOfficer")]
    public ActionResult SharesBalance(DateTime? startDate, DateTime? endDate)
    {
        var report = new SharesBalanceReport();
        if (startDate == null && endDate == null)
        {
            var currentDate = DateTime.Now;
            report.StartDate = new DateTime(currentDate.Year, currentDate.Month, 1);
            report.EndDate = report.StartDate.AddMonths(1).AddDays(-1);
        }
        else
        {
            report.StartDate = startDate.Value;
            report.EndDate = endDate.Value;
        }
        report.ReportData = reportBLL.GetShareBalanceReport(report.StartDate, report.EndDate, CurrentUser);
        Session["selectedmenu"] = "menusharesbalance";
        Session["plantypeids"] = string.Join("|", report.ReportData.Select(m => m.PlanTypeId).Distinct());
        Session["sharesbalance"] = (List<SharesBalanceDTO_GetBalanceReportData_Result>)report.ReportData.ToList();
        return View(report);
    }

    [OutputCache(NoStore = true, Duration = 0, VaryByParam = "*")]
    [HttpGet]
    public FileResult ExcelExport(string data, string StartDate, string EndDate)
    {
        List<SharesBalanceDTO_GetBalanceReportData_Result> report = (List<SharesBalanceDTO_GetBalanceReportData_Result>)Session["sharesbalance"];
        List<SharesBalanceDTO_GetBalanceReportData_Result> reportResult = new List<SharesBalanceDTO_GetBalanceReportData_Result>();
        data = data.Substring(1, data.Length - 2);
        var dataAr = data.Split('|');
        if (dataAr.Length > 0)
        {
            for (int i = 0; i < report.Count(); i++) {
                if (Array.Exists(dataAr, element => element == Convert.ToString(report[i].PlanId))){
                    reportResult.Add(new SharesBalanceDTO_GetBalanceReportData_Result
                    {
                        BeginningBalance = report[i].BeginningBalance,
                        EndingBalance = report[i].EndingBalance,
                        PlanDescription = report[i].PlanDescription,
                        PlanName = report[i].PlanName,
                        PlanId = report[i].PlanId,
                        PlanTypeId = report[i].PlanTypeId,
                        PlanTypeName = report[i].PlanTypeName
                    });
                }
            }
        }
        var excelStream = CreateSpreadsheet((IEnumerable<SharesBalanceDTO_GetBalanceReportData_Result>)reportResult, StartDate, EndDate);// (IEnumerable<SharesBalanceDTO_GetBalanceReportData_Result>)dataInit); 
        Response.AddHeader("content-disposition", $"attachment;filename=SharesBalance_{DateTimeOffset.UtcNow:dd.MM.yyyy}.xlsx");
        return File(excelStream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
    }
    private byte[] CreateSpreadsheet(IEnumerable<SharesBalanceDTO_GetBalanceReportData_Result> sharesBalanceDTO, string StartDate, string EndDate)
    {
        var stream = new MemoryStream();
        var excelExtensionsReport = new ExcelExtensionsReport();

        SpreadsheetDocument document = SpreadsheetDocument.Create(stream, SpreadsheetDocumentType.Workbook, true);

        var workbookPart = document.AddWorkbookPart();
        workbookPart.Workbook = new Workbook();

        var sheets = workbookPart.Workbook.AppendChild(new Sheets());

        var sheet = excelExtensionsReport.CreateNewSheet(workbookPart, sharesBalanceDTO, StartDate, EndDate);
        sheets.Append(sheet);

        // Adding style
        var stylePart = workbookPart.AddNewPart<WorkbookStylesPart>();
        stylePart.Stylesheet = excelExtensionsReport.GenerateStylesheet();
        stylePart.Stylesheet.Save();

        var path = string.Concat(Request.PhysicalApplicationPath, "\\images\\bofa_eqm2.png");
        ExcelImageExtensions.InsertImage(document, path, 1, 1);

        document.Close();

        return stream.ToArray();
    }

}

}

farzinmonsef commented 3 years ago

SharesBalances.css

.balance-grid-title-area{ margin-top: 2em; }

select.action-dropdown .label { color: red; }

select.action-dropdown { font-family: fontAwesome, Arial, Helvetica, sans-serif; }

footer { height: 4em; }

create-planname-modal .modal-content {

min-width: 800px;

}

.report-filter { padding-top: .5em; border-bottom: 1px solid #CCD3E1; min-height: 7em; }

.filter-field { padding: .5em 0; }

.range-label { display: block; padding-bottom: .5em; }

.date-range-spacer { padding: 0 .5em; }

.plan-type-heading { font-size: 20px; margin-left: .5em; }

.edit-plan-form .row { margin: 1em 0; }

.button-row { border-top: 1px solid #CCD3E1; }

.button-row .btn { margin: .5em; }

.create-plan { padding-left: 1em; color: #0049AC; }

.create-plan img { width: 19px; padding-bottom: 5px; fill: #0049AC; }

.confirmation-message { padding: 2em 1em; }

.k-grid, .k-grid .k-header, .k-grid td { border: none; }

.k-grid .k-alt, .k-grid-header { background-color: white !important; }

.k-grid .k-header { border-bottom: 2px solid #012169; font-weight: bold; }

.k-grid td { border-bottom: 1px solid #CCD3E1 }

.k-grid .k-checkbox:focus, .k-grid .k-checkbox:hover { border-color: #0049AC; }

farzinmonsef commented 3 years ago

Trans Custom Filter

@using Entitites @using EQM.Enumerations; @{ViewBag.Title = "Transactions"; }

@*style="background-color:#e8e8e8;border:1px;border-color:darkgray;"*@   

@(Html.Kendo().Grid() .Name("transactiongrid") .Columns(columns => { columns.Bound(c => c.Id).Title("ID").Filterable(filterable => filterable.UI("integerFilter")); ;//.ClientTemplate("#= kendo.toString(Id, \'n0\')#"); /*.Hidden();*/ //columns.Bound(c => c.Id).Title("ID").Encoded(false) // //.Filterable(ftb => ftb.Cell(cell => cell.ShowOperators(true).Template("NumberFilter"))); // //.Template("customFilter").ToString() // .Filterable(ftb => ftb.Cell(cell => cell.Template("customFilter"))) //.ClientTemplate("#= kendo.toString(Id, \'n0\')#"); /*.Hidden();*/ // ; columns.Bound(c => c.Category).Title("Category"); columns.Bound(c => c.TypeName).Title("Transaction Type"); columns.Bound(c => c.EntryDate).Format("{0: MM/dd/yyyy}"); columns.Bound(c => c.TransactionEffectiveDate).Format("{0: MM/dd/yyyy}"); columns.Command(command => { command.Edit().CancelText("Cancel").UpdateText("Submit").Text("Edit"); }).Hidden(); columns.Template(@) .ClientTemplate(@"").Title("#"); columns.Bound(c => c.StatusName).Title("Status"); //columns.Group(g => g.Title("AActions").Columns(actions => //{ columns.Template(@).Width(100) .ClientTemplate(@" Edit") .Title("Actions"); columns.Command(command => command.Custom("Preview Letter") .HtmlAttributes(new { @class = "btn k-button k-grid-customCommand btnPreviewLetter k-primary" }).Click("showPreview"))//k-state-disabled k-grid-customCommand k-primary .Width(90).Hidden(!((int)Session["userRole"] == (int)RoleType.Administrator)); columns.Template(@) .ClientTemplate(@"") .Title(" "); @*columns.Template(@) .ClientTemplate(@" ");*@ //}).Title("Actions")); columns.Bound(c => c.FileName).Hidden(); }) .Groupable(g => g.Enabled(true)) .ColumnMenu() .Pageable(pageable => pageable .Refresh(true) .PageSizes(true) .ButtonCount(5) .PageSizes(new string[] { "10", "20", "50", "100"}) ) .Navigatable() .Selectable(selectable => { selectable.Mode(GridSelectionMode.Single); selectable.Type(GridSelectionType.Row); }) .ClientDetailTemplateId("template") .Sortable(sortable => { sortable.SortMode(GridSortMode.SingleColumn); }) .Filterable() .Scrollable(scrollable => scrollable.Enabled(false)) .Editable(ed => ed.Mode(GridEditMode.PopUp) .DisplayDeleteConfirmation(false) .TemplateName("_EditTransaction") .Window(w => w.Title("Add/Edit Transaction") .Width(1050) .Scrollable(false) .Name("EditTransaction") ) ) .Events(events => { events.DataBound("onTransactionDataBound"); events.Change("onTransactionChange"); events.Edit("onTransactionEdit"); events.Cancel("onTransactionCancel"); events.Save("onTransactionSave"); //events.Filter("customFilter"); //events.ColumnMenuInit("customFilter"); //events.FilterMenuOpen("customFilter" @ function(e) { alert('Filter NMenu'); } ); }) .Resizable(resize => resize.Columns(true)) .DataSource("dataSourceTransaction") //.DataSource(dataSource => dataSource // .Ajax() // .ServerOperation(true) // .Filter(filters => { filters.Add(TransactionDTO => TransactionDTO.StatusName).IsEqualTo("Pending"); }) // .Model(model => // { // model.Id(p => p.Id); // model.Field(t => t.Id).Editable(false); // }) // .PageSize(10) // .Events(events => // { // events.Error("data_error_handler"); // }) // .Read(read => read.Action("ListAllTransactions", "Transaction")) // .Create(create => create.Action("Transactions_Create", "Transaction")) // .Update(update => update.Action("Transactions_Update", "Transaction")) // .Destroy(destroy => destroy.Action("Transactions_Destroy", "Transaction")) //) ) @(Html.Kendo().DataSource() .Name("dataSourceTransaction") .Ajax(t => t .Model(model => { model.Id(p => p.Id); model.Field(p => p.Id).Editable(false); }) .PageSize(10) .ServerOperation(true) .Filter(filters => { filters.Add(TransactionDTO => TransactionDTO.StatusName).IsEqualTo("Pending"); }) //.Events(events => { events.Error("data_error_handler"); }) .Read(read => read.Action("ListAllTransactions", "Transaction")) .Create(create => create.Action("Transactions_Create", "Transaction")) .Update(update => update.Action("Transactions_Update", "Transaction")) .Destroy(destroy => destroy.Action("Transactions_Destroy", "Transaction")) ) )



@(Html.Kendo().Window() .Name("windowPreview") .Title("Preview Letter") .Modal(true) .Visible(false) .Content(@


[BOA-Logo]
Equity Management Communication

[Title]

To: [To]
From: [From]
 
Under the terms of the Bank of America Key 2003 Employee Equity Plan, we instruct you as follows:
[Title]
♦  Requisition Number: [RequisitionNumber]
♦  Effective Date: [TransactionEffectiveDate]
♦  Debit: [ReserveName]
♦  Debit Shares: [TotalVestedShares]
♦  Credit: Restricted Stock Account for Stock Plan Participants
♦  Credit Shares: [TotalVestedShares]
 
 
Approved By: [Approved]
Corporate Title: [CorporateTitle]
 
Prepared by: [Prepared]
Date: [EntryDate]
 
Bank of America N.A. Member FDIC © [LetterYear] Bank of America Corporation. All rights reserved
 
    <p style="text-align:center;padding: 50px">
        <input type="button" class="k-button" name="cancelemailLetter" value="Cancel" onclick="cancelemailLetter()">
        <input type="button" class="k-button k-primary" name="emailLetter" value="Send Email to ComputerShare" onclick="emailLetter()">&nbsp;&nbsp;&nbsp;
    </p>
</text>)

.Draggable() .Resizable() .Width(800) .Actions(actions => actions.Pin().Minimize().Maximize().Close()) .Events(ev => ev.Close("onWindowClose")) ) @//========================================================================================= //======= A flying DIV for the ALERT BOX //=========================================================================================@

<div id="alertboxmodal" style="display: none; / Hidden by default / position: fixed; / Stay in place / z-index: 9999; / Sit on top / padding-top: 100px; / Location of the box / left: 0; top: 0; width: 100%; / Full width / height: 100%; / Full height / overflow: auto; / Enable scroll if needed / background-color: rgb(0,0,0); / Fallback color / background-color: rgba(0,0,0,0.4); / Black w/ opacity /" class="alertboxmodal"> <div style="background-color: #fefefe; margin: auto; padding: 20px; border: 1px solid #888; width: 40%;" class="alertbox-content">

×
MY-TITLE-HERE
Success MY-MESSAGE-HERE
MY-FOOTER-HERE    
</div>