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)); } [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 { //نوع شخص خریدار Tob = result.tob, // صورتحساب نوع * Inty = result.inty ?? 1, //الگوی صورتحساب * Inp = result.inp ?? 1, //موضوع صورتحساب * Ins = result.ins ?? 1, //شماره منحصر به فرد مالیاتی Taxid = _actionTaxPayer.GenerateTaxid(result.inno, result.InvoiceDate.Replace("/", "").Trim()), //سریال صورت حساب Inno = string.IsNullOrEmpty(result.inno) ? null : result.inno, //شماره اقتصادی فروشنده به جاش شناسه ملی داده شد Tins = string.IsNullOrEmpty(result.tins) ? null : result.tins, //مجموع مبلغ قبل از کسر تخفیف Tprdis = result.tprdis ?? 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, //مجموع تخفیفات Tdis = result.tdis ?? null, //شماره منحصر به فرد مالیاتی صورتحساب مرجع Irtaxid = result.invoiceType == InvoiceType.BackFrmSale || result.invoiceType == InvoiceType.Repair ? result.invoice.taxid : null, //شماره اقتصادی خریدار Tinb = string.IsNullOrEmpty(result.tinb) ? null : result.tinb , //زمان صدور Indatim = result.indatim ?? null, //زمان ایجاد Indati2m = result.Indati2m ?? null, //کد شعبه خریدار Bbc = string.IsNullOrEmpty(result.bbc) ? null : result.bbc, Tvop = result.tvop ?? null, Crn = string.IsNullOrEmpty(result.crn) ? null : result.crn , Tax17 = string.IsNullOrEmpty(result.seventeentax) ? null : Convert.ToDecimal(result.seventeentax), Scc = string.IsNullOrEmpty(result.scc) ? null : result.scc , Scln = string.IsNullOrEmpty(result.scln) ? null : result.scln , Bid = string.IsNullOrEmpty(result.bid) ? null : result.bid , }; //if (header.Inty == 1 && header.Inp == 2) // header = new InvoiceHeaderDto // { // //نوع شخص خریدار // Tob = result.tob, // // صورتحساب نوع * // Inty = result.inty ?? 1, // //الگوی صورتحساب * // Inp = result.inp ?? 1, // //موضوع صورتحساب * // Ins = result.ins ?? 1, // //شماره منحصر به فرد مالیاتی // Taxid = _actionTaxPayer.GenerateTaxid(result.inno, result.InvoiceDate.Replace("/", "").Trim()), // //سریال صورت حساب // Inno = result.inno ?? null, // //شماره اقتصادی فروشنده به جاش شناسه ملی داده شد // Tins = result.tins ?? null, // //مجموع مبلغ قبل از کسر تخفیف // Tprdis = result.tprdis ?? null, // // مجموع مبلغ پس از کسر تخفیف // Tadis = result.tadis ?? null, // //مجموع مالیات بر ارزش افزوده // Tvam = result.tvam ?? null, // // مجموع سایر مالیات، عوارض و وجوه قانونی // Todam = result.todam ?? null, // //صورتحساب مجموع // Tbill = result.tbill ?? null, // // تسویه روش // Setm = result.setm ?? null, // //نقدی پرداختی مبلغ // Cap = result.cap ?? null, // //پرداختی نسیه // Insp = result.insp ?? null, // //مجموع تخفیفات // Tdis = result.tdis ?? null, // //شماره منحصر به فرد مالیاتی صورتحساب مرجع // Irtaxid = result.invoiceType == InvoiceType.BackFrmSale || result.invoiceType == InvoiceType.Repair ? result.invoice.taxid : null, // //شماره اقتصادی خریدار // Tinb = result.tinb ?? null, // //زمان صدور // Indatim = result.indatim ?? null, // //زمان ایجاد // Indati2m = result.Indati2m ?? null, // //کد شعبه خریدار // Bbc = result.bbc ?? null, // Tvop = result.tvop ?? null, // Crn = result.crn ?? null, // Tax17 = string.IsNullOrEmpty(result.seventeentax) ? null : Convert.ToDecimal(result.seventeentax), // Scc = result.scc ?? null, // Scln = result.scln ?? null, // Bpn = result.bpn ?? null, // Bid = result.bid ?? null, // }; //if (header.Inty == 1 && header.Inp == 3) // header = new InvoiceHeaderDto // { // //نوع شخص خریدار // Tob = result.tob, // // صورتحساب نوع * // Inty = result.inty ?? 1, // //الگوی صورتحساب * // Inp = result.inp ?? 1, // //موضوع صورتحساب * // Ins = result.ins ?? 1, // //شماره منحصر به فرد مالیاتی // Taxid = _actionTaxPayer.GenerateTaxid(result.inno, result.InvoiceDate.Replace("/", "").Trim()), // //سریال صورت حساب // Inno = result.inno ?? null, // //شماره اقتصادی فروشنده به جاش شناسه ملی داده شد // Tins = result.tins ?? null, // //مجموع مبلغ قبل از کسر تخفیف // Tprdis = result.tprdis ?? null, // // مجموع مبلغ پس از کسر تخفیف // Tadis = result.tadis ?? null, // //مجموع مالیات بر ارزش افزوده // Tvam = result.tvam ?? null, // // مجموع سایر مالیات، عوارض و وجوه قانونی // Todam = result.todam ?? null, // //صورتحساب مجموع // Tbill = result.tbill ?? null, // // تسویه روش // Setm = result.setm ?? null, // //نقدی پرداختی مبلغ // Cap = result.cap ?? null, // //پرداختی نسیه // Insp = result.insp ?? null, // //مجموع تخفیفات // Tdis = result.tdis ?? null, // //شماره منحصر به فرد مالیاتی صورتحساب مرجع // Irtaxid = result.invoiceType == InvoiceType.BackFrmSale || result.invoiceType == InvoiceType.Repair ? result.invoice.taxid : null, // //شماره اقتصادی خریدار // Tinb = result.tinb ?? null, // //زمان صدور // Indatim = result.indatim ?? null, // //زمان ایجاد // Indati2m = result.Indati2m ?? null, // //کد شعبه خریدار // Bbc = result.bbc ?? null, // Tvop = result.tvop ?? null, // Crn = result.crn ?? null, // Tax17 = string.IsNullOrEmpty(result.seventeentax) ? null : Convert.ToDecimal(result.seventeentax), // Bid = result.bid ?? null, // }; 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, //واحد اندازه گیری Mu = string.IsNullOrEmpty(bitem.mu) ? null : bitem.mu, // تعداد Am = bitem.am, // مبلغ واحد Fee = bitem.fee, //مبلغ قبل از تخفیف Prdis = bitem.prdis, //مبلغ تخفیف Dis = bitem.dis, //مبلغ بعد از تخفیف Adis = bitem.adis, //نرخ مالیات بر ارزش افزوده Vra = bitem.vra, //مبلغ مالیات بر ارزش افزوده Vam = bitem.vam, // مبلغ کل کالا / خدمت Tsstam = bitem.tsstam, Cfee = bitem.cfee, Cut = string.IsNullOrEmpty(bitem.cut) ? null : bitem.cut, Exr = bitem.exr, 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, }; //else if (header.Inty == 1 && header.Inp == 2) // item = new InvoiceBodyDto // { // //شناسه کالا / خدمت // Sstid = bitem.sstid, // //شرح کاال/خدمت // Sstt = bitem.sstt, // //واحد اندازه گیری // Mu = bitem.mu, // // تعداد // Am = bitem.am, // // مبلغ واحد // Fee = bitem.fee, // //مبلغ قبل از تخفیف // Prdis = bitem.prdis, // //مبلغ تخفیف // Dis = bitem.dis, // //مبلغ بعد از تخفیف // Adis = bitem.adis, // //نرخ مالیات بر ارزش افزوده // Vra = bitem.vra, // //مبلغ مالیات بر ارزش افزوده // Vam = bitem.vam, // // مبلغ کل کالا / خدمت // Tsstam = bitem.tsstam, // Cfee = bitem.cfee, // Cut = bitem.cut, // Exr = bitem.exr, // Odt = bitem.odt, // Odr = bitem.odr, // Odam = bitem.odam, // Olt = bitem.olt, // Olr = bitem.olr, // Olam = bitem.olam, // Cop = bitem.cop, // Vop = bitem.vop, // Bsrn = bitem.bsrn, // }; //else if (header.Inty == 1 && header.Inp == 3) // item = new InvoiceBodyDto // { // //شناسه کالا / خدمت // Sstid = bitem.sstid, // //شرح کاال/خدمت // Sstt = bitem.sstt, // //واحد اندازه گیری // Mu = bitem.mu, // // تعداد // Am = bitem.am, // // مبلغ واحد // Fee = bitem.fee, // //مبلغ قبل از تخفیف // Prdis = bitem.prdis, // //مبلغ تخفیف // Dis = bitem.dis, // //مبلغ بعد از تخفیف // Adis = bitem.adis, // //نرخ مالیات بر ارزش افزوده // Vra = bitem.vra, // //مبلغ مالیات بر ارزش افزوده // Vam = bitem.vam, // // مبلغ کل کالا / خدمت // Tsstam = bitem.tsstam, // Cfee = bitem.cfee, // Cut = bitem.cut, // Exr = bitem.exr, // Odt = bitem.odt, // Odr = bitem.odr, // Odam = bitem.odam, // Olt = bitem.olt, // Olr = bitem.olr, // Olam = bitem.olam, // Cop = bitem.cop, // Vop = bitem.vop, // Bsrn = bitem.bsrn, // Consfee = bitem.consfee, // Spro = bitem.spro, // Bros = bitem.bros, // Tcpbs = bitem.tcpbs, // }; #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 { "خطای ناشناخته" }); } } } }