import uniqueId from "lodash/uniqueId"; describe( "Billing job parts orders", { defaultCommandTimeout: 5000, }, () => { beforeEach(() => { cy.visit("/manage"); cy.get("body").then(($body) => { if ($body.text().includes("Login")) { // Log in cy.get('[data-cy="username"]').type("john@imex.dev"); cy.get('[data-cy="password"]').type("john123"); cy.get('[data-cy="sign-in-button"]').click(); } cy.get(".ant-table-tbody") .should("be.visible") .find("tr") .should("not.have.class", "ant-table-placeholder"); cy.get(".ant-table-row") .not(':contains("Open")') .first() .find("a") .first() .click(); cy.url().should("include", "/manage/jobs"); // Go to repair data tab cy.get('[data-cy="tab-partssublet"]').should("be.visible").click(); }); }); it("receives a part bill", () => { // Find the first row in the parts order cy.get('[data-cy="part-orders-table"]') .find(".ant-table-tbody") .find("> tr:not(.ant-table-measure-row)") .as("orders-table") .should("not.have.class", "ant-table-placeholder"); cy.get("@orders-table") .first() .should("be.visible") .find('[data-cy="receive-bill-button"]') .click(); // fill out form // data-cy="bill-form-invoice" cy.get('[data-cy="bill-form-invoice"]').type(uniqueId("1QBD246-00-")); cy.get("#bill-form-date").click(); cy.get('[title="2023-07-06"]').should("be.visible").click(); // get table cy.get('[data-cy="bill-line-table"]').each(($row) => { // get retail amount cy.wrap($row) .find('[data-cy="bill-line-actual-price"]') .invoke("val") .then((p) => { const vendorPercentOff = 0.2; // get cost - vendor's percent off const cost = p - p * vendorPercentOff; cy.get('[data-cy="bill-form-bill-total"]').type(p); cy.wrap($row).find('[data-cy="bill-line-actual-cost"]').type(cost); }); }); // Click save cy.get('[data-cy="bill-form-save-button"]').click(); cy.get(".ant-notification-notice-message").contains( "Invoice added successfully." ); }); it("posts bill directly", () => { cy.get('[data-cy="bills-post-button"]').should("be.visible").click(); // Add New Line cy.get('[data-cy="bill-line-add-button"]') .should("not.be.disabled") .click(); // Select Vendor cy.antdSelect("bill-vendor"); // Select Line cy.antdSelect("bill-line", "-- Not On Estimate --"); // Fill the Form cy.get('[data-cy="bill-form-invoice"]').type(uniqueId("1QBD246-01-")); cy.get("#bill-form-date").click(); cy.get('[title="2023-07-06"]').should("be.visible").click(); // get table cy.get('[data-cy="bill-line-table"]').each(($row) => { // get retail amount cy.wrap($row) .find('[data-cy="bill-line-actual-price"]') .invoke("val") .then((p) => { const vendorPercentOff = 0.2; // get cost - vendor's percent off const cost = p - p * vendorPercentOff; cy.get('[data-cy="bill-form-bill-total"]').type(p); cy.wrap($row).find('[data-cy="bill-line-actual-cost"]').type(cost); }); }); // Click save cy.get('[data-cy="bill-form-save-button"]').click(); cy.get(".ant-notification-notice-message").contains( "Invoice added successfully." ); }); it("posts a bill with save and new", () => { cy.get('[data-cy="bills-post-button"]').should("be.visible").click(); // Add New Line cy.get('[data-cy="bill-line-add-button"]') .should("not.be.disabled") .click(); // Select Vendor cy.antdSelect("bill-vendor"); // Select Line cy.antdSelect("bill-line", "-- Not On Estimate --"); // Fill the Form cy.get('[data-cy="bill-form-invoice"]').type(uniqueId("1QBD246-02-")); cy.get("#bill-form-date").click(); cy.get('[title="2023-07-06"]').should("be.visible").click(); // get table cy.get('[data-cy="bill-line-table"]').each(($row) => { // get retail amount cy.wrap($row) .find('[data-cy="bill-line-actual-price"]') .invoke("val") .then((p) => { const vendorPercentOff = 0.2; // get cost - vendor's percent off const cost = p - p * vendorPercentOff; cy.get('[data-cy="bill-form-bill-total"]').type(p); cy.wrap($row).find('[data-cy="bill-line-actual-cost"]').type(cost); }); }); // Click save cy.get('[data-cy="bill-form-savenew-button"]') .should("not.be.disabled") .click(); cy.get(".ant-notification-notice-message").contains( "Invoice added successfully." ); }); it("uploads a document to a bill", () => { cy.get('[data-cy="bills-table"]') .find(".ant-table-tbody") .find("> tr:not(.ant-table-measure-row)") .as("bills-table") .should("not.have.class", "ant-table-placeholder"); cy.get("@bills-table") .first() .should("be.visible") .find('[data-cy="edit-bill-button"]') .click(); cy.location("search").should("include", "billid"); cy.get('[data-cy="bill-edit-form"]') .find(".ant-upload #bill-document-upload") .selectFile("job.json", { force: true }); }); it("marks bill as exported", () => { cy.get('[data-cy="bills-table"]') .find(".ant-table-tbody") .find("> tr:not(.ant-table-measure-row)") .as("bills-table") .should("not.have.class", "ant-table-placeholder"); cy.get("@bills-table") .find('[data-cy="bill-exported-checkbox"]') .not(":checked") .first() .as("export-status") .parent() .parent() .parent() .parent() .find('[data-cy="edit-bill-button"]') .click(); cy.location("search").should("include", "billid"); cy.get('[data-cy="bill-mark-export-button"]') .as("mark-for-export") .click(); cy.get("@mark-for-export").should("be.disabled"); }); it("marks bill for re-export", () => { cy.get('[data-cy="bills-table"]') .find(".ant-table-tbody") .find("> tr:not(.ant-table-measure-row)") .as("bills-table") .should("not.have.class", "ant-table-placeholder"); cy.get("@bills-table") .find('[data-cy="bill-exported-checkbox"]') .filter(":checked") .first() .as("export-status") .parent() .parent() .parent() .parent() .find('[data-cy="edit-bill-button"]') .click(); cy.location("search").should("include", "billid"); cy.get('[data-cy="bill-mark-reexport-button"]') .as("mark-for-reexport") .click(); cy.get("@mark-for-reexport").should("be.disabled"); }); } ); describe( "Validating and calculating bills", { defaultCommandTimeout: 5000, }, () => { beforeEach(() => { cy.visit("/manage"); cy.get("body").then(($body) => { if ($body.text().includes("Login")) { // Log in cy.get('[data-cy="username"]').type("john@imex.dev"); cy.get('[data-cy="password"]').type("john123"); cy.get('[data-cy="sign-in-button"]').click(); } cy.get(".ant-table-tbody") .should("be.visible") .find("tr") .should("not.have.class", "ant-table-placeholder"); cy.get(".ant-table-row").contains("QBD261").click(); cy.url().should("include", "/manage/jobs"); // Go to repair data tab cy.get('[data-cy="tab-partssublet"]').should("be.visible").click(); }); }); it("validates auto reconciliation through posting bill", () => { // Find the first row in the parts order cy.get('[data-cy="part-orders-table"]') .find(".ant-table-tbody") .find("> tr:not(.ant-table-measure-row)") .as("orders-table") .should("not.have.class", "ant-table-placeholder"); cy.get("@orders-table") .first() .should("be.visible") .find('[data-cy="receive-bill-button"]') .click(); // fill out form cy.get('[data-cy="bill-form-invoice"]').type(uniqueId("1QBD261-0")); cy.get("#bill-form-date").click(); cy.get('[title="2023-07-06"]').should("be.visible").click(); cy.get('[data-cy="bill-form-bill-total"]').type("70.46"); cy.get('[data-cy="bill-line-actual-cost"]').type("67.10"); cy.get("#bill-form-discrepancy").should("have.text", "$0.00"); // Click save cy.get('[data-cy="bill-form-save-button"]').click(); cy.get("#retailtotal").should("have.text", "$83.87"); cy.get(".discrepancy").each(($statistic) => { cy.wrap($statistic).should("have.text", "$0.00"); }); }); it("returning item and validating statistics", () => { cy.get('[data-cy="bills-table"]') .find(".ant-table-tbody") .find("> tr:not(.ant-table-measure-row)") .as("bills-table") .should("not.have.class", "ant-table-placeholder"); cy.get("@bills-table") .first() .should("not.be.disabled") .find('[data-cy="return-items-button"]') .click(); cy.get('[data-cy="billline-checkbox"]').check(); cy.get('[data-cy="billline-return-items-ok-button"]').click(); cy.get("#order-quantity").type("1", { force: true, multiple: true }); cy.get('[data-cy="part-order-select-none"]').click({ multiple: true, force: true, }); cy.get('[data-cy="order-part-submit"]').click({ multiple: true, force: true, }); cy.get("#totalReturns").should("have.text", "$83.87"); cy.get("#calculatedcreditsnotreceived").should("have.text", "$83.87"); cy.get("#creditsnotreceived").should("have.text", "$83.87"); }); it("receives credit memo without return part", () => { // Find the first row in the parts order cy.get('[data-cy="part-orders-table"]') .find(".ant-table-tbody") .find("> tr:not(.ant-table-measure-row)") .as("orders-table") .should("not.have.class", "ant-table-placeholder"); cy.get("@orders-table") .find('[data-cy="part-order-return-checkbox"]') .filter(":checked") .first() .parent() .parent() .parent() .parent() .find('[data-cy="receive-bill-button"]') .click(); // fill out form cy.get('[data-cy="bill-form-invoice"]').type(uniqueId("1QBD261-01-")); cy.get("#bill-form-date").click(); cy.get('[title="2023-07-06"]').should("be.visible").click(); cy.get('[data-cy="bill-form-bill-total"]').type("70.46"); cy.get('[data-cy="bill-line-actual-cost"]').type("67.10"); cy.get("#bill-form-discrepancy").should("have.text", "$0.00"); // Click save cy.get('[data-cy="bill-form-save-button"]').click(); cy.get("#totalReturns").should("have.text", "$83.87"); cy.get("#calculatedcreditsnotreceived").should("have.text", "$0.00"); cy.get("#creditsnotreceived").should("have.text", "$83.87"); }); it("receives credit memo with return part", () => { // Find the first row in the parts order cy.get('[data-cy="part-orders-table"]') .find(".ant-table-tbody") .find("> tr:not(.ant-table-measure-row)") .as("orders-table") .should("not.have.class", "ant-table-placeholder"); cy.get("@orders-table") .find('[data-cy="part-order-return-checkbox"]') .filter(":checked") .first() .parent() .parent() .parent() .parent() .find('[data-cy="receive-bill-button"]') .click(); // fill out form cy.get('[data-cy="bill-form-invoice"]').type(uniqueId("1QBD261-02-")); cy.get("#bill-form-date").click(); cy.get('[title="2023-07-06"]').should("be.visible").click(); cy.get('[data-cy="bill-form-bill-total"]').type("70.46"); cy.get('[data-cy="bill-line-actual-cost"]').type("67.10"); cy.get("#bill-form-discrepancy").should("have.text", "$0.00"); cy.get('[data-cy="mark-as-received-checkbox"]').check(); // Click save cy.get('[data-cy="bill-form-save-button"]').click(); cy.get("#totalReturns").should("have.text", "$83.87"); cy.get("#calculatedcreditsnotreceived").should("have.text", "$0.00"); cy.get("#creditsnotreceived").should("have.text", "$0.00"); }); it("views the row expander if it has the order and bill", () => { cy.get('[data-cy="tab-repairdata"]').should("be.visible").click(); cy.get('[data-cy="filter-parts-button"]') .should("not.be.disabled") .click(); cy.get('[data-cy="repair-data-table"]') .find(".ant-table-tbody") .find("> tr:not(.ant-table-measure-row)") .first() .next() .find("td") .first() .click(); cy.get('[data-cy="parts-bills-order"]') .should("be.visible") .find("li") .first() .should("not.have.text", "This part has not yet been ordered."); }); } );