mirror of
				https://github.com/inventree/InvenTree.git
				synced 2025-11-03 22:55:43 +00:00 
			
		
		
		
	Use ref pattern on PO duplicate (#9100)
* use ref pattern on PO duplicate * use ref patterns on duplicate for other types of orders * revert unintentional change to pre-commit * add playwright tests --------- Co-authored-by: Oliver <oliver.henry.walters@gmail.com>
This commit is contained in:
		@@ -381,14 +381,20 @@ export default function BuildDetail() {
 | 
			
		||||
    onFormSuccess: refreshInstance
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  const duplicateBuildOrderInitialData = useMemo(() => {
 | 
			
		||||
    const data = { ...build };
 | 
			
		||||
    // if we set the reference to null/undefined, it will be left blank in the form
 | 
			
		||||
    // if we omit the reference altogether, it will be auto-generated via reference pattern
 | 
			
		||||
    // from the OPTIONS response
 | 
			
		||||
    delete data.reference;
 | 
			
		||||
    return data;
 | 
			
		||||
  }, [build]);
 | 
			
		||||
 | 
			
		||||
  const duplicateBuild = useCreateApiFormModal({
 | 
			
		||||
    url: ApiEndpoints.build_order_list,
 | 
			
		||||
    title: t`Add Build Order`,
 | 
			
		||||
    fields: buildOrderFields,
 | 
			
		||||
    initialData: {
 | 
			
		||||
      ...build,
 | 
			
		||||
      reference: undefined
 | 
			
		||||
    },
 | 
			
		||||
    initialData: duplicateBuildOrderInitialData,
 | 
			
		||||
    follow: true,
 | 
			
		||||
    modelType: ModelType.build
 | 
			
		||||
  });
 | 
			
		||||
 
 | 
			
		||||
@@ -94,14 +94,20 @@ export default function PurchaseOrderDetail() {
 | 
			
		||||
    }
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  const duplicatePurchaseOrderInitialData = useMemo(() => {
 | 
			
		||||
    const data = { ...order };
 | 
			
		||||
    // if we set the reference to null/undefined, it will be left blank in the form
 | 
			
		||||
    // if we omit the reference altogether, it will be auto-generated via reference pattern
 | 
			
		||||
    // from the OPTIONS response
 | 
			
		||||
    delete data.reference;
 | 
			
		||||
    return data;
 | 
			
		||||
  }, [order]);
 | 
			
		||||
 | 
			
		||||
  const duplicatePurchaseOrder = useCreateApiFormModal({
 | 
			
		||||
    url: ApiEndpoints.purchase_order_list,
 | 
			
		||||
    title: t`Add Purchase Order`,
 | 
			
		||||
    fields: duplicatePurchaseOrderFields,
 | 
			
		||||
    initialData: {
 | 
			
		||||
      ...order,
 | 
			
		||||
      reference: undefined
 | 
			
		||||
    },
 | 
			
		||||
    initialData: duplicatePurchaseOrderInitialData,
 | 
			
		||||
    follow: true,
 | 
			
		||||
    modelType: ModelType.purchaseorder
 | 
			
		||||
  });
 | 
			
		||||
 
 | 
			
		||||
@@ -344,14 +344,20 @@ export default function ReturnOrderDetail() {
 | 
			
		||||
    }
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  const duplicateReturnOrderInitialData = useMemo(() => {
 | 
			
		||||
    const data = { ...order };
 | 
			
		||||
    // if we set the reference to null/undefined, it will be left blank in the form
 | 
			
		||||
    // if we omit the reference altogether, it will be auto-generated via reference pattern
 | 
			
		||||
    // from the OPTIONS response
 | 
			
		||||
    delete data.reference;
 | 
			
		||||
    return data;
 | 
			
		||||
  }, [order]);
 | 
			
		||||
 | 
			
		||||
  const duplicateReturnOrder = useCreateApiFormModal({
 | 
			
		||||
    url: ApiEndpoints.return_order_list,
 | 
			
		||||
    title: t`Add Return Order`,
 | 
			
		||||
    fields: duplicateReturnOrderFields,
 | 
			
		||||
    initialData: {
 | 
			
		||||
      ...order,
 | 
			
		||||
      reference: undefined
 | 
			
		||||
    },
 | 
			
		||||
    initialData: duplicateReturnOrderInitialData,
 | 
			
		||||
    modelType: ModelType.returnorder,
 | 
			
		||||
    follow: true
 | 
			
		||||
  });
 | 
			
		||||
 
 | 
			
		||||
@@ -287,14 +287,20 @@ export default function SalesOrderDetail() {
 | 
			
		||||
    duplicateOrderId: order.pk
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  const duplicateSalesOrderInitialData = useMemo(() => {
 | 
			
		||||
    const data = { ...order };
 | 
			
		||||
    // if we set the reference to null/undefined, it will be left blank in the form
 | 
			
		||||
    // if we omit the reference altogether, it will be auto-generated via reference pattern
 | 
			
		||||
    // from the OPTIONS response
 | 
			
		||||
    delete data.reference;
 | 
			
		||||
    return data;
 | 
			
		||||
  }, [order]);
 | 
			
		||||
 | 
			
		||||
  const duplicateSalesOrder = useCreateApiFormModal({
 | 
			
		||||
    url: ApiEndpoints.sales_order_list,
 | 
			
		||||
    title: t`Add Sales Order`,
 | 
			
		||||
    fields: duplicateOrderFields,
 | 
			
		||||
    initialData: {
 | 
			
		||||
      ...order,
 | 
			
		||||
      reference: undefined
 | 
			
		||||
    },
 | 
			
		||||
    initialData: duplicateSalesOrderInitialData,
 | 
			
		||||
    follow: true,
 | 
			
		||||
    modelType: ModelType.salesorder
 | 
			
		||||
  });
 | 
			
		||||
 
 | 
			
		||||
@@ -1,3 +1,4 @@
 | 
			
		||||
import { expect } from '@playwright/test';
 | 
			
		||||
import { test } from '../baseFixtures.ts';
 | 
			
		||||
import {
 | 
			
		||||
  clearTableFilters,
 | 
			
		||||
@@ -325,3 +326,22 @@ test('Build Order - Filters', async ({ page }) => {
 | 
			
		||||
  await page.getByText('On Hold').first().waitFor();
 | 
			
		||||
  await page.getByText('Pending Approval').first().waitFor();
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
test('Build Order - Duplicate', async ({ page }) => {
 | 
			
		||||
  await doQuickLogin(page);
 | 
			
		||||
 | 
			
		||||
  await navigate(page, 'manufacturing/build-order/24/details');
 | 
			
		||||
  await page.getByLabel('action-menu-build-order-').click();
 | 
			
		||||
  await page.getByLabel('action-menu-build-order-actions-duplicate').click();
 | 
			
		||||
 | 
			
		||||
  // Ensure a new reference is suggested
 | 
			
		||||
  await expect(page.getByLabel('text-field-reference')).not.toBeEmpty();
 | 
			
		||||
 | 
			
		||||
  // Submit the duplicate request and ensure it completes
 | 
			
		||||
  await page.getByRole('button', { name: 'Submit' }).isEnabled();
 | 
			
		||||
  await page.getByRole('button', { name: 'Submit' }).click();
 | 
			
		||||
  await page.getByRole('tab', { name: 'Build Details' }).waitFor();
 | 
			
		||||
  await page.getByRole('tab', { name: 'Build Details' }).click();
 | 
			
		||||
 | 
			
		||||
  await page.getByText('Pending').first().waitFor();
 | 
			
		||||
});
 | 
			
		||||
 
 | 
			
		||||
@@ -1,3 +1,4 @@
 | 
			
		||||
import { expect } from '@playwright/test';
 | 
			
		||||
import { test } from '../baseFixtures.ts';
 | 
			
		||||
import {
 | 
			
		||||
  clearTableFilters,
 | 
			
		||||
@@ -321,3 +322,22 @@ test('Purchase Orders - Receive Items', async ({ page }) => {
 | 
			
		||||
  await page.getByRole('cell', { name: 'my-batch-code' }).first().waitFor();
 | 
			
		||||
  await page.getByRole('cell', { name: 'bucket' }).first().waitFor();
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
test('Purchase Orders - Duplicate', async ({ page }) => {
 | 
			
		||||
  await doQuickLogin(page);
 | 
			
		||||
 | 
			
		||||
  await navigate(page, 'purchasing/purchase-order/13/detail');
 | 
			
		||||
  await page.getByLabel('action-menu-order-actions').click();
 | 
			
		||||
  await page.getByLabel('action-menu-order-actions-duplicate').click();
 | 
			
		||||
 | 
			
		||||
  // Ensure a new reference is suggested
 | 
			
		||||
  await expect(page.getByLabel('text-field-reference')).not.toBeEmpty();
 | 
			
		||||
 | 
			
		||||
  // Submit the duplicate request and ensure it completes
 | 
			
		||||
  await page.getByRole('button', { name: 'Submit' }).isEnabled();
 | 
			
		||||
  await page.getByRole('button', { name: 'Submit' }).click();
 | 
			
		||||
  await page.getByRole('tab', { name: 'Order Details' }).waitFor();
 | 
			
		||||
  await page.getByRole('tab', { name: 'Order Details' }).click();
 | 
			
		||||
 | 
			
		||||
  await page.getByText('Pending').first().waitFor();
 | 
			
		||||
});
 | 
			
		||||
 
 | 
			
		||||
@@ -1,3 +1,4 @@
 | 
			
		||||
import { expect } from '@playwright/test';
 | 
			
		||||
import { test } from '../baseFixtures.ts';
 | 
			
		||||
import {
 | 
			
		||||
  clearTableFilters,
 | 
			
		||||
@@ -199,3 +200,22 @@ test('Sales Orders - Shipments', async ({ page }) => {
 | 
			
		||||
    .first()
 | 
			
		||||
    .click();
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
test('Sales Orders - Duplicate', async ({ page }) => {
 | 
			
		||||
  await doQuickLogin(page);
 | 
			
		||||
 | 
			
		||||
  await navigate(page, 'sales/sales-order/11/detail');
 | 
			
		||||
  await page.getByLabel('action-menu-order-actions').click();
 | 
			
		||||
  await page.getByLabel('action-menu-order-actions-duplicate').click();
 | 
			
		||||
 | 
			
		||||
  // Ensure a new reference is suggested
 | 
			
		||||
  await expect(page.getByLabel('text-field-reference')).not.toBeEmpty();
 | 
			
		||||
 | 
			
		||||
  // Submit the duplicate request and ensure it completes
 | 
			
		||||
  await page.getByRole('button', { name: 'Submit' }).isEnabled();
 | 
			
		||||
  await page.getByRole('button', { name: 'Submit' }).click();
 | 
			
		||||
  await page.getByRole('tab', { name: 'Order Details' }).waitFor();
 | 
			
		||||
  await page.getByRole('tab', { name: 'Order Details' }).click();
 | 
			
		||||
 | 
			
		||||
  await page.getByText('Pending').first().waitFor();
 | 
			
		||||
});
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user