Mango.Nop.Plugins/Nop.Plugin.Misc.AIPlugin/Areas/Admin/Controllers/InvoiceController.cs

219 lines
8.6 KiB
C#

using Microsoft.AspNetCore.Mvc;
using Nop.Core;
using Nop.Core.Domain.Orders;
using Nop.Plugin.Misc.FruitBankPlugin.Services;
using Nop.Services.Catalog;
using Nop.Services.Common;
using Nop.Services.Customers;
using Nop.Services.Directory;
using Nop.Services.Orders;
using Nop.Web.Framework;
using Nop.Web.Framework.Controllers;
using Nop.Web.Framework.Mvc.Filters;
namespace Nop.Plugin.Misc.FruitBankPlugin.Areas.Admin.Controllers
{
[Area(AreaNames.ADMIN)]
[AuthorizeAdmin]
//[AutoValidateAntiforgeryToken]
public class InvoiceController : BasePluginController
{
private readonly IOrderService _orderService;
private readonly IWorkContext _workContext;
private readonly IStoreContext _storeContext;
private readonly ICustomerService _customerService;
private readonly ICountryService _countryService;
private readonly IStateProvinceService _stateProvinceService;
// Add your InnVoice API service
private readonly InnVoiceApiService _innVoiceApiService;
private readonly IProductService _productService;
private readonly FruitBankAttributeService _fruitBankAttributeService;
public InvoiceController(
IOrderService orderService,
IWorkContext workContext,
IStoreContext storeContext,
ICustomerService customerService,
ICountryService countryService,
IStateProvinceService stateProvinceService,
InnVoiceApiService innVoiceApiService,
IProductService productService,
FruitBankAttributeService fruitBankAttributeService)
{
_orderService = orderService;
_workContext = workContext;
_storeContext = storeContext;
_customerService = customerService;
_countryService = countryService;
_stateProvinceService = stateProvinceService;
_innVoiceApiService = innVoiceApiService;
_productService = productService;
_fruitBankAttributeService = fruitBankAttributeService;
}
[HttpPost]
public async Task<IActionResult> CreateInvoice(int orderId)
{
try
{
var order = await _orderService.GetOrderByIdAsync(orderId);
if (order == null)
return Json(new { success = false, message = "Order not found" });
var customer = await _customerService.GetCustomerByIdAsync(order.CustomerId);
var billingAddress = await _customerService.GetCustomerBillingAddressAsync(customer);
if (billingAddress == null)
return Json(new { success = false, message = "Billing address not found" });
var country = await _countryService.GetCountryByAddressAsync(billingAddress);
var countryCode = country?.TwoLetterIsoCode ?? "HU";
// Create invoice request
var invoiceRequest = new InvoiceCreateRequest
{
VevoNev = $"{billingAddress.FirstName} {billingAddress.LastName}",
VevoIrsz = billingAddress.ZipPostalCode ?? "",
VevoTelep = billingAddress.City ?? "",
VevoOrszag = countryCode,
VevoUtcaHsz = $"{billingAddress.Address1} {billingAddress.Address2}".Trim(),
SzamlatombID = 1, // Configure this based on your setup
SzamlaKelte = DateTime.Now,
TeljesitesKelte = DateTime.Now,
Hatarido = DateTime.Now.AddDays(15), // 15 days payment term
Devizanem = order.CustomerCurrencyCode,
FizetesiMod = order.PaymentMethodSystemName,
Felretett = false,
Proforma = true,
Email = billingAddress.Email,
MegrendelesSzamStr = order.CustomOrderNumber,
Telefon = billingAddress.PhoneNumber
};
// Add order items
var orderItems = await _orderService.GetOrderItemsAsync(order.Id);
foreach (var item in orderItems)
{
var product = await _productService.GetProductByIdAsync(item.ProductId);
invoiceRequest.AddItem(new InvoiceItem
{
TetelNev = product?.Name ?? "Product",
AfaSzoveg = "27%", // Configure VAT rate as needed
Brutto = true,
EgysegAr = item.UnitPriceInclTax,
Mennyiseg = item.Quantity,
MennyisegEgyseg = "db",
CikkSzam = product?.Sku
});
}
// Create invoice via API
var response = await _innVoiceApiService.CreateInvoiceAsync(invoiceRequest);
if (response.IsSuccess)
{
// TODO: Save invoice details to your database for future reference
// You might want to create a custom table to store:
// - OrderId
// - InnVoice TableId
// - Invoice Number
// - PDF URL
// - Created Date
await _fruitBankAttributeService.InsertOrUpdateGenericAttributeAsync<Order, string>(orderId, nameof(InvoiceCreateResponse.TechId), response.TechId);
return Json(new
{
success = true,
message = "Invoice created successfully",
data = new
{
tableId = response.TableId,
invoiceNumber = response.Sorszam,
sorszam = response.Sorszam,
printUrl = response.PrintUrl
}
});
}
else
{
return Json(new
{
success = false,
message = $"InnVoice API Error: {response.Message}"
});
}
}
catch (Exception ex)
{
return Json(new
{
success = false,
message = $"Error: {ex.Message}"
});
}
}
[HttpGet]
public async Task<IActionResult> GetInvoiceStatus(int orderId)
{
try
{
// Get the invoice from InnVoice using the saved TechId
var techId = await _fruitBankAttributeService.GetGenericAttributeValueAsync<Order, string>(
orderId,
nameof(InvoiceCreateResponse.TechId),
_storeContext.GetCurrentStore().Id
);
if (string.IsNullOrEmpty(techId))
{
return Json(new
{
success = false,
message = "No invoice TechId found for this order"
});
}
var invoices = await _innVoiceApiService.GetInvoiceByTechIdAsync(techId);
if (invoices != null && invoices.Count > 0)
{
var invoice = invoices.FirstOrDefault();
return Json(new
{
success = true,
data = new
{
tableId = invoice.TableId,
invoiceNumber = invoice.InvoiceNumberFormatted, // or invoice.InvoiceNumber
sorszam = invoice.InvoiceNumberFormatted,
printUrl = invoice.PrintUrl,
customerName = invoice.CustomerName,
totalGross = invoice.TotalGross,
currency = invoice.Currency,
isProforma = invoice.IsProforma,
isDraft = invoice.IsDraft
}
});
}
return Json(new
{
success = false,
message = "No invoice found for this order"
});
}
catch (Exception ex)
{
return Json(new
{
success = false,
message = $"Error: {ex.Message}"
});
}
}
}
}