Add Download Template Product
All checks were successful
CI/CD Pipeline / Build and Deploy with Docker Compose (push) Successful in 14m19s
All checks were successful
CI/CD Pipeline / Build and Deploy with Docker Compose (push) Successful in 14m19s
This commit is contained in:
parent
d60238f5eb
commit
27439cbd95
@ -11,5 +11,6 @@ namespace Core.Interfaces
|
||||
Task<bool> UpdateAsync(ELSProduct entity);
|
||||
Task<bool> DeleteAsync(int id);
|
||||
Task<byte[]> ExportToExcelAsync(LSProductSearchParams searchParams);
|
||||
byte[] GetImportTemplate();
|
||||
}
|
||||
}
|
||||
@ -77,5 +77,16 @@ namespace Core.Services
|
||||
throw new Exception($"Error en {method}: {ex.Message}", ex);
|
||||
}
|
||||
}
|
||||
public byte[] GetImportTemplate()
|
||||
{
|
||||
var path = Path.Combine(Directory.GetCurrentDirectory(), "Resources", "Templates", "Stock", "plantilla_productos.xlsx");
|
||||
|
||||
if (!File.Exists(path))
|
||||
throw new FileNotFoundException("No se encontró la plantilla de importación de productos.", path);
|
||||
|
||||
return File.ReadAllBytes(path);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@ -64,5 +64,14 @@ namespace API.Controllers.Stock
|
||||
var fileName = $"productos_{DateTime.Now:yyyyMMddHHmm}.xlsx";
|
||||
return File(content, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", fileName);
|
||||
}
|
||||
|
||||
[HttpGet("download-template")]
|
||||
public IActionResult DownloadImportTemplate()
|
||||
{
|
||||
var file = _service.GetImportTemplate();
|
||||
return File(file,
|
||||
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
|
||||
"plantilla_productos.xlsx");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
BIN
phronCare.API/Resources/Templates/Stock/plantilla_productos.xlsx
Normal file
BIN
phronCare.API/Resources/Templates/Stock/plantilla_productos.xlsx
Normal file
Binary file not shown.
@ -1080,6 +1080,16 @@
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"ContainingType": "API.Controllers.Stock.LSProductController",
|
||||
"Method": "DownloadImportTemplate",
|
||||
"RelativePath": "api/LSProduct/download-template",
|
||||
"HttpMethod": "GET",
|
||||
"IsController": true,
|
||||
"Order": 0,
|
||||
"Parameters": [],
|
||||
"ReturnTypes": []
|
||||
},
|
||||
{
|
||||
"ContainingType": "API.Controllers.Stock.LSProductController",
|
||||
"Method": "ExportFiltered",
|
||||
|
||||
@ -19,6 +19,11 @@
|
||||
|
||||
<ItemGroup>
|
||||
<Content Include="Resources\logo.png" />
|
||||
<Content Include="Resources\Templates\Stock\plantilla_productos.xlsx">
|
||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||
<ExcludeFromSingleFile>true</ExcludeFromSingleFile>
|
||||
<CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
|
||||
</Content>
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
|
||||
@ -1,13 +1,17 @@
|
||||
@page "/stock/productimport"
|
||||
@using phronCare.UIBlazor.Services.Stock
|
||||
|
||||
@inject IJSRuntime JS
|
||||
@inject IToastService toastService
|
||||
@inject NavigationManager Navigation
|
||||
@inject LSProductService productService
|
||||
|
||||
<h3 class="mb-4">Importación masiva de productos</h3>
|
||||
|
||||
<div class="mb-3">
|
||||
<button class="btn btn-primary" @onclick="DownloadTemplate">Descargar plantilla Excel</button>
|
||||
</div>
|
||||
|
||||
<div class="mb-4">
|
||||
<label for="fileUpload" class="form-label fw-semibold">Seleccionar archivo Excel</label>
|
||||
<div class="input-group">
|
||||
@ -16,6 +20,13 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@if (UploadedFile != null)
|
||||
{
|
||||
<div class="mb-4">
|
||||
<button class="btn btn-warning" @onclick="ProcessFile">Procesar archivo Excel</button>
|
||||
</div>
|
||||
}
|
||||
|
||||
@if (PreviewItems != null)
|
||||
{
|
||||
<h5 class="mt-4">Vista previa</h5>
|
||||
@ -61,6 +72,8 @@
|
||||
|
||||
@code {
|
||||
private List<ProductImportPreviewDto>? PreviewItems;
|
||||
private IBrowserFile? UploadedFile;
|
||||
|
||||
protected override void OnInitialized()
|
||||
{
|
||||
PreviewItems = new List<ProductImportPreviewDto>
|
||||
@ -72,14 +85,37 @@
|
||||
new() { FactoryCode = "ZIM005", Name = "Perno cortical", Description = "Perno de fijación", ProductType = 1, TraceabilityType = 3, DivisionCode = "ZIM", UnitCode = "UN", PlusProcess = true, ExternalCode = "EXT005" }
|
||||
};
|
||||
}
|
||||
|
||||
private async Task DownloadTemplate()
|
||||
{
|
||||
Navigation.NavigateTo("api/LSProductImport/download-template", forceLoad: true);
|
||||
try
|
||||
{
|
||||
await productService.DownloadTemplateAsync();
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
toastService.ShowError($"Error al descargar la plantilla: {ex.Message}");
|
||||
}
|
||||
}
|
||||
|
||||
private async Task HandleFileSelected(InputFileChangeEventArgs e)
|
||||
{
|
||||
// Lógica futura para parsear y enviar archivo al backend
|
||||
UploadedFile = e.File;
|
||||
//PreviewItems = null; // Limpiar preview anterior
|
||||
}
|
||||
|
||||
private async Task ProcessFile()
|
||||
{
|
||||
if (UploadedFile == null) return;
|
||||
|
||||
using var stream = UploadedFile.OpenReadStream(10 * 1024 * 1024);
|
||||
using var ms = new MemoryStream();
|
||||
await stream.CopyToAsync(ms);
|
||||
var content = ms.ToArray();
|
||||
|
||||
// Aquí deberías llamar al backend para validar y obtener la vista previa
|
||||
// Por ahora se simula con los datos ya cargados en OnInitialized
|
||||
// PreviewItems = await Http.PostAsJsonAsync(...)
|
||||
}
|
||||
|
||||
private async Task SimulateImport()
|
||||
|
||||
@ -73,5 +73,20 @@ namespace phronCare.UIBlazor.Services.Stock
|
||||
throw new Exception($"{message}", ex);
|
||||
}
|
||||
}
|
||||
public async Task DownloadTemplateAsync()
|
||||
{
|
||||
var response = await _http.GetAsync("/api/LSProduct/download-template");
|
||||
|
||||
if (!response.IsSuccessStatusCode)
|
||||
{
|
||||
var errorContent = await response.Content.ReadAsStringAsync();
|
||||
throw new Exception($"No se pudo descargar la plantilla: {errorContent}");
|
||||
}
|
||||
|
||||
var bytes = await response.Content.ReadAsByteArrayAsync();
|
||||
var base64 = Convert.ToBase64String(bytes);
|
||||
await _js.InvokeVoidAsync("saveAsFile", "plantilla_productos.xlsx", base64);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user