Merge branch 'Feature/InstitutionContract/Create-Api' into Main

This commit is contained in:
MahanCh
2025-08-06 11:37:37 +03:30
8 changed files with 263 additions and 6 deletions

View File

@@ -13,6 +13,7 @@ namespace Company.Domain.FinancialStatmentAgg;
public interface IFinancialStatmentRepository : IRepository<long, FinancialStatment>
{
[Obsolete("این متد منسوخ شده است. لطفاً از متد GetDetailsByContractingParty استفاده کنید.")]
FinancialStatmentViewModel GetDetailsByContractingPartyId(long contractingPartyId);
List<FinancialStatmentViewModel> Search(FinancialStatmentSearchModel searchModel);
Task<ClientFinancialStatementViewModel> GetClientFinancialStatement(long accountId,
@@ -21,4 +22,5 @@ public interface IFinancialStatmentRepository : IRepository<long, FinancialStatm
Task<OperationResult<ClientFinancialStatementViewModel>> GetDetailsByPublicId(string publicId);
Task<GetFinancialStatementBalanceAmount> GetBalanceAmount(long id);
Task<double> GetClientDebtAmount(long accountId);
Task<FinancialStatmentDetailsByContractingPartyViewModel> GetDetailsByContractingParty(long contractingPartyId);
}

View File

@@ -30,5 +30,5 @@ public class ClientFinancialStatementViewModel
/// <summary>
/// تراکنش ها
/// </summary>
public List<ClientFinancialTransactionViewModel> Transactions { get; set; }
public List<FinancialTransactionDetailViewModel> Transactions { get; set; }
}

View File

@@ -2,7 +2,7 @@
namespace CompanyManagment.App.Contracts.FinancialStatment;
public class ClientFinancialTransactionViewModel
public class FinancialTransactionDetailViewModel
{
/// <summary>
/// زمان و تاریخ میلادی

View File

@@ -1,4 +1,5 @@
using _0_Framework.Application;
using System;
using _0_Framework.Application;
using CompanyManagment.App.Contracts.FinancilTransaction;
using Microsoft.AspNetCore.Mvc;
using System.Collections.Generic;
@@ -19,6 +20,7 @@ public interface IFinancialStatmentApplication
OperationResult Create(CreateFinancialStatment command);
List<FinancialStatmentViewModel> Search(FinancialStatmentSearchModel searchModel);
[Obsolete("این متد منسوخ شده است. لطفاً از متد GetDetailsByContractingParty استفاده کنید.")]
FinancialStatmentViewModel GetDetailsByContractingPartyId(long contractingPartyId);
/// <summary>
@@ -30,6 +32,7 @@ public interface IFinancialStatmentApplication
Task<ClientFinancialStatementViewModel> GetClientFinancialStatement(ClientFinancialStatementSearchModel searchModel,
long accountId);
/// <summary>
/// نمایش اطلاعات صورت حساب مالی کلاینت بر اساس کد هش
/// </summary>
@@ -50,6 +53,44 @@ public interface IFinancialStatmentApplication
/// <param name="accountId"></param>
/// <returns></returns>
Task<double> GetClientDebtAmount(long accountId);
/// <summary>
/// جزئیات بر اساس
/// </summary>
/// <param name="contractingPartyId"></param>
/// <returns></returns>
Task<FinancialStatmentDetailsByContractingPartyViewModel> GetDetailsByContractingParty(long contractingPartyId);
}
public class FinancialStatmentDetailsByContractingPartyViewModel
{
/// <summary>
/// آیدی FinancialStatement
/// </summary>
public long Id { get; set; }
/// <summary>
/// نام طرف حساب
/// </summary>
public string ContractingPartyName { get; set; }
/// <summary>
/// جمع بدهکاری
/// </summary>
public double TotalDebt { get; set; }
/// <summary>
/// جمع بستانکاری
/// </summary>
public double TotalCredit { get; set; }
/// <summary>
/// مبلغ قابل پرداخت
/// </summary>
public double TotalAmountPayable { get; set; }
/// <summary>
/// تراکنش ها
/// </summary>
public List<FinancialTransactionDetailViewModel> List { get; set; }
}
public class GetFinancialStatementBalanceAmount

View File

@@ -196,4 +196,9 @@ public class FinancialStatmentApplication : IFinancialStatmentApplication
{
return _financialStatmentRepository.GetClientDebtAmount(accountId);
}
public async Task<FinancialStatmentDetailsByContractingPartyViewModel> GetDetailsByContractingParty(long contractingPartyId)
{
return await _financialStatmentRepository.GetDetailsByContractingParty(contractingPartyId);
}
}

View File

@@ -153,7 +153,7 @@ public class FinancialStatmentRepository : RepositoryBase<long, FinancialStatmen
}
}
return new ClientFinancialTransactionViewModel()
return new FinancialTransactionDetailViewModel()
{
DateTimeGr = t.TdateGr,
DateFa = t.TdateGr.ToFarsi(),
@@ -194,7 +194,7 @@ public class FinancialStatmentRepository : RepositoryBase<long, FinancialStatmen
TotalCredit = financialStatement.FinancialTransactionList.Sum(x => x.Creditor),
TotalDebt = financialStatement.FinancialTransactionList.Sum(x => x.Deptor),
ContractingPartyName = financialStatement.ContractingPartyName,
Transactions = financialStatement.FinancialTransactionList.Select(t => new ClientFinancialTransactionViewModel()
Transactions = financialStatement.FinancialTransactionList.Select(t => new FinancialTransactionDetailViewModel()
{
DateTimeGr = t.TdateGr,
DateFa = t.TdateGr.ToFarsi(),
@@ -248,5 +248,39 @@ public class FinancialStatmentRepository : RepositoryBase<long, FinancialStatmen
}
public async Task<FinancialStatmentDetailsByContractingPartyViewModel> GetDetailsByContractingParty(long contractingPartyId)
{
var financialStatement = await _context.FinancialStatments
.Include(x=>x.FinancialTransactionList)
.FirstOrDefaultAsync(x=>x.ContractingPartyId == contractingPartyId);
if (financialStatement == null)
{
throw new NotFoundException("وضعیت مالی مورد نظر یافت نشد");
}
var res = new FinancialStatmentDetailsByContractingPartyViewModel()
{
Id = financialStatement.id,
TotalAmountPayable = financialStatement.FinancialTransactionList.Sum(x => x.Deptor) - financialStatement.FinancialTransactionList.Sum(x => x.Creditor),
TotalCredit = financialStatement.FinancialTransactionList.Sum(x => x.Creditor),
TotalDebt = financialStatement.FinancialTransactionList.Sum(x => x.Deptor),
ContractingPartyName = financialStatement.ContractingPartyName,
List = financialStatement.FinancialTransactionList.Select(t => new FinancialTransactionDetailViewModel()
{
DateTimeGr = t.TdateGr,
DateFa = t.TdateGr.ToFarsi(),
TimeFa = $"{t.TdateGr:HH:mm}",
Description = t.DescriptionOption + " " + t.Description,
Debtor = t.Deptor,
Creditor = t.Creditor,
Balance = t.Balance,
Type = t.TypeOfTransaction == "debt" ? FinancialTransactionType.Debt : FinancialTransactionType.Credit,
TypeStr = t.TypeOfTransaction == "debt" ? "ایجاد درآمد" : "دریافت درآمد"
}).OrderByDescending(t => t.DateTimeGr).ToList(),
};
return res;
}
}

View File

@@ -0,0 +1,122 @@
using _0_Framework.Application;
using CompanyManagment.App.Contracts.FinancialStatment;
using CompanyManagment.App.Contracts.FinancilTransaction;
using Microsoft.AspNetCore.Mvc;
using PersianTools.Core;
using ServiceHost.BaseControllers;
namespace ServiceHost.Areas.Admin.Controllers;
public class FinancialStatementController : AdminBaseController
{
private readonly IFinancialStatmentApplication _financialStatementApplication;
private readonly IFinancialTransactionApplication _financialTransactionApplication;
public FinancialStatementController(IFinancialStatmentApplication financialStatementApplication,
IFinancialTransactionApplication financialTransactionApplication)
{
_financialStatementApplication = financialStatementApplication;
_financialTransactionApplication = financialTransactionApplication;
}
/// <summary>
/// گرفتن جزئیات وضعیت مالی با آیدی طرف حساب
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
[HttpGet("contracting-party/{id}")]
public async Task<ActionResult<FinancialStatmentDetailsByContractingPartyViewModel>>
GetDetailsByContractingParty(long id)
{
var data = await _financialStatementApplication.GetDetailsByContractingParty(id);
return data;
}
/// <summary>
/// گرفتن جزییات ویرایش
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
[HttpGet("edit/{id}")]
public ActionResult<EditFinancialTransaction> GetEditDetails(long id)
{
var res = _financialTransactionApplication.GetDetails(id);
return res;
}
/// <summary>
/// حذف بلاک
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
[HttpPost("removeBlocked/{id}")]
public ActionResult<OperationResult> RemoveBlocked(long id)
{
var res = _financialTransactionApplication.RemoveBlocked(id);
return res;
}
/// <summary>
/// ایجاد
/// </summary>
/// <param name="command"></param>
/// <returns></returns>
[HttpPost]
public ActionResult<OperationResult> Create([FromBody] CreateFinancialStatment command)
{
var res = _financialStatementApplication.Create(command);
return res;
}
/// <summary>
/// ویرایش
/// </summary>
/// <param name="request"></param>
/// <returns></returns>
[HttpPut]
public ActionResult<OperationResult> Edit([FromBody] EditFinancialTransactionRequest request)
{
var command = new EditFinancialTransaction
{
Id = request.Id,
TdateFa = request.TDateFa,
TypeOfTransaction = request.TypeOfTransaction,
DescriptionOption = request.DescriptionOption,
Description = request.Description,
DeptorString = request.DeptorString,
CreditorString = request.CreditorString
};
var result = _financialTransactionApplication.Edit(command);
return result;
}
/// <summary>
/// حذف
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
[HttpDelete("{id}")]
public IActionResult RemoveTransaction(long id)
{
var res = _financialTransactionApplication.RemoveFinancialTransaction(id);
if (res.IsSuccedded)
return new JsonResult(new
{
success = true
});
return new JsonResult(new
{
success = false
});
}
}
public record EditFinancialTransactionRequest(
long Id,
string TDateFa,
string TypeOfTransaction,
string DescriptionOption,
string Description,
string DeptorString,
string CreditorString);

View File

@@ -1,5 +1,6 @@
using _0_Framework.Application;
using AccountManagement.Application.Contracts.Account;
using CompanyManagement.Infrastructure.Excel.InstitutionContract;
using CompanyManagment.App.Contracts.InstitutionContract;
using CompanyManagment.App.Contracts.InstitutionContractContactinfo;
using CompanyManagment.App.Contracts.PersonalContractingParty;
@@ -51,6 +52,7 @@ public class institutionContractController : AdminBaseController
{
return await _institutionContractApplication.GetListStats(searchModel);
}
/// <summary>
/// ایجاد
/// </summary>
@@ -306,4 +308,55 @@ public class institutionContractController : AdminBaseController
});
}
/// <summary>
/// بلاک طرف حساب
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
[HttpPost("block-contracting-party")]
public IActionResult OnPostBlockContractingParty(long id)
{
var result = _contractingPartyApplication.Block(id);
var afterActtion = _contractingPartyApplication.GetDetails(id);
return new JsonResult(new
{
isSuccedded = result.IsSuccedded,
isBlock = afterActtion.IsBlock,
blockTimes = afterActtion.BlockTimes
});
}
/// <summary>
/// آنبلاک طرف حساب
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
[HttpPost("unblock-contracting-party")]
public IActionResult OnPostUnBlockContractingParty(long id)
{
var result = _contractingPartyApplication.DisableBlock(id);
var afterActtion = _contractingPartyApplication.GetDetails(id);
return new JsonResult(new
{
isSuccedded = result.IsSuccedded,
isBlock = afterActtion.IsBlock,
blockTimes = afterActtion.BlockTimes
});
}
/// <summary>
/// دانلود اکسل
/// </summary>
/// <returns></returns>
[HttpGet("excel")]
public IActionResult OnGetDownloadExcel()
{
var institutionContractViewModels =
_institutionContractApplication.NewSearch(new() { IsActiveString = "both", TypeOfContract = "both" });
var bytes = InstitutionContractExcelGenerator.GenerateExcel(institutionContractViewModels);
return File(bytes,
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
$"قرارداد های مالی.xlsx");
}
}