public async Task>> Handle(SendInvoicesToModianCommand request, CancellationToken cancellationToken) { var TaxFiles = await sender.Send(new GetMoadianFileTextCommand(request.model.StoreId, 1)); if (!TaxFiles.Succeeded || string.IsNullOrEmpty(TaxFiles.Data?.PrivateKey) || string.IsNullOrEmpty(TaxFiles.Data?.SignKey) || string.IsNullOrEmpty(TaxFiles.Data?.PublicKey) || string.IsNullOrEmpty(TaxFiles.Data?.MemoryId)) { return Result>.Fail("کلید های سامانه مودیان را به درستی بارگزاری کنید"); } List resultList = new(); var tFiles = TaxFiles.Data; DateTime otherDate = DateTime.Now; string url = "https://tp.tax.gov.ir/requestsmanager"; TaxService tp = new(tFiles.MemoryId, tFiles.PrivateKey, tFiles.SignKey, url); if (request.model.FactorSendSubject == ConstantMoadianSendType.Estelam || request.model.FactorSendSubject == ConstantMoadianSendType.Status) { List refrenceNumbers = new(); if (!request.model.RefrenceNumber.IsNullOrEmpty()) { refrenceNumbers.Add(request.model.RefrenceNumber); var rrr = await tp.InquiryByReferenceIdAsync(refrenceNumbers); if (request.model.FactorSendSubject == ConstantMoadianSendType.Estelam) { foreach (var item in rrr) { resultList.Add(new() { Title = "نتیجه", Success = item.Status == InvoiceStatus.SUCCESS, Data = item.Data?.MapToModel(), FiscalId = item.FiscalId, PacketType = item.PacketType, ReferenceNumber = item.ReferenceNumber, Sign = item.Sign, Status = item.Status == InvoiceStatus.SUCCESS ? "موفق" : "ناموفق", Uid = item.Uid }); } } else if (request.model.FactorSendSubject == ConstantMoadianSendType.Status) { var rr2 = await tp.InquiryInvoiceStatusAsync(refrenceNumbers); foreach (var item in rr2) { resultList.Add(new() { Title = "نتیجه", Status = GetInvoiceStatus(item.InvoiceStatus), PacketType = GetArticle6Status(item.Article6Status), Sign = item.Error, Success = item.InvoiceStatus == ModianInvoiceStatus.APPROVED, Message = GetInvoiceStatus(item.InvoiceStatus) + "-" + GetArticle6Status(item.Article6Status), }); } } return Result>.Success(resultList); } var _Factors = dbContext.Tbl_Factor .Where(a => request.model.Fids.Contains(a.Id)) .Select(a => new { a.ReferenceNumberMoadian, a.Taxid, a.Title }) .ToList(); if (request.model.FactorSendSubject == ConstantMoadianSendType.Estelam) { refrenceNumbers = _Factors.Select(a => a.ReferenceNumberMoadian).ToList(); var q = dbContext.Tbl_FactorModianTransaction.Where(a => refrenceNumbers.Contains(a.RefrenceNumber)).ToList(); var rrr = await tp.InquiryByReferenceIdAsync(refrenceNumbers); foreach (var item in rrr) { var qf2 = _Factors.FirstOrDefault(a => a.ReferenceNumberMoadian == item.ReferenceNumber); resultList.Add(new() { Title = qf2.Title, Success = item.Status == InvoiceStatus.SUCCESS, Data = item.Data?.MapToModel(), FiscalId = item.FiscalId, PacketType = item.PacketType, ReferenceNumber = item.ReferenceNumber, Sign = item.Sign, Status = item.Status == InvoiceStatus.SUCCESS ? "موفق" : "ناموفق", Uid = item.Uid }); var findR = q.FirstOrDefault(a => a.RefrenceNumber == item.ReferenceNumber); findR.Success = item.Status == InvoiceStatus.SUCCESS; dbContext.Update(findR); } } else if (request.model.FactorSendSubject == ConstantMoadianSendType.Status) { var rrr = await tp.InquiryInvoiceStatusAsync(_Factors.Select(a => a.Taxid).ToList()); foreach (var item in rrr) { var qf2 = _Factors.FirstOrDefault(a => a.Taxid == item.TaxId); resultList.Add(new() { Title = qf2.Title, Status = GetInvoiceStatus(item.InvoiceStatus), PacketType = GetArticle6Status(item.Article6Status), Sign = item.Error, Success = item.InvoiceStatus == ModianInvoiceStatus.APPROVED, Message = GetInvoiceStatus(item.InvoiceStatus) + "-" + GetArticle6Status(item.Article6Status), }); } } await dbContext.SaveChangesAsync(cancellationToken); return Result>.Success(resultList); } //var rchek = await tp.GetTaxpayerAsync("62216927393"); var qFactors = dbContext.Tbl_Factor .Where(a => request.model.Fids.Contains(a.Id)) .Select(qFactor => new InvoiceModel.Header() { Indatim = request.model.FactorSendSubject == ConstantMoadianSendType.Ersal ? TaxService.ConvertDateToLong(qFactor.Date) : TaxService.ConvertDateToLong(otherDate), Indati2m = request.model.FactorSendSubject == ConstantMoadianSendType.Ersal ? TaxService.ConvertDateToLong(qFactor.Date) : TaxService.ConvertDateToLong(otherDate), Tob = qFactor.Tbl_User.Tob, Bbc = qFactor.Tbl_User.Bbc ?? null, Bid = qFactor.Tbl_User.Bid ?? null, Bpc = qFactor.Tbl_UserAddress.PostalCode ?? null, Bpn = qFactor.Tbl_User.Bpn ?? null, Tins = qFactor.Tbl_Store.Tins ?? null, Tinb = qFactor.Tbl_User.Tinb ?? null, Inno = qFactor.Inno, Sbc = qFactor.Sbc ?? qFactor.Tbl_Store.Sbc ?? null, Scln = qFactor.Scln, Scc = qFactor.Scc ?? null, Crn = qFactor.Crn ?? null, Inp = (int?)request.model.Olgo, Ins = (int)request.model.FactorSendSubject, Cap = Math.Round(qFactor.FinalAmount, 0).RemoveExtraZero(), Setm = 1, Inty = request.model.FactorSendNoe, Insp = 0, Taxid = request.model.FactorSendSubject == ConstantMoadianSendType.Ersal ? tp.RequestTaxId(qFactor.Shomareh.ToString(), qFactor.Date) : tp.RequestTaxId(qFactor.Shomareh.ToString(), otherDate), Irtaxid = request.model.FactorSendSubject == ConstantMoadianSendType.Ersal ? null : qFactor.Taxid, Date = qFactor.Date, Shomareh = qFactor.Shomareh, ListProducts = qFactor.Tbl_FactorItems.Select(item => new InvoiceModel.Body() { Sstid = item.Tbl_Product.MoadianProductId, Sstt = item.Tbl_Product.Title, Mu = item.Tbl_Vahed.Code.ToString(), Am = item.Count.RemoveExtraZero(), Fee = Math.Round(item.VahedAmount, 0).RemoveExtraZero(), Vra = item.Tax.RemoveExtraZero(), Vam = item.TaxAmount.RemoveExtraZero(), Dis = item.OffAmount.RemoveExtraZero(), Odt = item.Tbl_Product.Tbl_Avarez != null ? item.Tbl_Product.Tbl_Avarez.Title : "", Cfee = item.VahedAmount, Cut = "IRR", Sscv = item.FinalAmount, Ssrv = item.FinalAmount, Exr = 1, Nw = 1, Odr = item.Odr.RemoveExtraZero(), Odam = item.Odam.RemoveExtraZero(), Tsstam = item.FinalAmount.RemoveExtraZero(), }).ToList(), }) .ToList(); var TaxMapper = qFactors.MapToMoadianModel(); if (request.model.FactorSendSubject == ConstantMoadianSendType.Ebtal) { List invoices = new(); foreach (var item in TaxMapper) { InvoiceDto invoice = new() { Header = new() }; invoice.Header.indatim = TaxService.ConvertDateToLong(DateTime.Now); invoice.Header.indati2m = item.Header.indatim; invoice.Header.ins = (int)ConstantMoadianSendType.Ebtal; invoice.Header.taxid = item.Header.taxid; invoice.Header.tins = item.Header.tins; invoice.Header.inno = item.Header.inno; invoices.Add(invoice); // var qfFind = qFactors.FirstOrDefault(a => a.Inno == item.Header.inno); // item.Header.taxid = tp.RequestTaxId(qfFind.Shomareh, DateTime.Now); //item.Body = []; // item.Header.inp = null; // item.Body = []; // item.Payments = []; } TaxMapper = invoices; } if (request.model.FactorSendSubject == ConstantMoadianSendType.Ersal) { foreach (var item in TaxMapper) { var qfFind = qFactors.FirstOrDefault(a => a.Inno == item.Header.inno); item.Header.taxid = tp.RequestTaxId(qfFind.Shomareh.ToString(), qfFind.Date); item.Header.irtaxid = null; } } else if (request.model.FactorSendSubject != ConstantMoadianSendType.Ersal) { foreach (var item in TaxMapper) { var qfFind = qFactors.FirstOrDefault(a => a.Inno == item.Header.inno); var sodorDate = DateTime.Now; //item.Header.taxid = qfFind.Taxid; //item.Header.irtaxid = item.Header.taxid; //item.Header.taxid = tp.RequestTaxId(qfFind.Shomareh.ToString(), sodorDate); item.Header.indatim = TaxService.ConvertDateToLong(sodorDate); item.Header.indati2m = TaxService.ConvertDateToLong(sodorDate); item.Header.bid = null; item.Header.inty = null; item.Header.inp = null; item.Header.tinb = null; } } List r = new(); try { r = await tp.SendInvoicesAsync(TaxMapper); } catch (Exception e) { return Result>.Fail(e.Message); } var qfs = dbContext.Tbl_Factor .Include(a => a.Tbl_FactorItems).ThenInclude(a => a.Tbl_Product) .Where(a => request.model.Fids.Contains(a.Id)) .ToList(); foreach (var item in r) { var qfSend = qFactors.FirstOrDefault(a => a.Taxid == item.TaxId); var qf = qfs.FirstOrDefault(a => a.Inno == qfSend.Inno); qf.ReferenceNumberMoadian = item.ReferenceNumber; qf.Uid = item.Uid; qf.Ins = request.model.FactorSendSubject; qf.Inp = request.model.Olgo; qf.Inty = qfSend.Inty; qf.Taxid = item.TaxId; dbContext.Update(qf); Tbl_FactorModianTransaction tbl_FactorModianTransaction = new() { FactorId = qf.Id, RefrenceNumber = item.ReferenceNumber, Uid = r.FirstOrDefault(a => a.ReferenceNumber == item.ReferenceNumber)?.Uid, Date = qf.Date, TaxId = item.TaxId, }; dbContext.Add(tbl_FactorModianTransaction); } await Task.Delay(1000); var result = await tp.InquiryByReferenceIdAsync(r.Select(a => a.ReferenceNumber).ToList()); foreach (var item in result) { var rr = r.FirstOrDefault(a => a.ReferenceNumber == item.ReferenceNumber); var qsendFactor = qFactors.FirstOrDefault(a => a.Taxid == rr.TaxId); if (qsendFactor == null) { resultList.Add(new() { Title = "نامشخص", Success = item.Status == InvoiceStatus.SUCCESS, Data = item.Data?.MapToModel(), Message = "پاسخ نامشخص", }); continue; } var inno = qsendFactor.Inno; var qf = qfs.FirstOrDefault(a => a.Inno == inno); if (item.Status == InvoiceStatus.IN_PROGRESS) { resultList.Add(new() { Title = qf.Title, Success = item.Status == InvoiceStatus.SUCCESS, Data = item.Data?.MapToModel(), Message = "در حال انجام عملیات", }); continue; } if (item.Status == InvoiceStatus.NOT_FOUND) { resultList.Add(new() { Title = qf.Title, Success = item.Status == InvoiceStatus.SUCCESS, Data = item.Data?.MapToModel(), Message = "درخواست پیدا نشد", }); continue; } //qf.Taxid = rr.TaxId; //qf.Uid = rr.Uid; //qf.ReferenceNumberMoadian = r.FirstOrDefault(a => a.TaxId == rr.TaxId)?.ReferenceNumber; if (item.Status == InvoiceStatus.SUCCESS) { AfterSuccess(request, qf, rr, rr.TaxId, item); } qf.Ins = request.model.FactorSendSubject; qf.Inp = request.model.Olgo; //qf.Inno = qsendFactor.Inno; dbContext.Update(qf); resultList.Add(new() { Title = qf.Title, Success = item.Status == InvoiceStatus.SUCCESS, Data = item.Data?.MapToModel(), FiscalId = item.FiscalId, PacketType = item.PacketType, ReferenceNumber = item.ReferenceNumber, Sign = item.Sign, Status = item.Status, Uid = item.Uid, Message = item.Data == null ? ("نامشخص") : (item.Data.Success ? "موفق" : "ناموفق") }); } //resultList = result.Select(a=> new InquiryResultModel2() { }) await dbContext.SaveChangesAsync(cancellationToken); return Result>.Success(resultList); } private string GetInvoiceStatus(string invoiceStatus) { return invoiceStatus switch { nameof(ModianInvoiceStatus.APPROVED) => "تایید شده", nameof(ModianInvoiceStatus.CANCELED) => "باطل شده", nameof(ModianInvoiceStatus.IMPOSSIBLE_REACTION) => "عدم امکان واکنش", nameof(ModianInvoiceStatus.AWAITING_REACTION) => "در انتظار واکنش", nameof(ModianInvoiceStatus.NO_NEED_REACTION) => "عدم نیاز واکنش", nameof(ModianInvoiceStatus.SYSTEMIC_APPROVED) => "تایید سیستمی", nameof(ModianInvoiceStatus.REJECTED) => "رد شده", nameof(ModianInvoiceStatus.NOT_FOUND) => "وجود ندارد", _ => "نامشخص" }; } private string GetArticle6Status(string article6Status) { return article6Status switch { nameof(ModianStatus6Article.EXCEEDED) => "عدول", nameof(ModianStatus6Article.NOT_EXCEEDED) => "عدم عدول", _ => "نا مشخص", }; } public class ModianInvoiceStatus { public const string REJECTED = nameof(REJECTED); //رد شده public const string APPROVED = nameof(APPROVED);// تایید شده public const string SYSTEMIC_APPROVED = nameof(SYSTEMIC_APPROVED); //تایید سیستمی public const string IMPOSSIBLE_REACTION = nameof(IMPOSSIBLE_REACTION);//عدم امکان واکنش public const string AWAITING_REACTION = nameof(AWAITING_REACTION);//در انتظار واکنش public const string NO_NEED_REACTION = nameof(NO_NEED_REACTION);// عدم نیاز واکنش public const string CANCELED = nameof(CANCELED); // رد شده public const string NOT_FOUND = nameof(NOT_FOUND); // پیدا نشد } public enum ModianStatus6Article { EXCEEDED, // عدول NOT_EXCEEDED, // عدم عدول } public class InvoiceStatus { public const string SUCCESS = nameof(SUCCESS); public const string FAILED = nameof(FAILED); public const string IN_PROGRESS = nameof(IN_PROGRESS); public const string NOT_FOUND = nameof(NOT_FOUND); } private void AfterSuccess(SendInvoicesToModianCommand request, Tbl_Factor qFactor, InvoiceResponseModel sendInvoicesModel, string result, InquiryResultModel root) { qFactor.PayStatus = request.model.FactorSendSubject; qFactor.Taxid = result; qFactor.ReferenceNumberMoadian = sendInvoicesModel.ReferenceNumber; if (qFactor.Status == (int)ConstantMoadianSendType.Ersal) { qFactor.SavedInMoadianSuccessful = true; if (root.Status == InvoiceStatus.SUCCESS && qFactor.SavedInMoadianSuccessful == false) { foreach (var fitem in qFactor.Tbl_FactorItems) { fitem.Tbl_Product.CountSent += Math.Abs(fitem.Count); dbContext.Update(fitem); } } } else if (qFactor.Status == (int)ConstantMoadianSendType.Eslah) { } else if (qFactor.Status == (int)ConstantMoadianSendType.Ebtal) { if (root.Status == InvoiceStatus.SUCCESS && qFactor.SavedInMoadianSuccessful == true) { foreach (var fitem in qFactor.Tbl_FactorItems) { fitem.Tbl_Product.CountSent -= Math.Abs(fitem.Count); dbContext.Update(fitem); } } } } private InvoiceDto GetMoadianInvoice(Guid id) { var q = dbContext.Tbl_Factor.AsNoTracking() .Where(a => a.Id == id) .Select(qFactor => new InvoiceDto() { Header = new() { indatim = TaxService.ConvertDateToLong(qFactor.Date), indati2m = TaxService.ConvertDateToLong(qFactor.Date), tob = (int?)qFactor.Tbl_User.Tob, bbc = qFactor.Tbl_User.Bbc ?? "", bid = qFactor.Tbl_User.Bid ?? "", bpc = qFactor.Tbl_UserAddress.PostalCode ?? "", bpn = qFactor.Tbl_User.Bpn ?? "", tins = qFactor.Tbl_Store.Tins ?? "", tinb = qFactor.Tbl_User.Tinb ?? "", inno = qFactor.Shomareh.ToString(), sbc = qFactor.Sbc ?? qFactor.Tbl_Store.Sbc ?? "", scln = qFactor.Scln /*?? q.Tbl_Store.Scln*/, scc = qFactor.Scc ?? "", crn = qFactor.Crn ?? "", inp = 1, ins = 1, ft = 0, billid = "0", cap = (long?)Math.Round(qFactor.FinalAmount, 0).RemoveExtraZero(), setm = 1, insp = 0, tvop = 0, tax17 = 0, cdcd = 0, taxid = qFactor.Taxid, //Date = qFactor.Date, }, Body = qFactor.Tbl_FactorItems.Select(item => new BodyItemDto() { sstid = item.Tbl_Product.MoadianProductId, sstt = item.Tbl_Product.Title, mu = item.Tbl_Vahed.Code.ToString(), am = item.Count.RemoveExtraZero(), fee = Math.Round(item.VahedAmount, 0).RemoveExtraZero(), cut = "0", ssrv = (long?)Math.Round(item.TotalAmount, 0).RemoveExtraZero(), vra = item.Tax.RemoveExtraZero(), vam = (long?)item.TaxAmount.RemoveExtraZero(), dis = (long?)item.OffAmount.RemoveExtraZero(), odt = item.Tbl_Product.Tbl_Avarez != null ? item.Tbl_Product.Tbl_Avarez.Title : "", //Cfee = item.VahedAmount, odr = item.Odr.RemoveExtraZero(), odam = (long?)item.Odam.RemoveExtraZero(), tsstam = (long?)item.FinalAmount.RemoveExtraZero(), }).ToList(), }).FirstOrDefault(); return q; }