diff --git a/client/cypress/e2e/time-tickets/time-tickets.cy.js b/client/cypress/e2e/time-tickets/time-tickets.cy.js index 2f7779e1b..a29bcb33d 100644 --- a/client/cypress/e2e/time-tickets/time-tickets.cy.js +++ b/client/cypress/e2e/time-tickets/time-tickets.cy.js @@ -1,4 +1,3 @@ -import random from "lodash/random"; import moment from "moment"; import job2 from "../../fixtures/jobs/job-4.json"; @@ -15,19 +14,18 @@ describe( beforeEach(() => { cy.visit("/manage"); - // TODO add bodyshop query to get the employees data for labor - cy.intercept("POST", Cypress.env("graphql_dev_endpoint"), (req) => { - if (req.body.operationName === "QUERY_BODYSHOP") { - req.alias = "bodyshop"; - } - }); - cy.get('[data-cy="active-jobs-table"]') .find(".ant-table-tbody") .find("> tr:not(.ant-table-measure-row)") .as("active-jobs-table") .should("not.have.class", "ant-table-placeholder"); + cy.intercept("POST", Cypress.env("graphql_dev_endpoint"), (req) => { + if (req.body.operationName === "QUERY_ACTIVE_EMPLOYEES") { + req.alias = "employees"; + } + }); + cy.get("@active-jobs-table") .contains(job2.clm_no) .first() @@ -55,7 +53,6 @@ describe( cy.get('[data-cy="form-timeticket-date"]').click(); cy.get(`[title="${today}"]`).should("be.visible").click({ force: true }); - // TODO select employee from the bodyshop cy.antdSelect("timeticket-employee"); cy.antdSelect("cost-center"); @@ -86,7 +83,7 @@ describe( }); }); - it("adds new time ticket to a job", () => { + it("adds new time ticket to a job with flat rate", () => { cy.get('[data-cy="job-actions-button"]').click(); cy.get('[data-cy="actions-timetickets"]') @@ -112,31 +109,27 @@ describe( .invoke("text") .as("bodyDiff") .then((diff) => { - const hours = random(diff); - const actualHrs = random(hours); + cy.get('[data-cy="form-timeticket-productivehrs"]').type(1); - cy.get('[data-cy="form-timeticket-productivehrs"]').type( - hours.toFixed(1) - ); - - cy.get('[data-cy="form-timeticket-actualhrs"]').type( - actualHrs.toFixed(1) - ); + cy.get('[data-cy="form-timeticket-actualhrs"]').type(1); }); - cy.antdSelect("timeticket-employee"); + cy.wait("@employees").then(({ response }) => { + const employees = response.body.data.employees; + const employee = employees[0]; + const employee_name = `${employee.first_name} ${employee.last_name}`; + + cy.antdSelectValue("timeticket-employee", employee_name); + }); cy.antdSelect("cost-center"); cy.get('[data-cy="form-timeticket-memo"]').type(uuid()); cy.get('[data-cy="timeticket-save-button"]').first().click(); - - // TODO check if hours are calculated to the allocations table - // cy.get('[data-cy="tab-labor"]').should("be.visible").click(); }); - it("checks the job costing calculations", () => { + it("adds new time ticket to a job with straight rate", () => { cy.get('[data-cy="job-actions-button"]').click(); cy.get('[data-cy="actions-timetickets"]') @@ -144,7 +137,85 @@ describe( .and("not.be.disabled") .click(); + cy.get('[data-cy="labor-allocations-table"]') + .find(".ant-table-tbody") + .find("> tr:not(.ant-table-measure-row)") + .as("labor-allocations") + .should("not.have.class", "ant-table-placeholder"); + + // Get Difference for Body + cy.get('[data-cy="form-timeticket-date"]').click(); + cy.get(`[title="${today}"]`).should("be.visible").click(); + + cy.get("@labor-allocations") + .eq(0) + .find("td:not(.ant-table-selection-column)") + .eq(4) + .find("strong") + .invoke("text") + .as("bodyDiff") + .then((diff) => { + cy.get('[data-cy="form-timeticket-productivehrs"]').type(1); + + cy.get('[data-cy="form-timeticket-actualhrs"]').type(1); + }); + + cy.wait("@employees").then(({ response }) => { + const employees = response.body.data.employees; + const employee = employees[1]; + const employee_name = `${employee.first_name} ${employee.last_name}`; + + cy.antdSelectValue("timeticket-employee", employee_name); + }); + + cy.antdSelect("cost-center"); + + cy.get('[data-cy="form-timeticket-memo"]').type(uuid()); + + cy.get('[data-cy="timeticket-save-button"]').first().click(); + }); + + it("checks hours calculated to the allocations table", () => { + cy.get('[data-cy="tab-labor"]').should("be.visible").click(); + + cy.get('[data-cy="labor-allocations-table"]') + .find(".ant-table-tbody") + .find("> tr:not(.ant-table-measure-row)") + .as("labor-allocations") + .should("not.have.class", "ant-table-placeholder"); + + cy.get('[data-cy="labor-total-hrs-claimed"]') + .invoke("text") + .then((hours) => { + cy.wrap(hours).should("not.equal", "0"); + }); + }); + + it.only("checks the job costing calculations", () => { + cy.get('[data-cy="job-actions-button"]').click(); + + cy.get('[data-cy="actions-jobcosting"]') + .should("be.visible") + .and("not.be.disabled") + .click(); + // TODO check if labors are calculated correctly + + cy.wait("@employees").then(({ response }) => { + const employees = response.body.data.employees; + const employee_body_rates = employees.map((emp) => { + return emp.rates.filter((rate) => rate.cost_center === "Body")[0] + .rate; + }); + + cy.log(employee_body_rates); + + cy.get('[data-cy="responsibilitycenter"]') + .contains("Body") + .parent() + .parent() + .find('[data-cy="cost"]'); + }); }); it("clocks in and out of the tech page for the timeticket", () => { diff --git a/client/cypress/support/commands.js b/client/cypress/support/commands.js index 1eba6d6a5..e9f09e514 100644 --- a/client/cypress/support/commands.js +++ b/client/cypress/support/commands.js @@ -74,6 +74,22 @@ Cypress.Commands.add("antdSelect", (selector, filter) => { }); }); +Cypress.Commands.add("antdSelectValue", (selector, filter) => { + cy.get(`.ant-select-${selector} > .ant-select-selector`).click(); + cy.get(`.ant-select-${selector} .ant-select-selection-search input`) + .invoke("attr", "id") + .then((selElm) => { + const dropDownSelector = `#${selElm}_list`; + + cy.get(dropDownSelector) + .next() + .find(".ant-select-item-option-content") + .contains(filter) + .first() + .click({ force: true }); + }); +}); + Cypress.Commands.add( "insertAvailableJob", ({ bodyshopid, job, job_est_data, token }) => { diff --git a/client/src/components/job-costing-parts-table/job-costing-parts-table.component.jsx b/client/src/components/job-costing-parts-table/job-costing-parts-table.component.jsx index 405fb9bb8..ab4e0c89a 100644 --- a/client/src/components/job-costing-parts-table/job-costing-parts-table.component.jsx +++ b/client/src/components/job-costing-parts-table/job-costing-parts-table.component.jsx @@ -23,6 +23,7 @@ export default function JobCostingPartsTable({ data, summaryData }) { sorter: (a, b) => alphaSort(a.cost_center, b.cost_center), sortOrder: state.sortedInfo.columnKey === "cost_center" && state.sortedInfo.order, + render: (record) => {record}, }, { title: t("jobs.labels.sales"), @@ -42,6 +43,7 @@ export default function JobCostingPartsTable({ data, summaryData }) { parseFloat(a.costs.substring(1)) - parseFloat(b.costs.substring(1)), sortOrder: state.sortedInfo.columnKey === "costs" && state.sortedInfo.order, + render: (record) => {record}, }, { diff --git a/client/src/components/labor-allocations-table/labor-allocations-table.component.jsx b/client/src/components/labor-allocations-table/labor-allocations-table.component.jsx index bc325af13..4776c5eb1 100644 --- a/client/src/components/labor-allocations-table/labor-allocations-table.component.jsx +++ b/client/src/components/labor-allocations-table/labor-allocations-table.component.jsx @@ -226,7 +226,9 @@ export function LaborAllocationsTable({ {summary.hrs_total.toFixed(1)}