Hinsura
1/15/2018 - 11:48 AM

Excel Export/Import

public async Task<ActionResult> ExportData(string riskySicknessId)
{
  var q1 = _productManager.GetAllSicknessRiskySicknesses();
  if (!string.IsNullOrWhiteSpace(riskySicknessId))
  {
    q1 = q1.Where(r => r.RiskySicknessId.Equals(riskySicknessId));
  }
  var sicknessRiskySicknessesList = await q1.ToListAsync();

  /* Join Lists as IENumerable */
  var q2 = from srs in sicknessRiskySicknessesList
           select new
           {
            srs.RiskySicknessId,
            srs.SicknessMainCategory,
            srs.SicknessCategory,
            srs.SicknessSubCategory
           };

  /* Sort Ordering */
  q2 = q2.OrderBy(x => x.SicknessMainCategory)
        .ThenBy(x => x.SicknessCategory)
        .ThenBy(x => x.SicknessSubCategory);

  /* Done - return the response as json */
  return Json(q2.ToList(), JsonRequestBehavior.AllowGet);
}


[HttpPost]
[ValidateAntiForgeryToken]
[HandleException]
/* param name 'data' must match the object name being passed from client via json */
public async Task<ActionResult> ImportData(SicknessRiskySicknessImport excelImportData)
{
  if (excelImportData.ImportType == "purge")
  {
    /* Group and find distinct RiskySicknessIds, then delete all records that have the same RiskySicknessIds. */
    var sicknessRiskySicknessListToPurge = excelImportData.ImportList.GroupBy(x => x.RiskySicknessId).Select(x => x.FirstOrDefault()).ToList();
    foreach (var sicknessRiskySickness in sicknessRiskySicknessListToPurge)
    {
      await _productManager.DeleteSicknessesByRiskGroup(sicknessRiskySickness.RiskySicknessId);
    }
  }

  var rowIndex = 1;
  var numOfProcessedRecords = 0;
  var missingRiskySicknessIds = new List<string>();
  try
  {
    foreach (var row in excelImportData.ImportList)
    {
      rowIndex += 1;
      var sicknessRiskySickness = Mapper.Map(row, (SicknessRiskySickness)null);
      var riskySicknessId = sicknessRiskySickness.RiskySicknessId;
      var riskySickness = await _productManager.GetRiskySicknessFirstOrDefault(riskySicknessId);
      if (riskySickness != null) // check if the RiskySicknessId field matches a RiskySickness on record.
      {
        switch (excelImportData.ImportType)
        {
          case "purge":
            await _productManager.CreateSicknessRiskySicknessAsync(sicknessRiskySickness);
            numOfProcessedRecords += 1;
            break;
          case "append":
            var sicknessRiskySicknessFromDb =
              await _productManager.GetSicknessRiskySicknessByCompositeKey(sicknessRiskySickness);
            if (sicknessRiskySicknessFromDb == null) // create new record if such record does not exist
            {
              await _productManager.CreateSicknessRiskySicknessAsync(sicknessRiskySickness);
              numOfProcessedRecords += 1;
            }
            break;
        }
      }
      else
      {
        bool containsRiskySicknessId = missingRiskySicknessIds.Any(x => riskySicknessId.Contains(x));
        if (!containsRiskySicknessId)
        {
          missingRiskySicknessIds.Add(riskySicknessId);
        }
      }
    }
  }
  catch (Exception e)
  {
    throw new UserFriendlyException($"{rowIndex} nolu satırdaki kayıtta hata oluştu : " + e.Message);
  }

  if (missingRiskySicknessIds.Count > 0)
  {
    string missingIds = "";
    foreach (var id in missingRiskySicknessIds) { missingIds += ", " + id; }
    missingIds = missingIds.Substring(2);
    return Json("İçe aktarma kısmen tamamlandı. Toplam <b>" + numOfProcessedRecords + "</b> kayıt için işlem yapıldı. " +
                missingIds + " kodlu hastalık grupları tanımlı olmadığı için aktarılamadı.");
  }

  return Json("İçe aktarma başarıyla tamamlandı. Toplam <b>" + numOfProcessedRecords + "</b> kayıt için işlem yapıldı.");
}
[AutoMap(typeof(SicknessRiskySickness))]

public class SicknessRiskySicknessViewModel
{
  public byte SicknessMainCategory { get; set; }
  public byte SicknessCategory { get; set; }
  public byte SicknessSubCategory { get; set; }
  public string RiskySicknessId { get; set; }

  [AdditionalMetadata("label", "Hepsini temizle ve baştan yükle.")]
  [AdditionalMetadata("info", "[riskySicknessId] kolonundaki hastalık kodlarıyla ilişkili &#013; " +
                              "tüm kayıtlar silinir ve sadece listeli olanlar aktarılır.")]
  [AdditionalMetadata("checked", "")]// send "checked" to check the box by default.
  public bool ChkBoxPurge { get; set; }
}

public class SicknessRiskySicknessImport
{
  public string ImportType { get; set; }
  public List<SicknessRiskySicknessViewModel> ImportList { get; set; }/* name must match the model being passed from client via json */
}
@{
  var exportUrl = Url.Action("ExportData", controllerName, new { area = (string)areaName });
}

<button type="button" id="import-file" class="btn blue-madison" onclick="toggleFileUploadModal();">
  <i class="fa fa-download"></i> İçe Aktar
</button>

<button type="button" id="back-up" class="btn blue-madison" 
  onclick="exportToExcel('@exportUrl', '@ViewBag.Title', { sicknessId: $('#Sickness').val() })">
  <i class="fa fa-upload"></i> Dışa Aktar
</button>

@* Upload excel modal partial view *@
@Html.Partial("_ModalFileUpload", modelData)

@* Makes the import action url available to the excel-export-import.js file *@
<input type="hidden" id="importUrl" value="@importUrl" />

@* Upload file modal *@
<div id='ajaxModal' class='modal fade in'>
  <div class="modal-dialog">
    <div class="modal-content">
      <div id='ajaxModalContent'></div>
    </div>
  </div>
</div>

@section PageScriptInclude {
  <script src="~/Scripts/modalform.js"></script>
  
  <!-- used by excel import/export functionalities -->
  <script src="~/Scripts/export-xlsx/Blob.js"></script>
  <script src="~/Scripts/export-xlsx/FileSaver.js"></script>
  <script src="~/Scripts/export-xlsx/xlsx.full.min.js"></script>
  <script src="~/js/utils/excel-export-import.js"></script>
}