Compare commits
4 Commits
Feature/Cl
...
Feature/Ex
| Author | SHA1 | Date | |
|---|---|---|---|
| adf297455f | |||
| 8b6786c09a | |||
| 45c5d20323 | |||
| aa0eae6c83 |
@@ -8,86 +8,129 @@ using System.Text.RegularExpressions;
|
|||||||
|
|
||||||
namespace CompanyManagement.Infrastructure.Excel.InstitutionContract;
|
namespace CompanyManagement.Infrastructure.Excel.InstitutionContract;
|
||||||
|
|
||||||
|
// Enum برای تعریف ستونهای موجود
|
||||||
|
public enum ExcelColumnType
|
||||||
|
{
|
||||||
|
RowNumber, // ردیف
|
||||||
|
PhysicalContract, // قرارداد فیزیکی
|
||||||
|
ContractNo, // شماره قرارداد
|
||||||
|
Representative, // معرف
|
||||||
|
ContractingPartyName, // طرف حساب
|
||||||
|
ArchiveCode, // شماره کارفرما
|
||||||
|
EmployerName, // کارفرما
|
||||||
|
WorkshopName, // کارگاهها (چندخطی)
|
||||||
|
WorkshopCount, // تعداد کارگاه
|
||||||
|
EmployeeCount, // مجموع پرسنل
|
||||||
|
ContractStartDate, // شروع قرارداد
|
||||||
|
ContractEndDate, // پایان قرارداد
|
||||||
|
InstallmentAmount, // مبلغ قسط
|
||||||
|
ContractAmount, // مبلغ قرارداد
|
||||||
|
FinancialStatus // وضعیت مالی
|
||||||
|
}
|
||||||
|
|
||||||
|
// کلاس کانفیگ برای تنظیم ستونهای نمایشی
|
||||||
|
public class ExcelColumnConfig
|
||||||
|
{
|
||||||
|
public List<ExcelColumnType> VisibleColumns { get; set; }
|
||||||
|
|
||||||
|
public ExcelColumnConfig()
|
||||||
|
{
|
||||||
|
// فعلاً تمام ستونها فعال هستند
|
||||||
|
VisibleColumns = new List<ExcelColumnType>
|
||||||
|
{
|
||||||
|
ExcelColumnType.PhysicalContract,
|
||||||
|
ExcelColumnType.ContractNo,
|
||||||
|
ExcelColumnType.Representative,
|
||||||
|
ExcelColumnType.ContractingPartyName,
|
||||||
|
ExcelColumnType.ArchiveCode,
|
||||||
|
ExcelColumnType.EmployerName,
|
||||||
|
ExcelColumnType.WorkshopName,
|
||||||
|
ExcelColumnType.WorkshopCount,
|
||||||
|
ExcelColumnType.EmployeeCount,
|
||||||
|
ExcelColumnType.ContractStartDate,
|
||||||
|
ExcelColumnType.ContractEndDate,
|
||||||
|
ExcelColumnType.InstallmentAmount,
|
||||||
|
ExcelColumnType.ContractAmount,
|
||||||
|
ExcelColumnType.FinancialStatus
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public class InstitutionContractExcelGenerator
|
public class InstitutionContractExcelGenerator
|
||||||
{
|
{
|
||||||
|
private static ExcelColumnConfig _columnConfig = new ExcelColumnConfig();
|
||||||
|
|
||||||
public static byte[] GenerateExcel(List<InstitutionContractViewModel> institutionContractViewModels)
|
public static byte[] GenerateExcel(List<InstitutionContractExcelViewModel> contractViewModels)
|
||||||
{
|
{
|
||||||
ExcelPackage.License.SetNonCommercialOrganization("Gozareshgir Noncommercial organization");
|
ExcelPackage.License.SetNonCommercialOrganization("Gozareshgir Noncommercial organization");
|
||||||
using var package = new ExcelPackage();
|
using var package = new ExcelPackage();
|
||||||
var allWorksheet = package.Workbook.Worksheets.Add("همه");
|
|
||||||
|
|
||||||
var blueWorksheet = package.Workbook.Worksheets.Add("آبی");
|
|
||||||
blueWorksheet.TabColor = Color.LightBlue;
|
|
||||||
|
|
||||||
var grayWorksheet = package.Workbook.Worksheets.Add("خاکستری");
|
|
||||||
grayWorksheet.TabColor = Color.LightGray;
|
|
||||||
|
|
||||||
var redWorksheet = package.Workbook.Worksheets.Add("قرمز");
|
|
||||||
redWorksheet.TabColor = Color.LightCoral;
|
|
||||||
|
|
||||||
var purpleWorksheet = package.Workbook.Worksheets.Add("بنفش");
|
|
||||||
purpleWorksheet.TabColor = Color.MediumPurple;
|
|
||||||
|
|
||||||
var blackWorksheet = package.Workbook.Worksheets.Add("مشکی");
|
|
||||||
blackWorksheet.TabColor = Color.DimGray;
|
|
||||||
|
|
||||||
var yellowWorksheet = package.Workbook.Worksheets.Add("زرد");
|
|
||||||
yellowWorksheet.TabColor = Color.Yellow;
|
|
||||||
|
|
||||||
var whiteWorksheet = package.Workbook.Worksheets.Add("سفید");
|
|
||||||
whiteWorksheet.TabColor = Color.White;
|
|
||||||
|
|
||||||
|
|
||||||
CreateExcelSheet(institutionContractViewModels, allWorksheet);
|
|
||||||
|
|
||||||
var blueContracts = institutionContractViewModels.Where(x=>x.ExpireColor == "blue").ToList();
|
|
||||||
CreateExcelSheet(blueContracts, blueWorksheet);
|
|
||||||
institutionContractViewModels = institutionContractViewModels.Except(blueContracts).ToList();
|
|
||||||
|
|
||||||
var grayContracts = institutionContractViewModels.Where(x => x.IsContractingPartyBlock == "true").ToList();
|
|
||||||
CreateExcelSheet(grayContracts, grayWorksheet);
|
|
||||||
institutionContractViewModels = institutionContractViewModels.Except(grayContracts).ToList();
|
|
||||||
|
|
||||||
var redContracts = institutionContractViewModels.Where(x=>x.ExpireColor == "red").ToList();
|
|
||||||
CreateExcelSheet(redContracts, redWorksheet);
|
|
||||||
institutionContractViewModels = institutionContractViewModels.Except(redContracts).ToList();
|
|
||||||
|
|
||||||
var purpleContracts = institutionContractViewModels.Where(x=>x.ExpireColor == "purple").ToList();
|
|
||||||
CreateExcelSheet(purpleContracts, purpleWorksheet);
|
|
||||||
institutionContractViewModels = institutionContractViewModels.Except(purpleContracts).ToList();
|
|
||||||
|
|
||||||
var blackContracts = institutionContractViewModels.Where(x=>x.ExpireColor == "black").ToList();
|
// ایجاد شیت برای هر تب با دادههای مربوطه
|
||||||
CreateExcelSheet(blackContracts, blackWorksheet);
|
foreach (var viewModel in contractViewModels)
|
||||||
institutionContractViewModels = institutionContractViewModels.Except(blackContracts).ToList();
|
{
|
||||||
|
var worksheet = CreateWorksheet(package, viewModel.Tab);
|
||||||
var yellowContracts = institutionContractViewModels
|
CreateExcelSheet(viewModel.GetInstitutionContractListItemsViewModels ?? new List<GetInstitutionContractListItemsViewModel>(), worksheet);
|
||||||
.Where(x => string.IsNullOrWhiteSpace(x.ExpireColor) && x.WorkshopCount == "0").ToList();
|
}
|
||||||
CreateExcelSheet(yellowContracts, yellowWorksheet);
|
|
||||||
institutionContractViewModels = institutionContractViewModels.Except(yellowContracts).ToList();
|
|
||||||
|
|
||||||
var otherContracts = institutionContractViewModels;
|
|
||||||
CreateExcelSheet(otherContracts, whiteWorksheet);
|
|
||||||
|
|
||||||
return package.GetAsByteArray();
|
return package.GetAsByteArray();
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void CreateExcelSheet(List<InstitutionContractViewModel> institutionContractViewModels, ExcelWorksheet worksheet)
|
/// <summary>
|
||||||
|
/// ایجاد شیت بر اساس نوع تب
|
||||||
|
/// </summary>
|
||||||
|
private static ExcelWorksheet CreateWorksheet(ExcelPackage package, InstitutionContractListStatus? status)
|
||||||
{
|
{
|
||||||
// Headers
|
return status switch
|
||||||
worksheet.Cells[1, 1].Value = "شماره قرارداد";
|
{
|
||||||
worksheet.Cells[1, 2].Value = "طرف حساب";
|
InstitutionContractListStatus.DeactiveWithDebt =>
|
||||||
worksheet.Cells[1, 3].Value = "شماره کارفرما";
|
CreateColoredWorksheet(package, "غیرفعال دارای بدهی", Color.LightBlue),
|
||||||
worksheet.Cells[1, 4].Value = "کارفرما ها";
|
|
||||||
worksheet.Cells[1, 5].Value = "کارگاه ها";
|
InstitutionContractListStatus.Deactive =>
|
||||||
worksheet.Cells[1, 6].Value = "مجبوع پرسنل";
|
CreateColoredWorksheet(package, "غیرفعال", Color.LightGray),
|
||||||
worksheet.Cells[1, 7].Value = "شروع قرارداد";
|
|
||||||
worksheet.Cells[1, 8].Value = "پایان قرارداد";
|
InstitutionContractListStatus.PendingForRenewal =>
|
||||||
worksheet.Cells[1, 9].Value = "مبلغ قرارداد (بدون کارگاه)";
|
CreateColoredWorksheet(package, "در انتظار تمدید", Color.LightCoral),
|
||||||
worksheet.Cells[1, 10].Value = "مبلغ قرارداد";
|
|
||||||
worksheet.Cells[1, 11].Value = "وضعیت مالی";
|
InstitutionContractListStatus.Free =>
|
||||||
|
CreateColoredWorksheet(package, "بنفش", Color.MediumPurple),
|
||||||
|
|
||||||
|
InstitutionContractListStatus.Block =>
|
||||||
|
CreateColoredWorksheet(package, "بلاک", Color.DimGray),
|
||||||
|
|
||||||
|
InstitutionContractListStatus.WithoutWorkshop =>
|
||||||
|
CreateColoredWorksheet(package, "بدون کارگاه", Color.Yellow),
|
||||||
|
|
||||||
|
InstitutionContractListStatus.Active =>
|
||||||
|
CreateColoredWorksheet(package, "فعال", Color.White),
|
||||||
|
|
||||||
|
InstitutionContractListStatus.PendingForVerify =>
|
||||||
|
CreateColoredWorksheet(package, "در انتظار تایید", Color.OrangeRed),
|
||||||
|
|
||||||
|
null => CreateColoredWorksheet(package, "کل قرارداد ها", Color.White),
|
||||||
|
_ => throw new ArgumentOutOfRangeException(nameof(status), status, null)
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
using (var range = worksheet.Cells[1, 1, 1, 11])
|
/// <summary>
|
||||||
|
/// ایجاد شیت با رنگ تب
|
||||||
|
/// </summary>
|
||||||
|
private static ExcelWorksheet CreateColoredWorksheet(ExcelPackage package, string sheetName, Color tabColor)
|
||||||
|
{
|
||||||
|
var worksheet = package.Workbook.Worksheets.Add(sheetName);
|
||||||
|
worksheet.TabColor = tabColor;
|
||||||
|
return worksheet;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void CreateExcelSheet(List<GetInstitutionContractListItemsViewModel> contractItems, ExcelWorksheet worksheet)
|
||||||
|
{
|
||||||
|
// دریافت نقشه ستونهای مرئی
|
||||||
|
var visibleColumnIndices = GetVisibleColumnIndices();
|
||||||
|
int columnCount = visibleColumnIndices.Count;
|
||||||
|
|
||||||
|
// تنظیم Headers
|
||||||
|
SetupHeaders(worksheet, visibleColumnIndices, columnCount);
|
||||||
|
|
||||||
|
using (var range = worksheet.Cells[1, 1, 1, columnCount])
|
||||||
{
|
{
|
||||||
range.Style.HorizontalAlignment = ExcelHorizontalAlignment.Center;
|
range.Style.HorizontalAlignment = ExcelHorizontalAlignment.Center;
|
||||||
range.Style.VerticalAlignment = ExcelVerticalAlignment.Center;
|
range.Style.VerticalAlignment = ExcelVerticalAlignment.Center;
|
||||||
@@ -110,30 +153,35 @@ public class InstitutionContractExcelGenerator
|
|||||||
|
|
||||||
int row = 2;
|
int row = 2;
|
||||||
|
|
||||||
for (int i = 0; i < institutionContractViewModels.Count; i++)
|
for (int i = 0; i < contractItems.Count; i++)
|
||||||
{
|
{
|
||||||
var contract = institutionContractViewModels[i];
|
var contract = contractItems[i];
|
||||||
var employers = contract.EmployerViewModels?.ToList() ?? new();
|
var employers = contract.EmployerNames?.ToList() ?? new();
|
||||||
var workshops = contract.WorkshopViewModels?.ToList() ?? new();
|
var workshops = contract.WorkshopNames?.ToList() ?? new();
|
||||||
|
|
||||||
int maxRows = Math.Max(employers.Count, workshops.Count);
|
int maxRows = 1; // هر قرارداد فقط یک ردیف؛ نیازی به مرج عمودی نیست
|
||||||
maxRows = Math.Max(1, maxRows);
|
|
||||||
|
|
||||||
int startRow = row;
|
int startRow = row;
|
||||||
int endRow = row + maxRows - 1;
|
int endRow = row + maxRows - 1;
|
||||||
|
|
||||||
// 🎨 دریافت رنگ پسزمینه از مقدار رنگ موجود در داده
|
// 🎨 دریافت رنگ پسزمینه بر اساس وضعیت قرارداد
|
||||||
string colorName = contract.ExpireColor.ToLower();
|
var fillColor = GetColorByStatus(contract.ListStatus, contract.WorkshopsCount);
|
||||||
var fillColor = GetColorByName(colorName, contract.WorkshopCount, contract.IsContractingPartyBlock);
|
|
||||||
|
|
||||||
for (int j = 0; j < maxRows; j++)
|
for (int j = 0; j < maxRows; j++)
|
||||||
{
|
{
|
||||||
int currentRow = row + j;
|
int currentRow = row + j;
|
||||||
|
|
||||||
worksheet.Cells[currentRow, 4].Value = j < employers.Count ? employers[j].FullName : null;
|
// پر کردن ستونهای employer و workshop
|
||||||
worksheet.Cells[currentRow, 5].Value = j < workshops.Count ? workshops[j].WorkshopFullName : null;
|
var employerColIndex = GetColumnIndexForType(ExcelColumnType.EmployerName, visibleColumnIndices);
|
||||||
|
var workshopColIndex = GetColumnIndexForType(ExcelColumnType.WorkshopName, visibleColumnIndices);
|
||||||
|
|
||||||
for (int col = 1; col <= 11; col++)
|
if (employerColIndex > 0)
|
||||||
|
worksheet.Cells[currentRow, employerColIndex].Value = j < employers.Count ? employers[j] : null;
|
||||||
|
|
||||||
|
if (workshopColIndex > 0)
|
||||||
|
worksheet.Cells[currentRow, workshopColIndex].Value = j < workshops.Count ? workshops[j] : null;
|
||||||
|
|
||||||
|
for (int col = 1; col <= columnCount; col++)
|
||||||
{
|
{
|
||||||
var cell = worksheet.Cells[currentRow, col];
|
var cell = worksheet.Cells[currentRow, col];
|
||||||
|
|
||||||
@@ -154,109 +202,235 @@ public class InstitutionContractExcelGenerator
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 🧱 مرج و مقداردهی ستونهای اصلی
|
// 🧱 مرج و مقداردهی ستونهای اصلی
|
||||||
worksheet.Cells[startRow, 1, endRow, 1].Merge = true;
|
FillColumnData(worksheet, contract, startRow, endRow, visibleColumnIndices);
|
||||||
worksheet.Cells[startRow, 1].Value = contract.ContractNo;
|
|
||||||
|
|
||||||
worksheet.Cells[startRow, 2, endRow, 2].Merge = true;
|
|
||||||
worksheet.Cells[startRow, 2].Value = contract.ContractingPartyName;
|
|
||||||
|
|
||||||
worksheet.Cells[startRow, 3, endRow, 3].Merge = true;
|
|
||||||
worksheet.Cells[startRow, 3].Value = contract.ArchiveCode;
|
|
||||||
|
|
||||||
worksheet.Cells[startRow, 6, endRow, 6].Merge = true;
|
|
||||||
worksheet.Cells[startRow, 6].Value = contract.EmployeeCount;
|
|
||||||
|
|
||||||
worksheet.Cells[startRow, 7, endRow, 7].Merge = true;
|
|
||||||
worksheet.Cells[startRow, 7].Value = contract.ContractStartFa;
|
|
||||||
|
|
||||||
worksheet.Cells[startRow, 8, endRow, 8].Merge = true;
|
|
||||||
worksheet.Cells[startRow, 8].Value = contract.ContractEndFa;
|
|
||||||
|
|
||||||
worksheet.Cells[startRow, 9, endRow, 9].Merge = true;
|
|
||||||
var contractWithoutWorkshopAmountCell = worksheet.Cells[startRow, 9];
|
|
||||||
contractWithoutWorkshopAmountCell.Value = contract.WorkshopCount == "0" ? MoneyToDouble(contract.ContractAmount) : "";
|
|
||||||
contractWithoutWorkshopAmountCell.Style.Numberformat.Format = "#,##0";
|
|
||||||
|
|
||||||
|
|
||||||
worksheet.Cells[startRow, 10, endRow, 10].Merge = true;
|
|
||||||
var contractAmountCell = worksheet.Cells[startRow, 10];
|
|
||||||
contractAmountCell.Value = contract.WorkshopCount != "0" ? MoneyToDouble(contract.ContractAmount) : "";
|
|
||||||
contractAmountCell.Style.Numberformat.Format = "#,##0";
|
|
||||||
|
|
||||||
|
|
||||||
worksheet.Cells[startRow, 11, endRow, 11].Merge = true;
|
|
||||||
var balance = MoneyToDouble(contract.BalanceStr);
|
|
||||||
var balanceCell = worksheet.Cells[startRow, 11];
|
|
||||||
balanceCell.Value = balance;
|
|
||||||
balanceCell.Style.Numberformat.Format = "#,##0";
|
|
||||||
|
|
||||||
if (balance > 0)
|
|
||||||
balanceCell.Style.Font.Color.SetColor(Color.Red);
|
|
||||||
else if (balance < 0)
|
|
||||||
balanceCell.Style.Font.Color.SetColor(Color.Green);
|
|
||||||
|
|
||||||
// 📦 بوردر ضخیم خارجی برای هر سطر
|
// 📦 بوردر ضخیم خارجی برای هر سطر
|
||||||
var boldRange = worksheet.Cells[startRow, 1, endRow, 11];
|
var boldRange = worksheet.Cells[startRow, 1, endRow, columnCount];
|
||||||
boldRange.Style.Border.BorderAround(ExcelBorderStyle.Medium);
|
boldRange.Style.Border.BorderAround(ExcelBorderStyle.Medium);
|
||||||
|
|
||||||
row += maxRows;
|
row += maxRows;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SetupPrintSettings(worksheet, visibleColumnIndices, columnCount);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// دریافت فهرست ستونهای مرئی بر اساس کانفیگ
|
||||||
|
/// </summary>
|
||||||
|
private static List<ExcelColumnType> GetVisibleColumnIndices()
|
||||||
|
{
|
||||||
|
return _columnConfig.VisibleColumns;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// دریافت شماره ستون برای یک نوع ستون خاص
|
||||||
|
/// </summary>
|
||||||
|
private static int GetColumnIndexForType(ExcelColumnType columnType, List<ExcelColumnType> visibleColumns)
|
||||||
|
{
|
||||||
|
var index = visibleColumns.IndexOf(columnType);
|
||||||
|
return index >= 0 ? index + 1 : 0; // 1-based indexing
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// دریافت متن header برای یک نوع ستون
|
||||||
|
/// </summary>
|
||||||
|
private static string GetColumnHeader(ExcelColumnType columnType)
|
||||||
|
{
|
||||||
|
return columnType switch
|
||||||
|
{
|
||||||
|
ExcelColumnType.RowNumber => "ردیف",
|
||||||
|
ExcelColumnType.PhysicalContract => "قرارداد فیزیکی",
|
||||||
|
ExcelColumnType.ContractNo => "شماره قرارداد",
|
||||||
|
ExcelColumnType.Representative => "معرف",
|
||||||
|
ExcelColumnType.ContractingPartyName => "طرف حساب",
|
||||||
|
ExcelColumnType.ArchiveCode => "شماره کارفرما",
|
||||||
|
ExcelColumnType.EmployerName => "کارفرما",
|
||||||
|
ExcelColumnType.WorkshopName => "کارگاهها",
|
||||||
|
ExcelColumnType.WorkshopCount => "تعداد کارگاه",
|
||||||
|
ExcelColumnType.EmployeeCount => "مجموع پرسنل",
|
||||||
|
ExcelColumnType.ContractStartDate => "شروع قرارداد",
|
||||||
|
ExcelColumnType.ContractEndDate => "پایان قرارداد",
|
||||||
|
ExcelColumnType.InstallmentAmount => "مبلغ قسط",
|
||||||
|
ExcelColumnType.ContractAmount => "مبلغ قرارداد",
|
||||||
|
ExcelColumnType.FinancialStatus => "وضعیت مالی",
|
||||||
|
_ => ""
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// تنظیم Headerهای ستونها
|
||||||
|
/// </summary>
|
||||||
|
private static void SetupHeaders(ExcelWorksheet worksheet, List<ExcelColumnType> visibleColumns, int columnCount)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < visibleColumns.Count; i++)
|
||||||
|
{
|
||||||
|
worksheet.Cells[1, i + 1].Value = GetColumnHeader(visibleColumns[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// پر کردن دادههای ستونها برای یک قرارداد
|
||||||
|
/// </summary>
|
||||||
|
private static void FillColumnData(ExcelWorksheet worksheet, GetInstitutionContractListItemsViewModel contract, int startRow, int endRow, List<ExcelColumnType> visibleColumns)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < visibleColumns.Count; i++)
|
||||||
|
{
|
||||||
|
int columnIndex = i + 1; // 1-based indexing
|
||||||
|
var columnType = visibleColumns[i];
|
||||||
|
|
||||||
|
// Merge cells for non-repeating columns
|
||||||
|
worksheet.Cells[startRow, columnIndex, endRow, columnIndex].Merge = true;
|
||||||
|
|
||||||
|
var cell = worksheet.Cells[startRow, columnIndex];
|
||||||
|
|
||||||
|
switch (columnType)
|
||||||
|
{
|
||||||
|
case ExcelColumnType.PhysicalContract:
|
||||||
|
var physicalText = contract.IsOldContract
|
||||||
|
? (contract.HasSigniture ? "موجود" : "ناموجود")
|
||||||
|
: (contract.IsInPersonContract ? "الکترونیکی حضوری" : "الکترونیکی غیر حضوری");
|
||||||
|
|
||||||
|
cell.Value = physicalText;
|
||||||
|
cell.Style.Font.Bold = true;
|
||||||
|
cell.Style.Font.Color.SetColor(physicalText switch
|
||||||
|
{
|
||||||
|
"موجود" => Color.Green,
|
||||||
|
"ناموجود" => Color.Red,
|
||||||
|
"الکترونیکی حضوری" => Color.Purple,
|
||||||
|
_ => Color.Blue
|
||||||
|
});
|
||||||
|
break;
|
||||||
|
case ExcelColumnType.ContractNo:
|
||||||
|
cell.Value = contract.ContractNo;
|
||||||
|
break;
|
||||||
|
case ExcelColumnType.Representative:
|
||||||
|
cell.Value = contract.RepresentativeName;
|
||||||
|
break;
|
||||||
|
case ExcelColumnType.ContractingPartyName:
|
||||||
|
cell.Value = contract.ContractingPartyName;
|
||||||
|
break;
|
||||||
|
case ExcelColumnType.ArchiveCode:
|
||||||
|
cell.Value = contract.ArchiveNo;
|
||||||
|
break;
|
||||||
|
case ExcelColumnType.EmployerName:
|
||||||
|
// این ستون چندخطی است و داخل loop پر میشود
|
||||||
|
break;
|
||||||
|
case ExcelColumnType.WorkshopName:
|
||||||
|
// این ستون چندخطی است و داخل loop پر میشود
|
||||||
|
break;
|
||||||
|
case ExcelColumnType.WorkshopCount:
|
||||||
|
cell.Value = contract.WorkshopsCount;
|
||||||
|
break;
|
||||||
|
case ExcelColumnType.EmployeeCount:
|
||||||
|
cell.Value = contract.EmployeesCount;
|
||||||
|
break;
|
||||||
|
case ExcelColumnType.ContractStartDate:
|
||||||
|
cell.Value = contract.ContractStartFa;
|
||||||
|
break;
|
||||||
|
case ExcelColumnType.ContractEndDate:
|
||||||
|
cell.Value = contract.ContractEndFa;
|
||||||
|
break;
|
||||||
|
case ExcelColumnType.InstallmentAmount:
|
||||||
|
cell.Value = contract.InstallmentAmount;
|
||||||
|
cell.Style.Numberformat.Format = "#,##0";
|
||||||
|
break;
|
||||||
|
case ExcelColumnType.ContractAmount:
|
||||||
|
cell.Value = contract.ContractAmount;
|
||||||
|
cell.Style.Numberformat.Format = "#,##0";
|
||||||
|
break;
|
||||||
|
case ExcelColumnType.FinancialStatus:
|
||||||
|
cell.Value = contract.Balance;
|
||||||
|
cell.Style.Numberformat.Format = "#,##0";
|
||||||
|
|
||||||
|
if (contract.Balance > 0)
|
||||||
|
cell.Style.Font.Color.SetColor(Color.Red);
|
||||||
|
else if (contract.Balance < 0)
|
||||||
|
cell.Style.Font.Color.SetColor(Color.Green);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// تنظیم تنظیمات چاپ و عرض ستونها
|
||||||
|
/// </summary>
|
||||||
|
private static void SetupPrintSettings(ExcelWorksheet worksheet, List<ExcelColumnType> visibleColumns, int columnCount)
|
||||||
|
{
|
||||||
worksheet.PrinterSettings.PaperSize = ePaperSize.A4;
|
worksheet.PrinterSettings.PaperSize = ePaperSize.A4;
|
||||||
worksheet.PrinterSettings.Orientation = eOrientation.Landscape;
|
worksheet.PrinterSettings.Orientation = eOrientation.Landscape;
|
||||||
worksheet.PrinterSettings.FitToPage = true;
|
worksheet.PrinterSettings.FitToPage = true;
|
||||||
worksheet.PrinterSettings.FitToWidth = 1;
|
worksheet.PrinterSettings.FitToWidth = 1;
|
||||||
worksheet.PrinterSettings.FitToHeight = 0;
|
worksheet.PrinterSettings.FitToHeight = 0;
|
||||||
worksheet.PrinterSettings.Scale = 85;
|
worksheet.PrinterSettings.Scale = 85;
|
||||||
int contractNoCol = 1;
|
|
||||||
int contractingPartyNameCol = 2;
|
// تنظیم عرض ستونها بر اساس نوع ستون
|
||||||
int archiveNoCol = 3;
|
for (int i = 0; i < visibleColumns.Count; i++)
|
||||||
int employersCol = 4;
|
{
|
||||||
int workshopsCol = 5;
|
int columnIndex = i + 1;
|
||||||
int employeeCountCol = 6;
|
worksheet.Columns[columnIndex].Width = GetColumnWidth(visibleColumns[i]);
|
||||||
int startContractCol = 7;
|
}
|
||||||
int endContractCol = 8;
|
|
||||||
int contractWithoutWorkshopAmountCol = 9;
|
|
||||||
int contractAmountCol = 10;
|
|
||||||
int balanceCol = 11;
|
|
||||||
worksheet.Columns[contractNoCol].Width = 17;
|
|
||||||
worksheet.Columns[contractingPartyNameCol].Width = 40;
|
|
||||||
worksheet.Columns[archiveNoCol].Width = 10;
|
|
||||||
worksheet.Columns[employersCol].Width = 40;
|
|
||||||
worksheet.Columns[workshopsCol].Width = 45;
|
|
||||||
worksheet.Columns[employeeCountCol].Width = 12;
|
|
||||||
worksheet.Columns[startContractCol].Width = 12;
|
|
||||||
worksheet.Columns[endContractCol].Width = 12;
|
|
||||||
worksheet.Columns[contractWithoutWorkshopAmountCol].Width = 18;
|
|
||||||
worksheet.Columns[contractAmountCol].Width = 12;
|
|
||||||
worksheet.Columns[balanceCol].Width = 12;
|
|
||||||
worksheet.View.RightToLeft = true; // فارسی
|
worksheet.View.RightToLeft = true; // فارسی
|
||||||
//worksheet.Cells[worksheet.Dimension.Address].AutoFitColumns();
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// دریافت عرض ستون پیشفرض برای هر نوع ستون
|
||||||
|
/// </summary>
|
||||||
|
private static double GetColumnWidth(ExcelColumnType columnType)
|
||||||
|
{
|
||||||
|
return columnType switch
|
||||||
|
{
|
||||||
|
ExcelColumnType.RowNumber => 8,
|
||||||
|
ExcelColumnType.PhysicalContract => 15,
|
||||||
|
ExcelColumnType.ContractNo => 17,
|
||||||
|
ExcelColumnType.Representative => 15,
|
||||||
|
ExcelColumnType.ContractingPartyName => 40,
|
||||||
|
ExcelColumnType.ArchiveCode => 10,
|
||||||
|
ExcelColumnType.EmployerName => 40,
|
||||||
|
ExcelColumnType.WorkshopName => 45,
|
||||||
|
ExcelColumnType.WorkshopCount => 12,
|
||||||
|
ExcelColumnType.EmployeeCount => 12,
|
||||||
|
ExcelColumnType.ContractStartDate => 12,
|
||||||
|
ExcelColumnType.ContractEndDate => 12,
|
||||||
|
ExcelColumnType.InstallmentAmount => 15,
|
||||||
|
ExcelColumnType.ContractAmount => 15,
|
||||||
|
ExcelColumnType.FinancialStatus => 12,
|
||||||
|
_ => 12
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
private static double MoneyToDouble(string value)
|
private static double MoneyToDouble(string value)
|
||||||
{
|
{
|
||||||
Console.WriteLine(value);
|
if (string.IsNullOrEmpty(value))
|
||||||
|
return 0;
|
||||||
|
|
||||||
var min = value.Length > 1 ? value.Substring(0, 2) : "";
|
var min = value.Length > 1 ? value.Substring(0, 2) : "";
|
||||||
var test = min == "\u200e\u2212" ? value.MoneyToDouble() * -1 : value.MoneyToDouble();
|
var test = min == "\u200e\u2212" ? value.MoneyToDouble() * -1 : value.MoneyToDouble();
|
||||||
|
|
||||||
Console.WriteLine(test);
|
|
||||||
return test;
|
return test;
|
||||||
}
|
}
|
||||||
private static Color GetColorByName(string name, string workshopCount, string IsContractingPartyBlock)
|
|
||||||
|
/// <summary>
|
||||||
|
/// دریافت رنگ بر اساس وضعیت قرارداد
|
||||||
|
/// </summary>
|
||||||
|
private static Color GetColorByStatus(InstitutionContractListStatus status, int workshopsCount)
|
||||||
{
|
{
|
||||||
return name switch
|
return status switch
|
||||||
{
|
{
|
||||||
"blue" => Color.LightBlue,
|
InstitutionContractListStatus.DeactiveWithDebt => Color.LightBlue,
|
||||||
_ when IsContractingPartyBlock == "true" => Color.LightGray,
|
InstitutionContractListStatus.Deactive => Color.LightGray,
|
||||||
"red" => Color.LightCoral,
|
InstitutionContractListStatus.PendingForRenewal => Color.LightCoral,
|
||||||
"purple" => Color.MediumPurple,
|
InstitutionContractListStatus.Free => Color.MediumPurple,
|
||||||
"black" => Color.DimGray,
|
InstitutionContractListStatus.Block => Color.DimGray,
|
||||||
var n when string.IsNullOrWhiteSpace(n) && workshopCount == "0" => Color.Yellow,
|
InstitutionContractListStatus.WithoutWorkshop => Color.Yellow,
|
||||||
|
InstitutionContractListStatus.Active => Color.White,
|
||||||
_ => Color.White
|
_ => Color.White
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public class InstitutionContractExcelViewModel
|
||||||
|
{
|
||||||
|
public InstitutionContractListStatus? Tab { get; set; }
|
||||||
|
public List<GetInstitutionContractListItemsViewModel> GetInstitutionContractListItemsViewModels { get; set; }
|
||||||
|
}
|
||||||
|
|||||||
@@ -341,7 +341,7 @@ public class institutionContractController : AdminBaseController
|
|||||||
{
|
{
|
||||||
var institutionContractViewModels =
|
var institutionContractViewModels =
|
||||||
_institutionContractApplication.NewSearch(new() { IsActiveString = "both", TypeOfContract = "both" });
|
_institutionContractApplication.NewSearch(new() { IsActiveString = "both", TypeOfContract = "both" });
|
||||||
var bytes = InstitutionContractExcelGenerator.GenerateExcel(institutionContractViewModels);
|
var bytes = InstitutionContractExcelGenerator.GenerateExcel(new List<InstitutionContractExcelViewModel>());
|
||||||
return File(bytes,
|
return File(bytes,
|
||||||
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
|
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
|
||||||
$"قرارداد های مالی.xlsx");
|
$"قرارداد های مالی.xlsx");
|
||||||
@@ -814,6 +814,34 @@ public class institutionContractController : AdminBaseController
|
|||||||
var res= await _institutionContractApplication.VerifyInstitutionContractManually(id);
|
var res= await _institutionContractApplication.VerifyInstitutionContractManually(id);
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[HttpGet("excel-download")]
|
||||||
|
public async Task<IActionResult> ExcelDownload()
|
||||||
|
{
|
||||||
|
|
||||||
|
var searchModel = new InstitutionContractListSearchModel();
|
||||||
|
|
||||||
|
var dataVm=new List<InstitutionContractExcelViewModel>();
|
||||||
|
|
||||||
|
foreach (var name in typeof(InstitutionContractListStatus).GetEnumNames())
|
||||||
|
{
|
||||||
|
var @enum = Enum.Parse<InstitutionContractListStatus>(name);
|
||||||
|
searchModel.Status = @enum;
|
||||||
|
searchModel.PageSize = 99999;
|
||||||
|
var data =( await(_institutionContractApplication.GetList(searchModel))).List;
|
||||||
|
dataVm.Add(new InstitutionContractExcelViewModel(){Tab = @enum, GetInstitutionContractListItemsViewModels = data});
|
||||||
|
}
|
||||||
|
|
||||||
|
searchModel.Status = null;
|
||||||
|
|
||||||
|
var nullData = ( await(_institutionContractApplication.GetList(searchModel))).List;
|
||||||
|
dataVm.Add(new InstitutionContractExcelViewModel(){Tab = null, GetInstitutionContractListItemsViewModels = nullData});
|
||||||
|
|
||||||
|
var bytes = InstitutionContractExcelGenerator.GenerateExcel(dataVm);
|
||||||
|
return File(bytes,
|
||||||
|
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
|
||||||
|
$"قرارداد های مالی.xlsx");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
using System.Drawing;
|
using System.Drawing;
|
||||||
using _0_Framework.Application;
|
using _0_Framework.Application;
|
||||||
using AccountManagement.Application.Contracts.Account;
|
using AccountManagement.Application.Contracts.Account;
|
||||||
|
using Company.Domain.InstitutionContractAgg;
|
||||||
using CompanyManagement.Infrastructure.Excel.InstitutionContract;
|
using CompanyManagement.Infrastructure.Excel.InstitutionContract;
|
||||||
using CompanyManagment.App.Contracts.Employer;
|
using CompanyManagment.App.Contracts.Employer;
|
||||||
using CompanyManagment.App.Contracts.InstitutionContract;
|
using CompanyManagment.App.Contracts.InstitutionContract;
|
||||||
@@ -38,6 +39,7 @@ public class IndexModel : PageModel
|
|||||||
private readonly IInstitutionContractApplication _institutionContract;
|
private readonly IInstitutionContractApplication _institutionContract;
|
||||||
private readonly ILeftWorkApplication _leftWorkApplication;
|
private readonly ILeftWorkApplication _leftWorkApplication;
|
||||||
private readonly IRepresentativeApplication _representativeApplication;
|
private readonly IRepresentativeApplication _representativeApplication;
|
||||||
|
private readonly IInstitutionContractRepository _institutionContractRepository;
|
||||||
|
|
||||||
|
|
||||||
private readonly string _viewName;
|
private readonly string _viewName;
|
||||||
@@ -60,7 +62,7 @@ public class IndexModel : PageModel
|
|||||||
IPersonalContractingPartyApp contractingPartyApplication,
|
IPersonalContractingPartyApp contractingPartyApplication,
|
||||||
IRepresentativeApplication representativeApplication, IInstitutionContractApplication institutionContract,
|
IRepresentativeApplication representativeApplication, IInstitutionContractApplication institutionContract,
|
||||||
ILeftWorkApplication leftWorkApplication
|
ILeftWorkApplication leftWorkApplication
|
||||||
, IContactInfoApplication contactInfoApplication, IAccountApplication accountApplication)
|
, IContactInfoApplication contactInfoApplication, IAccountApplication accountApplication, IInstitutionContractRepository institutionContractRepository)
|
||||||
|
|
||||||
{
|
{
|
||||||
_workshopApplication = workshopApplication;
|
_workshopApplication = workshopApplication;
|
||||||
@@ -71,6 +73,7 @@ public class IndexModel : PageModel
|
|||||||
_leftWorkApplication = leftWorkApplication;
|
_leftWorkApplication = leftWorkApplication;
|
||||||
_contactInfoApplication = contactInfoApplication;
|
_contactInfoApplication = contactInfoApplication;
|
||||||
_accountApplication = accountApplication;
|
_accountApplication = accountApplication;
|
||||||
|
_institutionContractRepository = institutionContractRepository;
|
||||||
}
|
}
|
||||||
|
|
||||||
public string Message { get; set; }
|
public string Message { get; set; }
|
||||||
@@ -920,12 +923,27 @@ public class IndexModel : PageModel
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public IActionResult OnGetDownloadExcel()
|
public async Task<IActionResult> OnGetDownloadExcel()
|
||||||
{
|
{
|
||||||
var institutionContractViewModels = _institutionContract.NewSearch(new() {IsActiveString = "both", TypeOfContract = "both" });
|
var searchModel = new InstitutionContractListSearchModel();
|
||||||
|
|
||||||
institutionContractViewModels= institutionContractViewModels.GroupBy(x=>x.ContractingPartyId).Select(g=>g.MaxBy(x=>x.ContractStartGr)).ToList();
|
var dataVm=new List<InstitutionContractExcelViewModel>();
|
||||||
var bytes = InstitutionContractExcelGenerator.GenerateExcel(institutionContractViewModels);
|
|
||||||
|
foreach (var name in typeof(InstitutionContractListStatus).GetEnumNames())
|
||||||
|
{
|
||||||
|
var @enum = Enum.Parse<InstitutionContractListStatus>(name);
|
||||||
|
searchModel.Status = @enum;
|
||||||
|
searchModel.PageSize = 99999;
|
||||||
|
var data =( await(_institutionContractRepository.GetList(searchModel))).List;
|
||||||
|
dataVm.Add(new InstitutionContractExcelViewModel(){Tab = @enum, GetInstitutionContractListItemsViewModels = data});
|
||||||
|
}
|
||||||
|
|
||||||
|
searchModel.Status = null;
|
||||||
|
|
||||||
|
var nullData = ( await(_institutionContractRepository.GetList(searchModel))).List;
|
||||||
|
dataVm.Add(new InstitutionContractExcelViewModel(){Tab = null, GetInstitutionContractListItemsViewModels = nullData});
|
||||||
|
|
||||||
|
var bytes = InstitutionContractExcelGenerator.GenerateExcel(dataVm);
|
||||||
return File(bytes,
|
return File(bytes,
|
||||||
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
|
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
|
||||||
$"قرارداد های مالی.xlsx");
|
$"قرارداد های مالی.xlsx");
|
||||||
|
|||||||
@@ -289,6 +289,7 @@ builder.Services.AddCors(options =>
|
|||||||
"http://localhost:3000",
|
"http://localhost:3000",
|
||||||
"http://localhost:4000",
|
"http://localhost:4000",
|
||||||
"http://localhost:4001",
|
"http://localhost:4001",
|
||||||
|
"http://localhost:4002",
|
||||||
"http://localhost:3001",
|
"http://localhost:3001",
|
||||||
"https://gozareshgir.ir",
|
"https://gozareshgir.ir",
|
||||||
"https://dad-mehr.ir",
|
"https://dad-mehr.ir",
|
||||||
|
|||||||
@@ -11,7 +11,7 @@
|
|||||||
},
|
},
|
||||||
"ServiceHost": {
|
"ServiceHost": {
|
||||||
"commandName": "Project",
|
"commandName": "Project",
|
||||||
"launchBrowser": true,
|
"launchBrowser": false,
|
||||||
"environmentVariables": {
|
"environmentVariables": {
|
||||||
"ASPNETCORE_ENVIRONMENT": "Development",
|
"ASPNETCORE_ENVIRONMENT": "Development",
|
||||||
"ASPNETCORE_HOSTINGSTARTUPASSEMBLIES": "Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation"
|
"ASPNETCORE_HOSTINGSTARTUPASSEMBLIES": "Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation"
|
||||||
|
|||||||
Reference in New Issue
Block a user