Files
moadiran/Back/Services/servInvoice.cs

342 lines
14 KiB
C#
Raw Normal View History

2024-05-13 13:02:09 +03:30
using Back.Data.Contracts;
using Back.Data.Models;
using Shared.DTOs.Serch;
using Shared.DTOs;
using Back.Common;
using Microsoft.EntityFrameworkCore;
2025-01-24 19:18:17 +03:30
using Back.Services.Warehouse;
2024-05-13 13:02:09 +03:30
namespace Back.Services
{
public class servInvoice
{
2025-01-24 19:18:17 +03:30
private readonly RemittanceService _remittanceService;
2024-05-13 13:02:09 +03:30
private readonly IAsyncRepository<Invoice> _invoiceRepo;
2024-09-08 17:23:33 +03:30
private readonly IAsyncRepository<Coding> _CodingRepo;
2024-05-13 16:50:26 +03:30
private readonly IAsyncRepository<InvoiceStatusChang> _invoiceStatusChangPaymentRepo;
2024-05-13 13:02:09 +03:30
private readonly CheckPermission _checkPermission;
2025-01-24 19:18:17 +03:30
public servInvoice(RemittanceService remittanceService, IAsyncRepository<Invoice> invoiceRepo, IAsyncRepository<Coding> codingRepo, IAsyncRepository<InvoiceStatusChang> invoiceStatusChangPaymentRepo, CheckPermission checkPermission)
2024-05-13 13:02:09 +03:30
{
2025-01-24 19:18:17 +03:30
_remittanceService = remittanceService;
2024-05-13 13:02:09 +03:30
_invoiceRepo = invoiceRepo;
2024-09-08 17:23:33 +03:30
_CodingRepo = codingRepo;
2025-01-24 19:18:17 +03:30
_invoiceStatusChangPaymentRepo = invoiceStatusChangPaymentRepo;
_checkPermission = checkPermission;
2024-09-08 17:23:33 +03:30
}
2025-01-24 19:18:17 +03:30
2024-09-08 17:23:33 +03:30
public async Task<List<Coding>> GetCodingPMT()
{
return await _CodingRepo.Get(w => w.FildID == 71).ToListAsync();
2024-05-13 13:02:09 +03:30
}
2024-05-30 15:08:36 +03:30
public async Task<InvoiceDTO?> GetInvoice(int CompanyID, int ID, bool notloaddelete = true)
2024-05-13 13:02:09 +03:30
{
#region AdvancedSearch
var invok = _invoiceRepo
2024-07-20 15:52:29 +03:30
.Get(w => w.CompanyID == CompanyID && w.ID == ID);
2024-05-30 15:08:36 +03:30
if (notloaddelete)
{
2024-07-20 15:52:29 +03:30
invok = invok
.Where(w => !w.IsDeleted);
2024-05-13 13:02:09 +03:30
2024-07-20 15:52:29 +03:30
}
2024-05-13 13:02:09 +03:30
#endregion
//-----------------------
2024-09-08 17:23:33 +03:30
var item = await invok.Include(inc => inc.invoiceDetails) .ThenInclude(inc => inc.cODItem).ThenInclude(inc => inc.CODUnit).Include(inc => inc.Customer)
.Include(inc => inc.sentTax).Include(inc => inc.payments).Include(inc => inc.pattern).ThenInclude(inc => inc.BillType).FirstOrDefaultAsync();
//-------------pmt
List<Coding> codings = new List<Coding>();
if (item != null)
codings =await GetCodingPMT();
//-----------------------
return new InvoiceDTO()
2024-07-20 17:34:28 +03:30
{
IsDeleted = item.IsDeleted,
PatternID = item.PatternID,
2024-07-24 22:56:46 +03:30
PatternTitle = item.pattern?.Title,
2024-07-20 17:34:28 +03:30
CustomerID = item.CustomerID,
CustomerName = item.Customer.FullName,
ID = item.ID,
InvoiceDate = item.InvoiceDate.ShamciToFormatShamci(),
invoiceTypeTitle = item.invoiceType.GetEnumDisplayName(),
invoiceType = item.invoiceType,
Title = item.Title,
InvoicIssueDate = item.InvoicIssueDate.ShamciToFormatShamci(),
BillReference = item.BillReference,
tbill = item.tbill,
Des = item.Des,
PreparedtoSendtoTax = item.PreparedtoSendtoTax,
2025-01-24 19:18:17 +03:30
HasaRemittance= await _remittanceService.HasaRemittance(ID),
2024-07-20 17:34:28 +03:30
tdis = item.tdis,
tvam = item.tvam,
Udate = item.Udate.ShamciToFormatShamci(),
2024-08-06 17:24:25 +03:30
inno = item.inno,
2024-09-08 17:23:33 +03:30
InvoiceSendTaxs = item.sentTax.OrderBy(o => o.ID).Select(s => new SentTaxDto()
{
Date = s.Date.ShamciToFormatShamci(),
Time = s.Time,
ID = s.ID,
InvoiceID = s.InvoiceID,
SentStatus = s.SentStatus,
InvoiceType = s.InvoiceType,
msgInvoiceType = s.InvoiceType.GetEnumDisplayName(),
msgSentStatus = s.SentStatus.GetEnumDisplayName()
}).ToList(),
items = item.invoiceDetails.OrderBy(o => o.ID).Select(x => new InvoiceItemDTO()
{
ID = x.ID,
CODID = x.CODID,
adis = x.adis,
am = x.am.Value,
dis = x.dis,
fee = x.fee.Value,
mu = x.unitTitle,
sstt = x.sstt,
tsstam = x.tsstam,
vam = x.vam,
vra = x.vra,
prdis = x.prdis
}).ToList(),
payments =
2024-08-15 19:15:51 +03:30
item.payments.OrderBy(o => o.ID).Select(x => new InvoicePaymentDTO()
{
ID = x.ID,
acn = x.acn,
iinn = x.acn,
pcn = x.acn,
2024-09-07 16:50:34 +03:30
PaymentDateTime = x.PaymentDateTime.ShamciToFormatShamci(),
2024-08-15 19:15:51 +03:30
pid = x.pid,
pmt = x.pmt,
pv = x.pv,
trmn = x.trmn,
2024-09-08 17:23:33 +03:30
trn = x.acn,
paymentMethod = x.pmt.HasValue ? codings.Where(w=>w.Code== x.pmt.Value.ToString()).Select(s=>s.Title).FirstOrDefault() : null,
2024-08-15 19:15:51 +03:30
}).ToList()
2024-09-08 17:23:33 +03:30
};
2024-07-20 15:52:29 +03:30
2024-05-17 23:05:46 +03:30
}
public async Task<PagingDto<InvoiceGridDTO>?> GetInvoices(int CompanyID, ItemSerchGetInvoices itemSerch)
{
#region AdvancedSearch
var invok = _invoiceRepo
2024-05-30 15:08:36 +03:30
.Get(w => w.CompanyID == CompanyID && !w.IsDeleted/* && !w.BillReference.HasValue*/);
2024-05-17 23:05:46 +03:30
if (itemSerch.InvoiceID != null)
2024-08-06 17:24:25 +03:30
invok = invok.Where(w => w.ID == itemSerch.InvoiceID || w.inno == itemSerch.InvoiceID.ToString());
2024-05-17 23:05:46 +03:30
if (itemSerch.CustomerID != null)
invok = invok.Where(w => w.CustomerID == itemSerch.CustomerID);
if (itemSerch.invoiceType != null)
invok = invok.Where(w => w.invoiceType == itemSerch.invoiceType);
if (itemSerch.Title != null)
invok = invok.Where(w => w.Title.Contains(itemSerch.Title));
2024-05-30 15:08:36 +03:30
if (itemSerch.refInvoiceID != null)
2024-07-20 15:52:29 +03:30
invok = invok.Where(w => w.BillReference == itemSerch.refInvoiceID);
2024-06-27 19:18:50 +03:30
2024-07-20 15:52:29 +03:30
if (itemSerch.CodID != null)
invok = invok.Where(w => w.invoiceDetails.Any(wa => wa.CODID == itemSerch.CodID));
2024-05-17 23:05:46 +03:30
//foreach (InputObj item in inputObjs)
// invok = invok.Where(ExMethod.GetFunc<Customer>(item.Param, item.Value));
#endregion
//-----------------------
return await invok
.Include(inc => inc.invoiceDetails)
2024-05-28 15:03:08 +03:30
.ThenInclude(inc => inc.cODItem)
.ThenInclude(inc => inc.CODUnit)
//.Include(inc => inc.payments)
2024-06-20 18:22:34 +03:30
.Include(inc => inc.pattern)
2024-09-08 17:23:33 +03:30
.OrderByDescending(o => o.ID)
2024-05-17 23:05:46 +03:30
.Select(s => new InvoiceGridDTO()
{
2024-07-20 15:52:29 +03:30
2024-05-17 23:05:46 +03:30
CustomerID = s.CustomerID,
CustomerName = s.Customer.FullName,
ID = s.ID,
invoiceTypeTitle = s.invoiceType.GetEnumDisplayName(),
Title = s.Title,
InvoicIssueDate = s.InvoicIssueDate.ShamciToFormatShamci(),
tbill = s.tbill,
tdis = s.tdis,
tvam = s.tvam,
Udate = s.Udate.ShamciToFormatShamci(),
2024-05-30 15:08:36 +03:30
BillReference = s.BillReference
2024-05-17 23:05:46 +03:30
})
2024-05-13 13:02:09 +03:30
.Paging(itemSerch.PageIndex, itemSerch.PageSize);
}
2024-05-14 14:58:25 +03:30
public async Task<bool> ExistInvoiceByInvoiceID(int CompanyID, int InvoiceID)
2024-05-13 13:02:09 +03:30
{
2024-05-14 14:58:25 +03:30
return await _invoiceRepo.Get(w => w.ID == InvoiceID && w.CompanyID == CompanyID && !w.IsDeleted).AnyAsync();
2024-05-13 13:02:09 +03:30
2024-07-03 16:05:28 +03:30
}
2024-07-20 15:52:29 +03:30
2024-05-30 15:08:36 +03:30
public async Task<bool> checkFatherInvoiceByInvoiceID(int CompanyID, int InvoiceID)
{
return await _invoiceRepo.Get(w => w.BillReference == InvoiceID && w.CompanyID == CompanyID && !w.IsDeleted).AnyAsync();
2024-05-13 13:02:09 +03:30
}
2024-05-26 17:25:34 +03:30
public async Task<int> AddInvoice(Invoice invoice, bool calculate = true)
2024-05-13 13:02:09 +03:30
{
invoice.Cdate = DateTime.Now.ConvertMiladiToShamsi();
invoice.Udate = DateTime.Now.ConvertMiladiToShamsi();
invoice.PreparedtoSendtoTax = false;
2024-05-13 16:50:26 +03:30
if (calculate)
{
2024-05-27 18:57:25 +03:30
if (await _checkPermission.ExtensionofAccess(invoice.CompanyID.Value, 3, "-1"))
{
2024-05-30 15:08:36 +03:30
try
{
var item = await _invoiceRepo.AddAsync(invoice);
return item.ID;
}
2024-07-20 15:52:29 +03:30
catch (Exception ex)
2024-05-30 15:08:36 +03:30
{
return -1;
2024-07-20 15:52:29 +03:30
2024-05-30 15:08:36 +03:30
}
2024-07-20 15:52:29 +03:30
2024-05-27 18:57:25 +03:30
}
2024-05-26 17:25:34 +03:30
return -1;
2024-05-13 16:50:26 +03:30
}
else
{
2024-05-30 15:08:36 +03:30
try
{
var item = await _invoiceRepo.AddAsync(invoice);
return item.ID;
}
catch (Exception ex)
{
return -1;
2024-07-20 15:52:29 +03:30
2024-05-30 15:08:36 +03:30
}
2024-07-20 15:52:29 +03:30
2024-05-13 16:50:26 +03:30
}
2024-05-14 14:58:25 +03:30
2024-05-13 16:50:26 +03:30
}
public async Task<bool> UpdateInvoice(Invoice invoice)
{
invoice.Udate = DateTime.Now.ConvertMiladiToShamsi();
invoice.PreparedtoSendtoTax = false;
2024-05-14 14:58:25 +03:30
return await _invoiceRepo.UpdateAsync(invoice);
2024-05-13 16:50:26 +03:30
}
public async Task<Invoice?> GetInvoiceByInvoiceID(int CompanyID, int InvoiceID)
{
return await _invoiceRepo
.Get(w => w.ID == InvoiceID && w.CompanyID == CompanyID && !w.IsDeleted)
2024-07-22 22:29:28 +03:30
.Include(inc => inc.invoiceDetails)
.ThenInclude(inc => inc.cODItem)
.ThenInclude(inc => inc.CODUnit)
.Include(inc => inc.Customer)
.Include(inc => inc.sentTax)
.Include(inc => inc.pattern)
2024-08-08 00:28:17 +03:30
.Include(inc => inc.invoice)
2024-09-08 17:23:33 +03:30
.Include(inc => inc.payments)
2024-05-13 16:50:26 +03:30
.FirstOrDefaultAsync();
}
public async Task<bool> DeleteInvoice(Invoice item)
{
try
{
item.Udate = DateTime.Now.ConvertMiladiToShamsi();
item.IsDeleted = true;
return await _invoiceRepo.UpdateAsync(item);
//SysLog log = new SysLog()
//{
// TraceIdentifierID = _httpContextAccessor.HttpContext.TraceIdentifier,
// Datetime = DateTime.Now.ConvertMiladiToShamsi(),
// Method = $"{_httpContextAccessor.HttpContext.Request.Method}/{this.GetType().FullName}/DeleteCustomer",
// Value = JsonConvert.SerializeObject(item.ID),
// Route = _httpContextAccessor.HttpContext.Request.Path,
// Type = "User"
//};
//_contextMongodb.InsertItem(log);
}
catch (Exception ex)
{
//SysLog log = new SysLog()
//{
// TraceIdentifierID = _httpContextAccessor.HttpContext.TraceIdentifier,
// Datetime = DateTime.Now.ConvertMiladiToShamsi(),
// Method = $"{_httpContextAccessor.HttpContext.Request.Method}/{this.GetType().FullName}/DeleteCustomer",
// Value = ex.Message,
// Route = _httpContextAccessor.HttpContext.Request.Path,
// Type = "catch"
//};
//_contextMongodb.InsertItem(log);
return false;
}
}
2024-05-29 15:51:06 +03:30
public async Task<InvoiceDTO?> ChangeInvoiceType(Invoice invoiceitem, InvoiceType item, bool action = true)
2024-05-13 16:50:26 +03:30
{
string old = invoiceitem.invoiceType.GetEnumDisplayName();
invoiceitem.invoiceType = item;
invoiceitem.Udate = DateTime.Now.ConvertMiladiToShamsi();
invoiceitem.PreparedtoSendtoTax = false;
try
{
await _invoiceStatusChangPaymentRepo.AddBoolResultAsync(new InvoiceStatusChang()
{
InvoiceID = invoiceitem.ID,
ToStatus = item.GetEnumDisplayName(),
FromStatus = old,
Date = DateTime.Now.ConvertMiladiToShamsi(),
UserID = invoiceitem.LastChangeUserID
});
2024-05-14 14:58:25 +03:30
if (action)
2024-05-29 15:51:06 +03:30
{
var result = await _invoiceRepo.UpdateAsync(invoiceitem);
if (result)
{
return await GetInvoice(invoiceitem.CompanyID.Value, invoiceitem.ID);
}
else
{
return null;
}
}
else return await GetInvoice(invoiceitem.CompanyID.Value, invoiceitem.ID);
2024-05-13 16:50:26 +03:30
//_contextMongodb.InsertItem(new SysLog()
//{
// TraceIdentifierID = _httpContextAccessor.HttpContext.TraceIdentifier,
// Datetime = DateTime.Now.ConvertMiladiToShamsi(),
// Method = $"{_httpContextAccessor.HttpContext.Request.Method}/{this.GetType().FullName}/ChangeInvoiceType",
// Value = $"From {old} to {item.ToString()}",
// Route = _httpContextAccessor.HttpContext.Request.Path,
// Type = "User"
//});
}
catch (Exception ex)
{
//_contextMongodb.InsertItem(new SysLog()
//{
// TraceIdentifierID = _httpContextAccessor.HttpContext.TraceIdentifier,
// Datetime = DateTime.Now.ConvertMiladiToShamsi(),
// Method = $"{_httpContextAccessor.HttpContext.Request.Method}/{this.GetType().FullName}/ChangeInvoiceType",
// Value = $"From {old} to {item.ToString()}" + '\n' + ex.Message,
// Route = _httpContextAccessor.HttpContext.Request.Path,
// Type = "catch"
//});
2024-05-29 15:51:06 +03:30
return null;
2024-05-13 16:50:26 +03:30
}
2024-05-13 13:02:09 +03:30
}
}
}