Compare commits

...

5 Commits

2 changed files with 775 additions and 520 deletions

View File

@@ -0,0 +1,170 @@
using CompanyManagment.App.Contracts.InstitutionContract;
using OfficeOpenXml;
using OfficeOpenXml.Style;
using System.Drawing;
namespace CompanyManagement.Infrastructure.Excel.Temp;
public class GetAllContractingPartyExcelGenerator
{
public static byte[] GenerateExcel(List<DataExcelResult> dataList)
{
ExcelPackage.LicenseContext = LicenseContext.NonCommercial;
using var package = new ExcelPackage();
var archive99Sheet = package.Workbook.Worksheets.Add("کارگاه های 99");
var rollCallSheet = package.Workbook.Worksheets.Add("حضورغیابی");
var archive99Data = dataList.Where(x => x.Workshops.Any(a => a.ArchiveCode == "99")).ToList();
CreateSheet(archive99Data, archive99Sheet);
CreateSheet(dataList.Where(x=>x.Workshops.Any(w=>w.HasRollCall)).ToList(), rollCallSheet);
return package.GetAsByteArray();
}
private static void CreateSheet(List<DataExcelResult> dataList, ExcelWorksheet ws)
{
string[] headers = new[]
{
"ContractingPartyId", "نام طرف حساب", "EmployerId", "نام کارفرما", "WorkshopId", "کد کارگاه", "نام کارگاه",
"خدمات قرارداد", "خدمات قرارداد حضوری", "خدمات بیمه", "خدمات بیمه حضوری",
"خدمات حضورغیاب", "فیش حقوقی غیر رسمی", "تعداد استند", "تعداد ماه های بدهی قبلی برای حضورغیاب"
};
for (int i = 0; i < headers.Length; i++)
{
var cell = ws.Cells[1, i + 1];
cell.Value = headers[i];
cell.Style.Font.Bold = true;
cell.Style.HorizontalAlignment = ExcelHorizontalAlignment.Center;
cell.Style.VerticalAlignment = ExcelVerticalAlignment.Center;
cell.Style.Fill.PatternType = ExcelFillStyle.Solid;
cell.Style.Fill.BackgroundColor.SetColor(Color.LightGray);
cell.Style.Border.BorderAround(ExcelBorderStyle.Thin);
}
int row = 2;
foreach (var data in dataList)
{
int partyStartRow = row;
foreach (var workshop in data.Workshops)
{
int workshopStartRow = row;
var employers = workshop.Employers.Any()
? workshop.Employers
: new List<EmployerExcelResultData> { new() };
foreach (var employer in employers)
{
ws.Cells[row, 1].Value = data.ContractingPartyId;
ws.Cells[row, 2].Value = data.ContractingPartyName;
ws.Cells[row, 3].Value = employer?.Id;
ws.Cells[row, 4].Value = employer?.EmployerName;
ws.Cells[row, 5].Value = workshop.Id;
ws.Cells[row, 6].Value = workshop.ArchiveCode;
ws.Cells[row, 7].Value = workshop.WorkshopName;
ws.Cells[row, 8].Value = Convert.ToInt32(workshop.HasContract);
ws.Cells[row, 9].Value = 0; // فرضی
ws.Cells[row, 10].Value = Convert.ToInt32(workshop.HasInsurance);
ws.Cells[row, 11].Value = 0; // فرضی
ws.Cells[row, 12].Value = Convert.ToInt32(workshop.HasRollCall);
ws.Cells[row, 13].Value = Convert.ToInt32(workshop.HasCustomizeCheckout);
ws.Cells[row, 14].Value = 0;
ws.Cells[row, 15].Value = workshop.DebtRollCallMonth;
// 🌿 رنگ سبز برای سلول‌هایی که مقدارشان 1 است (True)
int[] boolCols = new[] { 8, 10, 12, 13, 14, 15 };
foreach (var col in boolCols)
{
var cell = ws.Cells[row, col];
if (Convert.ToInt32(cell.Value) > 0)
{
cell.Style.Fill.PatternType = ExcelFillStyle.Solid;
cell.Style.Fill.BackgroundColor.SetColor(Color.FromArgb(198, 239, 206)); // سبز اکسل
}
}
// Style: وسط‌چین + بوردر نازک برای همه سلول‌ها
for (int col = 1; col <= 15; col++)
{
var cell = ws.Cells[row, col];
cell.Style.HorizontalAlignment = ExcelHorizontalAlignment.Center;
cell.Style.VerticalAlignment = ExcelVerticalAlignment.Center;
cell.Style.Border.Top.Style = ExcelBorderStyle.Thin;
cell.Style.Border.Bottom.Style = ExcelBorderStyle.Thin;
cell.Style.Border.Left.Style = ExcelBorderStyle.Thin;
cell.Style.Border.Right.Style = ExcelBorderStyle.Thin;
}
row++;
}
// Merge Workshop Columns
if (employers.Count > 1)
{
for (int col = 5; col <= 15; col++)
{
ws.Cells[workshopStartRow, col, row - 1, col].Merge = true;
var merged = ws.Cells[workshopStartRow, col, row - 1, col];
merged.Style.VerticalAlignment = ExcelVerticalAlignment.Center;
merged.Style.HorizontalAlignment = ExcelHorizontalAlignment.Center;
}
}
}
// Merge Contracting Party Columns
if (row - partyStartRow > 1)
{
for (int col = 1; col <= 2; col++)
{
ws.Cells[partyStartRow, col, row - 1, col].Merge = true;
var merged = ws.Cells[partyStartRow, col, row - 1, col];
merged.Style.VerticalAlignment = ExcelVerticalAlignment.Center;
merged.Style.HorizontalAlignment = ExcelHorizontalAlignment.Center;
}
}
// می‌تونی در صورت نیاز خط بالا و پایین ضخیم برای گروه‌ها رو هم فعال کنی اینجا
// for (int col = 1; col <= 15; col++)
// {
// ws.Cells[partyStartRow, col].Style.Border.Top.Style = ExcelBorderStyle.Medium;
// ws.Cells[row - 1, col].Style.Border.Bottom.Style = ExcelBorderStyle.Medium;
// }
}
ws.Cells.AutoFitColumns();
ws.View.RightToLeft = true;
}
}
public class DataExcelResult
{
public long ContractingPartyId { get; set; }
public string ContractingPartyName { get; set; }
public List<WorkshopExcelResultData> Workshops { get; set; }
}
public class EmployerExcelResultData
{
public long Id { get; set; }
public string EmployerName { get; set; }
}
public class WorkshopExcelResultData
{
public long Id { get; set; }
public string WorkshopName { get; set; }
public bool HasContract { get; set; }
public bool HasInsurance { get; set; }
public bool HasRollCall { get; set; }
public bool HasCustomizeCheckout { get; set; }
public List<EmployerExcelResultData> Employers { get; set; }
public int DebtRollCallMonth { get; set; }
public string ArchiveCode { get; set; }
}

View File

@@ -6,6 +6,7 @@ using Company.Domain.CustomizeCheckoutAgg.ValueObjects;
using Company.Domain.CustomizeCheckoutTempAgg.ValueObjects; using Company.Domain.CustomizeCheckoutTempAgg.ValueObjects;
using Company.Domain.RewardAgg; using Company.Domain.RewardAgg;
using Company.Domain.RollCallAgg.DomainService; using Company.Domain.RollCallAgg.DomainService;
using CompanyManagement.Infrastructure.Excel.Temp;
using CompanyManagment.App.Contracts.AndroidApkVersion; using CompanyManagment.App.Contracts.AndroidApkVersion;
using CompanyManagment.EFCore; using CompanyManagment.EFCore;
using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Authorization;
@@ -13,11 +14,11 @@ using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages; using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
namespace ServiceHost.Areas.AdminNew.Pages.Company.AndroidApk namespace ServiceHost.Areas.AdminNew.Pages.Company.AndroidApk;
[Authorize]
public class IndexModel : PageModel
{ {
[Authorize]
public class IndexModel : PageModel
{
private readonly IAndroidApkVersionApplication _application; private readonly IAndroidApkVersionApplication _application;
private readonly IRollCallDomainService _rollCallDomainService; private readonly IRollCallDomainService _rollCallDomainService;
private readonly CompanyContext _context; private readonly CompanyContext _context;
@@ -90,14 +91,17 @@ namespace ServiceHost.Areas.AdminNew.Pages.Company.AndroidApk
//Console.WriteLine("endStep 1 ============"); //Console.WriteLine("endStep 1 ============");
//SetRollCall(r1); //SetRollCall(r1);
await ChangeFridayWorkToWeeklyDayOfWeek(); //await ChangeFridayWorkToWeeklyDayOfWeek();
ViewData["message"] = "تومام دو"; var bytes = await GetExcelPricingData();
return Page(); return File(bytes,
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
$"اطلاعات کارگاه ها.xlsx");
} }
private async System.Threading.Tasks.Task SetWorkshopRoleSubAccount() private async System.Threading.Tasks.Task SetWorkshopRoleSubAccount()
{ {
var subAccountRoles = _accountContext.SubAccountRoles.Include(x=>x.SubAccounts).ToList(); var subAccountRoles = _accountContext.SubAccountRoles.Include(x => x.SubAccounts).ToList();
subAccountRoles.ForEach(role => subAccountRoles.ForEach(role =>
{ {
@@ -260,7 +264,7 @@ namespace ServiceHost.Areas.AdminNew.Pages.Company.AndroidApk
var calculationMonth = Convert.ToInt32(calculationDate.ToFarsiMonth()); var calculationMonth = Convert.ToInt32(calculationDate.ToFarsiMonth());
var calculationYear = Convert.ToInt32(calculationDate.ToFarsiYear()); var calculationYear = Convert.ToInt32(calculationDate.ToFarsiYear());
salaryAid.Edit(salaryAid.Amount,salaryAid.SalaryAidDateTime,0,UserType.Anonymous,calculationMonth, calculationYear); salaryAid.Edit(salaryAid.Amount, salaryAid.SalaryAidDateTime, 0, UserType.Anonymous, calculationMonth, calculationYear);
} }
@@ -273,7 +277,7 @@ namespace ServiceHost.Areas.AdminNew.Pages.Company.AndroidApk
.Include(x => x.EmployeeDocumentItemCollection) .Include(x => x.EmployeeDocumentItemCollection)
.Where(x => x.IsConfirmed); .Where(x => x.IsConfirmed);
var employeeClientTemps = await _context.EmployeeClientTemps.Where(x=>employeeDocuments.Any(a=>a.WorkshopId == x.WorkshopId && a.EmployeeId == x.EmployeeId)).ToListAsync(); var employeeClientTemps = await _context.EmployeeClientTemps.Where(x => employeeDocuments.Any(a => a.WorkshopId == x.WorkshopId && a.EmployeeId == x.EmployeeId)).ToListAsync();
foreach (var employeeClientTemp in employeeClientTemps) foreach (var employeeClientTemp in employeeClientTemps)
{ {
@@ -285,7 +289,7 @@ namespace ServiceHost.Areas.AdminNew.Pages.Company.AndroidApk
private async System.Threading.Tasks.Task ChangeIsConfirmed() private async System.Threading.Tasks.Task ChangeIsConfirmed()
{ {
var employeeDocuments = await _context.EmployeeDocuments.Include(x=>x.EmployeeDocumentItemCollection).ToListAsync(); var employeeDocuments = await _context.EmployeeDocuments.Include(x => x.EmployeeDocumentItemCollection).ToListAsync();
foreach (var employeeDocument in employeeDocuments) foreach (var employeeDocument in employeeDocuments)
{ {
employeeDocument.UpdateRequiredItemsSubmittedByClient(); employeeDocument.UpdateRequiredItemsSubmittedByClient();
@@ -561,5 +565,86 @@ namespace ServiceHost.Areas.AdminNew.Pages.Company.AndroidApk
await _context.SaveChangesAsync(); await _context.SaveChangesAsync();
} }
#region GetDataForExcel
private async Task<byte[]> GetExcelPricingData()
{
var now = DateTime.Today;
var contractingPartyIds = _context.InstitutionContractSet.AsNoTracking()
.Where(c => c.ContractStartGr <= now && c.ContractEndGr >= now)
.Select(c => c.ContractingPartyId);
var data = await _context.PersonalContractingParties.Where(x=>contractingPartyIds.Contains(x.id))
.Include(x => x.Employers)
.ThenInclude(x => x.WorkshopEmployers)
.ThenInclude(x => x.Workshop).ThenInclude(x => x.LeftWorks)
.Include(x => x.Employers)
.ThenInclude(x => x.WorkshopEmployers)
.AsSplitQuery().Select(x => new DataExcelResult()
{
ContractingPartyId = x.id,
ContractingPartyName = x.FName + " " + x.LName,
//Workshops = x.Employers.SelectMany(e => e.WorkshopEmployers.Select(we => new WorkshopExcelResultData()
// {
// Id = we.Workshop.id,
// HasContract = we.Workshop.LeftWorks.Any(l => l.StartWorkDate >= now && l.LeftWorkDate <= now),
// HasRollCall =
// we.Workshop.RollCallServicesList.Any(a => a.StartService >= now && a.EndService <= now),
// HasInsurance = we.Workshop.InsuranceCode != null,
// HasCustomizeCheckout = we.Workshop.RollCallServicesList.Any(a =>
// a.StartService >= now & a.EndService <= now && a.HasCustomizeCheckoutService == "true"),
// WorkshopName = we.Workshop.WorkshopFullName,
// Employers = we.Workshop.WorkshopEmployers.Select(em => new EmployerExcelResultData()
// {
// EmployerName = em.Employer.FullName,
// Id = em.EmployerId
// }).ToList(),
// }).ToList()
Workshops = _context.Workshops
.Include(w => w.WorkshopEmployers)
.ThenInclude(we => we.Employer)
.Where(w => x.Employers
.SelectMany(e => e.WorkshopEmployers.Select(we => we.WorkshopId)).Contains(w.id)).Select(w =>
new WorkshopExcelResultData()
{
Id = w.id,
HasContract = w.LeftWorks.Any(l => l.StartWorkDate <= now && l.LeftWorkDate >= now),
HasRollCall =
w.RollCallServicesList.Any(a => a.StartService <= now && a.EndService >= now),
HasInsurance = w.LeftWorkInsurances.Any(l=>l.StartWorkDate <= now && l.LeftWorkDate == null),
HasCustomizeCheckout = w.RollCallServicesList.Any(a =>
a.StartService >= now & a.EndService <= now && a.HasCustomizeCheckoutService == "true"),
WorkshopName = w.WorkshopFullName,
ArchiveCode = w.ArchiveCode,
Employers = w.WorkshopEmployers.Select(em => new EmployerExcelResultData()
{
EmployerName = em.Employer.FullName,
Id = em.EmployerId
}).ToList(),
}).ToList()
}).ToListAsync();
data.ForEach(x =>
{
x.Workshops.ForEach(w =>
{
if (w.HasRollCall)
{
var rollCallService = _context.RollCallServices.First(a => a.StartService <= now && a.EndService >= now);
var elapsed = now - rollCallService.StartService;
var approxMonths = elapsed.TotalDays / 30.0;
var spentMonth = approxMonths >= 2 ? 2 : (int)Math.Floor(approxMonths);
w.DebtRollCallMonth = spentMonth;
} }
});
});
var bytes = GetAllContractingPartyExcelGenerator.GenerateExcel(data);
return bytes;
}
#endregion
} }