diff --git a/tests/cypress/e2e/dashboard.cy.js b/tests/cypress/e2e/dashboard.cy.js
index 5a54380..316da4b 100644
--- a/tests/cypress/e2e/dashboard.cy.js
+++ b/tests/cypress/e2e/dashboard.cy.js
@@ -32,7 +32,7 @@ describe("Role-based button functionality", () => {
cy.visitWithToken("/dashboard");
cy.get("#btnParcelControl").contains("Control de paquetería").click();
- cy.url().should("include", "/parcelControl");
+ cy.url().should("include", "/packages");
cy.visitWithToken("/dashboard");
});
});
@@ -62,7 +62,7 @@ describe("Role-based button functionality", () => {
cy.visitWithToken("/dashboard");
cy.get("#btnParcelControl").contains("Control de paquetería").click();
- cy.url().should("include", "/parcelControl");
+ cy.url().should("include", "/packages");
});
});
diff --git a/tests/cypress/e2e/packages.cy.js b/tests/cypress/e2e/packages.cy.js
new file mode 100644
index 0000000..f52c5f9
--- /dev/null
+++ b/tests/cypress/e2e/packages.cy.js
@@ -0,0 +1,51 @@
+describe("Packages Table", () => {
+ beforeEach(() => {
+ cy.intercept("GET", "/packages", {
+ statusCode: 200,
+ body: {
+ message: "OK",
+ packages: [
+ {
+ id: 1,
+ service: "Delivery",
+ receivedAt: "2023-12-20 14:00:00",
+ confirmedAt: null,
+ address: "Fake Street 123",
+ statusName: "confirmar",
+ },
+ ],
+ },
+ }).as("getPackages");
+
+ cy.visitWithToken("/packages");
+ });
+
+ it("should display the packages table with confirmation buttons", () => {
+ cy.wait("@getPackages");
+ cy.get("#packageTable").should("exist");
+ cy.get('[data-cy="btnConfirm"]').should("exist");
+ cy.get("#packageTable tr").then(($rows) => {
+ const numRows = $rows.length;
+ cy.get('[data-cy="btnConfirm"]').should("have.length", numRows);
+ });
+ });
+
+ it("should display an empty table with an error message when the API request fails", () => {
+ cy.intercept("GET", "/packages", {
+ statusCode: 500,
+ body: { message: "Internal Server Error" },
+ }).as("getPackagesError");
+
+ cy.visitWithToken("/packages");
+ cy.wait("@getPackagesError");
+
+ cy.get("#packageTable").should("exist");
+ cy.get("#packageTable tr").should("have.length", 0);
+ });
+
+ it("should display a confirmation button for each package", () => {
+ cy.wait("@getPackages");
+ cy.get("#packageTable").should("exist");
+ cy.get('[data-cy="btnConfirm"]').should("exist");
+ });
+});
diff --git a/views/dashboard/blocks/parcelControlbutton.html b/views/dashboard/blocks/parcelControlbutton.html
index 4a4d503..5ee724f 100644
--- a/views/dashboard/blocks/parcelControlbutton.html
+++ b/views/dashboard/blocks/parcelControlbutton.html
@@ -4,7 +4,7 @@
id="btnParcelControl"
class="btn btn-primary btn-lg me-3"
style="width: 150px; height: 150px"
- onclick="navigateTo('/parcelControl')"
+ onclick="navigateTo('/packages')"
>
local_shipping
Control de paquetería
diff --git a/views/packages/assets/index.js b/views/packages/assets/index.js
new file mode 100644
index 0000000..8cc0ed4
--- /dev/null
+++ b/views/packages/assets/index.js
@@ -0,0 +1,101 @@
+async function fetchPackages() {
+ try {
+ return await apiRequest("GET", "packages");
+ } catch (error) {
+ console.error("Error al cargar paquetes:", error);
+ return null;
+ }
+}
+
+function createCell(textContent) {
+ const cell = document.createElement("td");
+ cell.textContent = textContent;
+ return cell;
+}
+
+function formatDate(dateString) {
+ const date = new Date(dateString);
+ return date.toLocaleString();
+}
+
+function createActionsCell(pkg) {
+ const actionsCell = document.createElement("td");
+
+ const confirmButton = createConfirmButton(pkg.id);
+ actionsCell.appendChild(confirmButton);
+
+ return actionsCell;
+}
+
+function createPackageRow(pkg) {
+ const row = document.createElement("tr");
+
+ const serviceCell = createCell(pkg.service);
+ const receivedCell = createCell(formatDate(pkg.receivedAt));
+ const confirmationCell = createCell(formatDate(pkg.confirmedAt));
+ const addressCell = createCell(pkg.address);
+ const statusCell = createCell(pkg.statusName);
+ const actionsCell = createActionsCell(pkg);
+
+ row.appendChild(serviceCell);
+ row.appendChild(receivedCell);
+ row.appendChild(confirmationCell);
+ row.appendChild(addressCell);
+ row.appendChild(statusCell);
+ row.appendChild(actionsCell);
+
+ return row;
+}
+
+function createConfirmButton(pkg) {
+ const confirmButton = document.createElement("button");
+ confirmButton.className = "btn btn-outline-success btn-sm";
+ confirmButton.title = "Confirmar Entrega";
+ confirmButton.setAttribute("data-cy", "btnConfirm");
+ confirmButton.setAttribute("data-package-id", pkg.id);
+
+ const confirmIcon = document.createElement("span");
+ confirmIcon.className = "material-symbols-outlined";
+ confirmIcon.textContent = "check_circle";
+ confirmButton.appendChild(confirmIcon);
+
+ confirmButton.onclick = async () => {
+ try {
+ const response = await apiRequest("POST", `packages/${pkg.id}/confirm`);
+ if (response.success) {
+ alert("Entrega confirmada.");
+ await loadPackagesTable();
+ } else {
+ alert("No se pudo confirmar la entrega.");
+ }
+ } catch (error) {
+ console.error("Error al confirmar entrega ", error);
+ }
+ };
+
+ return confirmButton;
+}
+
+async function loadPackagesTable() {
+ try {
+ const response = await fetchPackages();
+
+ const packageTable = document.getElementById("packageTable");
+ packageTable.innerHTML = "";
+
+ response.data.packages.forEach((pkg) => {
+ const row = createPackageRow(pkg);
+ packageTable.appendChild(row);
+ });
+ } catch (error) {
+ console.error("Error al cargar la tabla de paquetes ", error);
+ }
+}
+
+document.getElementById("registerPackage").addEventListener("click", () => {
+ window.location.href = "/packages/register.html";
+});
+
+window.addEventListener("load", async () => {
+ await loadPackagesTable();
+});
diff --git a/views/packages/index.html b/views/packages/index.html
new file mode 100644
index 0000000..69d908c
--- /dev/null
+++ b/views/packages/index.html
@@ -0,0 +1,26 @@
+
| Servicio | +Fecha y Hora de Recibido | +Fecha y Hora de Confirmado | +Dirección | +Estatus | +Acciones | +
|---|