using Back.Common; using Back.Data.Models; using Back.Services; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Http.HttpResults; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; using Newtonsoft.Json; using Org.BouncyCastle.Asn1.Cmp; using Org.BouncyCastle.Ocsp; using Shared.DTOs; using Shared.DTOs.Serch; using System; using System.Security.Cryptography; using TaxCollectData.Library.Dto.Content; using TaxCollectData.Library.Dto.Transfer; using static Shared.DTOs._TaxPayer; using static System.Collections.Specialized.BitVector32; namespace Back.Controllers { [Route("api/[controller]")] [Authorize] [ApiController] public class TaxPayerController : ControllerBase { private readonly servTaxPayer _servTaxPayer; private readonly servUser _servUser; private readonly ActionTaxPayer _actionTaxPayer; public TaxPayerController(servTaxPayer servTaxPayer, servUser servUser, ActionTaxPayer actionTaxPayer) { _servTaxPayer = servTaxPayer; _servUser = servUser; _actionTaxPayer = actionTaxPayer; } [HttpGet("GetInvoice/{ID}")] public async Task> Get(int ID) { var claim = HttpContext.User.Claims.First(c => c.Type == "UserID"); var UserID = claim.Value; var user = await _servUser.GetUserByUserID(Convert.ToInt32(UserID)); var result = await _servTaxPayer.GetInvoice(user.RolUsers.First().CompanyID, ID); if (result == null) return BadRequest(new List { "صورتحساب یافت نشد" }); else { if (!result.PatternID.HasValue || result.PatternID == 0) return BadRequest(new List { "ابتدا برای این صورتحساب الگو در نظر بگیرید" }); //if (result.invoiceType == InvoiceType.Bidding) // return BadRequest(new List { "صورتحساب در وضعیت پیش نویس نمیتواند ارسال شود" }); //if (await _servTaxPayer.ExistSuccessfulorSendorpendingInvoice(result)) // return BadRequest(new List { "این صورتحساب قبلا به سازمان ارسال شده" }); //if ((result.invoiceType == InvoiceType.BackFrmSale || result.invoiceType == InvoiceType.Repair) // && !result.BillReference.HasValue) // return BadRequest(new List { "در وضعیت برگشت از فروش و اصلاحی باید صورتحساب مرجع وجود داشته باشد" }); //if ((result.invoiceType == InvoiceType.BackFrmSale || result.invoiceType == InvoiceType.Repair) // && !await _servTaxPayer.ExistSuccessfulorSendorpendingInvoice(result.invoice)) // return BadRequest(new List { "در وضعیت برگشت از فروش و اصلاحی باید صورتحساب مرجع به سامانه مودیان ارسال شده باشد" }); return Ok(await _servTaxPayer.GetFildInvoiceForPreparation(result)); } } [HttpPost("PreparationInvoiceBeforeSending")] public async Task> PreparationInvoiceBeforeSending([FromBody] Atemplatefield item) { var claim = HttpContext.User.Claims.First(c => c.Type == "UserID"); var UserID = claim.Value; var user = await _servUser.GetUserByUserID(Convert.ToInt32(UserID)); var result = await _servTaxPayer.GetInvoice(user.RolUsers.First().CompanyID, item.header.ID); if (result == null) return BadRequest(new List { "صورتحساب یافت نشد" }); else { if (result.invoiceType == InvoiceType.Bidding) return BadRequest(new List { "صورتحساب در وضعیت پیش نویس نمیتواند آماده ارسال شود" }); if (await _servTaxPayer.ExistSuccessfulorSendorpendingInvoice(result)) return BadRequest(new List { "این صورتحساب قبلا به سازمان ارسال شده" }); if ((result.invoiceType == InvoiceType.BackFrmSale || result.invoiceType == InvoiceType.Repair) && !result.BillReference.HasValue) return BadRequest(new List { "در وضعیت برگشت از فروش و اصلاحی باید صورتحساب مرجع وجود داشته باشد" }); if ((result.invoiceType == InvoiceType.BackFrmSale || result.invoiceType == InvoiceType.Repair) && !await _servTaxPayer.ExistSuccessfulorSendorpendingInvoice(result.invoice)) return BadRequest(new List { "در وضعیت برگشت از فروش و اصلاحی باید صورتحساب مرجع به سامانه مودیان ارسال شده باشد" }); } return Ok(await _servTaxPayer.PreparationInvoiceBeforeSending(item, result)); } [HttpPost("UpdateInvoice")] public async Task> UpdateInvoice([FromBody] Atemplatefield item) { var claim = HttpContext.User.Claims.First(c => c.Type == "UserID"); var UserID = claim.Value; var user = await _servUser.GetUserByUserID(Convert.ToInt32(UserID)); var result = await _servTaxPayer.GetInvoice(user.RolUsers.First().CompanyID, item.header.ID); if (result == null) return BadRequest(new List { "صورتحساب یافت نشد" }); //else //{ // if (result.invoiceType == InvoiceType.Bidding) // return BadRequest(new List { "صورتحساب در وضعیت پیش نویس نمیتواند آماده ارسال شود" }); if (await _servTaxPayer.ExistSuccessfulorSendorpendingInvoice(result)) return BadRequest(new List { "این صورتحساب به سازمان ارسال شده"+'\n'+ "برای تغییر ،صورتحساب را ابطال/اصلاح یا برگشت بزنید" }); // if ((result.invoiceType == InvoiceType.BackFrmSale || result.invoiceType == InvoiceType.Repair) // && !result.BillReference.HasValue) // return BadRequest(new List { "در وضعیت برگشت از فروش و اصلاحی باید صورتحساب مرجع وجود داشته باشد" }); // if ((result.invoiceType == InvoiceType.BackFrmSale || result.invoiceType == InvoiceType.Repair) // && !await _servTaxPayer.ExistSuccessfulorSendorpendingInvoice(result.invoice)) // return BadRequest(new List { "در وضعیت برگشت از فروش و اصلاحی باید صورتحساب مرجع به سامانه مودیان ارسال شده باشد" }); //} return Ok(await _servTaxPayer.PreparationInvoiceBeforeSending(item, result)); } [HttpGet("CheckAuth")] public async Task> CheckAuth() { var claim = HttpContext.User.Claims.First(c => c.Type == "UserID"); var UserID = claim.Value; var user = await _servUser.GetUserByUserID(Convert.ToInt32(UserID)); return Ok(await _actionTaxPayer.login(user.RolUsers.First().CompanyID)); // return Ok(true); return BadRequest(); } [HttpGet("SendInvoice/{InvoiceID}")] public async Task> SendInvoice(int InvoiceID) { var claim = HttpContext.User.Claims.First(c => c.Type == "UserID"); var UserID = claim.Value; var user = await _servUser.GetUserByUserID(Convert.ToInt32(UserID)); if (!await _actionTaxPayer.login(user.RolUsers.First().CompanyID)) return BadRequest(new List { "خطا در احراز هویت سازمان مالیاتی" }); var result = await _servTaxPayer.GetInvoice(user.RolUsers.First().CompanyID, InvoiceID); if (result == null) return BadRequest(new List { "صورتحساب یافت نشد" }); else { if (!result.PatternID.HasValue) return BadRequest(new List { "ابتدا برای این صورتحساب الگو در نظر بگیرید" }); if (result.invoiceType == InvoiceType.Bidding) return BadRequest(new List { "صورتحساب در وضعیت پیش نویس نمیتواند ارسال شود" }); if (await _servTaxPayer.ExistSuccessfulorSendorpendingInvoice(result)) return BadRequest(new List { "این صورتحساب قبلا به سازمان ارسال شده" }); if ((result.invoiceType == InvoiceType.BackFrmSale || result.invoiceType == InvoiceType.Repair) && !result.BillReference.HasValue) return BadRequest(new List { "در وضعیت برگشت از فروش و اصلاحی باید صورتحساب مرجع وجود داشته باشد" }); if ((result.invoiceType == InvoiceType.BackFrmSale || result.invoiceType == InvoiceType.Repair) && !await _servTaxPayer.ExistSuccessfulorSendorpendingInvoice(result.invoice)) return BadRequest(new List { "در وضعیت برگشت از فروش و اصلاحی باید صورتحساب مرجع به سامانه مودیان ارسال شده باشد" }); #region Inital Send InvoiceHeaderDto header = new InvoiceHeaderDto(); #region header if (result.inty == 1 && result.inp == 1) header = new InvoiceHeaderDto { //شماره منحصر به فرد مالیاتی Taxid = _actionTaxPayer.GenerateTaxid(result.inno, result.InvoiceDate.Replace("/", "").Trim()), //زمان صدور Indatim = result.indatim ?? null, //زمان ایجاد Indati2m = result.Indati2m ?? null, // صورتحساب نوع * Inty = result.inty ?? 1, //سریال صورت حساب Inno = string.IsNullOrEmpty(result.inno) ? null : result.inno, //شماره منحصر به فرد مالیاتی صورتحساب مرجع Irtaxid = result.invoiceType == InvoiceType.BackFrmSale || result.invoiceType == InvoiceType.Repair ? result.invoice.taxid : result.invoiceType == InvoiceType.Cancellation ? result.taxid : null, //الگوی صورتحساب * Inp = result.inp ?? 1, //موضوع صورتحساب * Ins = result.ins ?? 1, //شماره اقتصادی فروشنده به جاش شناسه ملی داده شد Tins = string.IsNullOrEmpty(result.tins) ? null : result.tins, //نوع شخص خریدار Tob = result.tob, //شماره/شناسه ملی/شناسه مشارکت مدنی / کد فراگیر Bid = string.IsNullOrEmpty(result.bid) ? null : result.bid, //شماره اقتصادی خریدار Tinb = string.IsNullOrEmpty(result.tinb) ? null : result.tinb, //کد شعبه فروشنده Sbc = string.IsNullOrEmpty(result.sbc) ? null : result.sbc, //کد پستی خریدار Bpc = string.IsNullOrEmpty(result.bpc) ? null : result.bpc, //کد شعبه خریدار Bbc = string.IsNullOrEmpty(result.bbc) ? null : result.bbc, //شماره پروانه گمرکی Scln = string.IsNullOrEmpty(result.scln) ? null : result.scln, //کد گمرک محل اظهار فروشنده Scc = string.IsNullOrEmpty(result.scc) ? null : result.scc, //شناسه یکتای ثبت قزارداد فروشنده Crn = string.IsNullOrEmpty(result.crn) ? null : result.crn, //مجموع مبلغ قبل از کسر تخفیف Tprdis = result.tprdis ?? null, //مجموع تخفیفات Tdis = result.tdis ?? null, // مجموع مبلغ پس از کسر تخفیف Tadis = result.tadis ?? null, //مجموع مالیات بر ارزش افزوده Tvam = result.tvam ?? null, // مجموع سایر مالیات، عوارض و وجوه قانونی Todam = result.todam ?? null, //صورتحساب مجموع Tbill = result.tbill ?? null, // تسویه روش Setm = result.setm == 0 ? null : result.setm ?? null, //نقدی پرداختی مبلغ Cap = result.cap ?? null, //پرداختی نسیه Insp = result.insp ?? null, //مجموع سهم مالیات بر ارزش افزوده از پرداخت Tvop = result.tvop ?? null, //مالیات موضوع 17 Tax17 = string.IsNullOrEmpty(result.seventeentax) ? null : Convert.ToDecimal(result.seventeentax), }; else return BadRequest(new List { "این الگو فعلا در دسترس نمی باشد" }); #endregion header List InvoiceBody = new List(); foreach (var bitem in result.invoiceDetails) { InvoiceBodyDto item = new InvoiceBodyDto(); #region body if (header.Inty == 1 && header.Inp == 1) item = new InvoiceBodyDto { //شناسه کالا / خدمت Sstid = bitem.sstid, //شرح کاال/خدمت Sstt = bitem.sstt, // تعداد Am = bitem.am, //واحد اندازه گیری Mu = string.IsNullOrEmpty(bitem.mu) ? null : bitem.mu, // مبلغ واحد Fee = bitem.fee, //میزان ارز Cfee = bitem.cfee, //نوع ارز Cut = string.IsNullOrEmpty(bitem.cut) ? null : bitem.cut, //نرخ برابری ارز با ریال Exr = bitem.exr, //مبلغ قبل از تخفیف Prdis = bitem.prdis, //مبلغ تخفیف Dis = bitem.dis, //مبلغ بعد از تخفیف Adis = bitem.adis, //نرخ مالیات بر ارزش افزوده Vra = bitem.vra, //مبلغ مالیات بر ارزش افزوده Vam = bitem.vam, //موضوع سایر مالیات و عوارض Odt = string.IsNullOrEmpty(bitem.odt) ? null : bitem.odt, //نرخ سایر مالیات و عوارض Odr = bitem.odr, //مبلغ سایر مالیات و عوارض Odam = bitem.odam, //موضوع سایر وجوه قانونی Olt = string.IsNullOrEmpty(bitem.olt) ? null : bitem.olt, //نرخ سایر وجوه قانونی Olr = bitem.olr, //مبلغ سایر وجوه قانونی Olam = bitem.olam, //سهم نقدی از پرداخت Cop = bitem.cop, //سهم مالیات بر لرزش افزوده از پرداخت Vop = bitem.vop, //شناسه یکتای ثبت قرارداد حق العمل کاری Bsrn = string.IsNullOrEmpty(bitem.bsrn) ? null : bitem.bsrn, // مبلغ کل کالا / خدمت Tsstam = bitem.tsstam, }; #endregion InvoiceBody.Add(item); } var responseModel = await _actionTaxPayer.SendInvoice(user.RolUsers.First().CompanyID, header, InvoiceBody, new PaymentDto { }); if (responseModel == null) { return BadRequest(new List { "خطا در ورود به سامانه مودیان" }); } else if (responseModel.Status == 200 && (responseModel.Body.Errors == null || responseModel.Body.Errors.Count == 0)) { foreach (var item in responseModel.Body.Result) { var ressenttax = new SentTax { InvoiceID = result.ID, Date = DateTime.Now.ConvertMiladiToShamsi(), Time = $"{DateTime.Now.Hour}:{DateTime.Now.Minute}:{DateTime.Now.Second}", InvoiceType = result.invoiceType, ReferenceNumber = item.ReferenceNumber, uId = item.Uid, SentStatus = SentStatus.Send, InvoiceModel = JsonConvert.SerializeObject(result, Formatting.Indented, new JsonSerializerSettings { PreserveReferencesHandling = PreserveReferencesHandling.Objects }), ResponseModel = JsonConvert.SerializeObject(responseModel) }; await _servTaxPayer.AddSentTax(ressenttax); } result.taxid = header.Taxid; result.irtaxid = header.Irtaxid; return Ok(await _servTaxPayer.UpdateInvoice(result)); } else { string errors = ""; foreach (var item in responseModel.Body.Errors) errors += '\n' + $"{item.ErrorCode}:{item.Detail}"; return BadRequest(new List { errors }); } #endregion } } [HttpPost("GetAllSentTax")] public async Task>> GetSentTax([FromBody] ItemSerchGetSentTax item) { var claim = HttpContext.User.Claims.First(c => c.Type == "UserID"); var UserID = claim.Value; var user = await _servUser.GetUserByUserID(Convert.ToInt32(UserID)); return Ok(await _servTaxPayer.GetSentTax(user.RolUsers.First().CompanyID, item)); } [HttpGet("GetResult/{ID}")] public async Task> GetResultByUid(int ID) { try { var claim = HttpContext.User.Claims.First(c => c.Type == "UserID"); var UserID = claim.Value; var user = await _servUser.GetUserByUserID(Convert.ToInt32(UserID)); var item = await _servTaxPayer.GetSentTax(user.RolUsers.First().CompanyID, ID); if (item == null) return BadRequest(new List { "یافت نشد" }); if (string.IsNullOrEmpty(item.uId)) return BadRequest(new List { "کد پیگیری یافت نشد" }); if (!await _actionTaxPayer.login(user.RolUsers.First().CompanyID)) return BadRequest(new List { "خطا در احراز هویت سازمان مالیاتی" }); DataInSendTaxDto desData = new DataInSendTaxDto(); if (item.SentStatus == SentStatus.Unsuccessful && !string.IsNullOrEmpty(item.ErrorsModel)) { List inquiryerrorResult = JsonConvert.DeserializeObject>(item.ErrorsModel); InquiryResultModel inquiryResult = JsonConvert.DeserializeObject(item.InquiryResultModel); if (inquiryResult.Data != null) { desData = new DataInSendTaxDto(); desData.SentStatus = SentStatus.Unsuccessful; desData.error = inquiryerrorResult; } return Ok(desData); } else if (item.SentStatus == SentStatus.Send || item.SentStatus == SentStatus.pending || item.SentStatus == SentStatus.IN_PROGRESS || item.SentStatus == SentStatus.Unsuccessful) { //ta imja var result = await _actionTaxPayer.GetResultByUid(user.RolUsers.First().CompanyID, item.uId); if (result == null) return BadRequest(new List { "پاسخی از سازمان دریافت نشد" }); else { item.InquiryResultModel = JsonConvert.SerializeObject(result); if (result.Data != null) { desData = JsonConvert.DeserializeObject(result.Data.ToString()); if (desData == null) { desData = new DataInSendTaxDto(); desData.error = JsonConvert.DeserializeObject>(result.Data.ToString()); } } desData.SentStatus = item.SentStatus = result.Status == "FAILED" ? SentStatus.Unsuccessful : result.Status == "PENDING" ? SentStatus.pending : result.Status == "SUCCESS" ? SentStatus.Successful : result.Status == "NOT_FOUND" ? SentStatus.NOT_FOUND : result.Status == "IN_PROGRESS" ? SentStatus.IN_PROGRESS : SentStatus.Unknown; if (item.SentStatus == SentStatus.Unsuccessful) item.ErrorsModel = JsonConvert.SerializeObject(desData.error); } if (await _servTaxPayer.UpdateSentTax(item)) return Ok(desData); else return BadRequest(new List { "خطای در ذخیره سازی" }); } return BadRequest(new List { "در این وضعیت امکان پذیر نمی باشد" }); } catch (Exception ex) { return BadRequest(new List { "خطای ناشناخته" }); } } [HttpGet("GetBillTypes")] public async Task>>> GetBillTypes() { return Ok(await _servTaxPayer.GetBillTypes()); } [HttpGet("GetPatterns")] public async Task>>> GetPatterns() { return Ok(await _servTaxPayer.GetPatterns(true)); } } }